Detection rules › Sublime MQL

VIP / Executive impersonation (strict match, untrusted)

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

Sender display name matches the display name of a user in the $org_vips list, and the sender has never been seen before. The $org_vips list must first be manually connected to a VIP group of your upstream provider (Google Workspace and Microsoft 365 only) in order for this rule to work. Once connected, the list will be automatically synced and kept up-to-date. For more information, see the $org_vips documentation: https://docs.sublimesecurity.com/docs/configure-org_vips-list This rule is recommended to be used on a relatively small list of VIPs, and is meant to reduce attack surface by detecting any message that matches the protected list of display names from a first-time or unsolicited sender. Additional rule logic can be added to look for suspicious subjects, suspicious links, etc.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesImpersonation: VIP

Event coverage

Rule body MQL

type.inbound
and (
  // the display name matches a name on the orgs vip list
  any($org_vips, .display_name =~ sender.display_name)
  // or the display name starts with the name on the orgs vip list
  or (
    any($org_vips,
        strings.istarts_with(sender.display_name, .display_name)
        // and it is longer than just their name (eg. John Doe CEO)
        and length(sender.display_name) > length(.display_name)
    )
    // and we have confidence it's BEC
    and any(ml.nlu_classifier(body.current_thread.text).intents,
            .name == "bec" and .confidence == "high"
    )
  )
)
and (
  // ignore personal <> work emails
  // where the sender and mailbox's display name are the same
  length(recipients.to) > 0
  or length(recipients.cc) > 0
  or sender.display_name != mailbox.display_name
)
// bounce-back negations
and not strings.like(sender.email.local_part,
                     "*postmaster*",
                     "*mailer-daemon*",
                     "*administrator*"
)
and not any(attachments,
            .content_type in (
              "message/rfc822",
              "message/delivery-status",
              "text/calendar"
            )
)
and (
  (
    profile.by_sender_email().prevalence in ("new", "outlier")
    and not profile.by_sender_email().solicited
  )
  or (
    profile.by_sender_email().any_messages_malicious_or_spam
    and not profile.by_sender_email().any_messages_benign
  )
  // mismatched reply-to with unsoliticed reply-to address
  or (
    length(headers.reply_to) > 0
    and (sender.email.email not in map(headers.reply_to, .email.email))
    // negate reply-to addresses that are within the org domain
    and not all(headers.reply_to,
                .email.domain.domain in $org_domains
                or .email.domain.root_domain in $org_domains
    )
    //
    // This rule makes use of a beta feature and is subject to change without notice
    // using the beta feature in custom rules is not suggested until it has been formally released
    //
    and not beta.profile.by_reply_to().solicited
    and beta.profile.by_reply_to().prevalence != "common"
  )
)
and (
  (
    sender.email.domain.root_domain in $org_domains
    and not headers.auth_summary.dmarc.pass
  )
  or sender.email.domain.root_domain not in $org_domains
)
and not profile.by_sender_email().any_messages_benign

Detection logic

Scope: inbound message.

Sender display name matches the display name of a user in the $org_vips list, and the sender has never been seen before. The $org_vips list must first be manually connected to a VIP group of your upstream provider (Google Workspace and Microsoft 365 only) in order for this rule to work. Once connected, the list will be automatically synced and kept up-to-date. For more information, see the $org_vips documentation: https://docs.sublimesecurity.com/docs/configure-org_vips-list This rule is recommended to be used on a relatively small list of VIPs, and is meant to reduce attack surface by detecting any message that matches the protected list of display names from a first-time or unsolicited sender. Additional rule logic can be added to look for suspicious subjects, suspicious links, etc.

  1. inbound message
  2. any of:
    • any of $org_vips where:
      • .display_name is sender.display_name
    • all of:
      • any of $org_vips where all hold:
        • strings.istarts_with(sender.display_name)
        • length(sender.display_name) > length(.display_name)
      • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
        • .name is 'bec'
        • .confidence is 'high'
  3. any of:
    • length(recipients.to) > 0
    • length(recipients.cc) > 0
    • sender.display_name is not mailbox.display_name
  4. not:
    • sender.email.local_part matches any of 3 patterns
      • *postmaster*
      • *mailer-daemon*
      • *administrator*
  5. not:
    • any of attachments where:
      • .content_type in ('message/rfc822', 'message/delivery-status', 'text/calendar')
  6. any of:
    • all of:
      • profile.by_sender_email().prevalence in ('new', 'outlier')
      • not:
        • profile.by_sender_email().solicited
    • all of:
      • profile.by_sender_email().any_messages_malicious_or_spam
      • not:
        • profile.by_sender_email().any_messages_benign
    • all of:
      • length(headers.reply_to) > 0
      • sender.email.email not in map(headers.reply_to, .email.email)
      • not:
        • all of headers.reply_to where any holds:
          • .email.domain.domain in $org_domains
          • .email.domain.root_domain in $org_domains
      • not:
        • beta.profile.by_reply_to().solicited
      • beta.profile.by_reply_to().prevalence is not 'common'
  7. any of:
    • all of:
      • sender.email.domain.root_domain in $org_domains
      • not:
        • headers.auth_summary.dmarc.pass
    • sender.email.domain.root_domain not in $org_domains
  8. not:
    • profile.by_sender_email().any_messages_benign

Inspects: attachments[].content_type, body.current_thread.text, headers.auth_summary.dmarc.pass, headers.reply_to, headers.reply_to[].email.domain.domain, headers.reply_to[].email.domain.root_domain, headers.reply_to[].email.email, mailbox.display_name, recipients.cc, recipients.to, sender.display_name, sender.email.domain.root_domain, sender.email.email, sender.email.local_part, type.inbound. Sensors: beta.profile.by_reply_to, ml.nlu_classifier, profile.by_sender_email, strings.istarts_with, strings.like. Reference lists: $org_domains, $org_vips.

Indicators matched (8)

FieldMatchValue
ml.nlu_classifier(body.current_thread.text).intents[].nameequalsbec
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
strings.likesubstring*postmaster*
strings.likesubstring*mailer-daemon*
strings.likesubstring*administrator*
attachments[].content_typemembermessage/rfc822
attachments[].content_typemembermessage/delivery-status
attachments[].content_typemembertext/calendar