Detection rules › Sublime MQL

BEC/Fraud: Generic scam attempt to undisclosed recipients

Severity
low
Type
rule
Source
github.com/sublime-security/sublime-rules

Detects potential generic scams by analyzing text within the email body and other suspicious signals.

Threat classification

Sublime's own taxonomy (not MITRE ATT&CK).

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesSocial engineering

Event coverage

Rule body MQL

type.inbound

// undisclosed recipients
and any([recipients.to, recipients.bcc, recipients.cc],
        any(., .display_name =~ "Undisclosed recipients")
)

// mismatched sender (from) and Reply-to
and any(headers.reply_to,
        length(headers.reply_to) > 0
        and all(headers.reply_to,
                .email.domain.root_domain != sender.email.domain.root_domain
        )
)

// generic recipient
and any(ml.nlu_classifier(body.current_thread.text).entities,
        .name == "recipient" and regex.icontains(.text, "(sir|madam)")
)

// request made
and any(ml.nlu_classifier(body.current_thread.text).entities,
        .name == "request"
)

// not a bec scam
and all(ml.nlu_classifier(body.current_thread.text).intents, .name != "bec")

// negate highly trusted sender domains unless they fail DMARC authentication
and (
  (
    sender.email.domain.root_domain in $high_trust_sender_root_domains
    and not headers.auth_summary.dmarc.pass
  )
  or sender.email.domain.root_domain not in $high_trust_sender_root_domains
)

Detection logic

Scope: inbound message.

Detects potential generic scams by analyzing text within the email body and other suspicious signals.

  1. inbound message
  2. any of [recipients.to, recipients.bcc, recipients.cc] where:
    • any of . where:
      • .display_name is 'Undisclosed recipients'
  3. any of headers.reply_to where all hold:
    • length(headers.reply_to) > 0
    • all of headers.reply_to where:
      • .email.domain.root_domain is not sender.email.domain.root_domain
  4. any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
    • .name is 'recipient'
    • .text matches '(sir|madam)'
  5. any of ml.nlu_classifier(body.current_thread.text).entities where:
    • .name is 'request'
  6. all of ml.nlu_classifier(body.current_thread.text).intents where:
    • .name is not 'bec'
  7. any of:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • not:
        • headers.auth_summary.dmarc.pass
    • sender.email.domain.root_domain not in $high_trust_sender_root_domains

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.reply_to, headers.reply_to[].email.domain.root_domain, recipients.bcc, recipients.cc, recipients.to, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains. Reference lists: $high_trust_sender_root_domains.

Indicators matched (4)

FieldMatchValue
[recipients.to, recipients.bcc, recipients.cc][][].display_nameequalsUndisclosed recipients
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsrecipient
regex.icontainsregex(sir|madam)
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsrequest