Detection rules › Sublime MQL

Brand impersonation: Vanguard

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

Detects inbound messages from senders using Vanguard-like display names or domains, excluding legitimate Vanguard domains and authenticated communications. Additional checks ensure the sender is not from trusted organizational domains or high-trust sender domains with proper authentication.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Callback Phishing, Credential Phishing, Extortion, Malware/Ransomware, Spam
Tactics and techniquesImpersonation: Brand

Event coverage

Rule body MQL

type.inbound
and (
  // display name contains Vanguard
  (
    strings.ilike(strings.replace_confusables(sender.display_name),
                  '*vanguard*'
    )
    // levenshtein distance similar to Vanguard
    or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                            'vanguard'
    ) <= 1
    // sender domain contains Vanguard
    or strings.ilike(strings.replace_confusables(sender.email.domain.domain),
                     '*vanguard*'
    )
  )
)
and (
  (
    any(beta.ml_topic(body.current_thread.text).topics,
        .name in (
          "Security and Authentication",
          "Secure Message",
          "Financial Communications"
        )
        and .confidence == "high"
    )
    or any(beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics,
           .name in (
             "Security and Authentication",
             "Secure Message",
             "Financial Communications"
           )
           and .confidence == "high"
    )
  )
  and (
    any(ml.nlu_classifier(body.current_thread.text).intents,
        .name == "cred_theft" and .confidence == "high"
    )
    or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,
           .name == "cred_theft" and .confidence == "high"
    )
  )
)

// and the sender is not in org_domains or from Vanguard domains and passes auth
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    sender.email.domain.root_domain in (
      "vanguard.com",
      "vanguardcharitable.org", // philanthropic giving arm
      "vanguardmexico.com",
      "vanguardcanada.ca",
      "vanguard.co.uk",
      "vanguard.com.au",
      "vanguard.com.hk",
      "vanguardinvestor.co.uk",
      "vanguardretirement-mail.com",
      "e-vanguard.com",
      "e-vanguardcharitable.org",
      "feedback-vanguard.com",
      "m-vanguard.com",
      "investordelivery.com",
      "retsupport.com",
      "vanguardretirement.com"
    )
    and headers.auth_summary.dmarc.pass
  )
  or (
    sender.display_name == "Vanguard Visa Law"
    and sender.email.domain.root_domain == "docketwise.com"
  )
)
// and the sender is not from high trust sender root domains
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
)
and not profile.by_sender().solicited

Detection logic

Scope: inbound message.

Detects inbound messages from senders using Vanguard-like display names or domains, excluding legitimate Vanguard domains and authenticated communications. Additional checks ensure the sender is not from trusted organizational domains or high-trust sender domains with proper authentication.

  1. inbound message
  2. any of:
    • strings.replace_confusables(sender.display_name) matches '*vanguard*'
    • strings.replace_confusables(sender.display_name) is similar to 'vanguard'
    • strings.replace_confusables(sender.email.domain.domain) matches '*vanguard*'
  3. all of:
    • any of:
      • any of beta.ml_topic(body.current_thread.text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Financial Communications')
        • .confidence is 'high'
      • any of beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Financial Communications')
        • .confidence is 'high'
    • any of:
      • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
        • .name is 'cred_theft'
        • .confidence is 'high'
      • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents where all hold:
        • .name is 'cred_theft'
        • .confidence is 'high'
  4. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • sender.email.domain.root_domain in ('vanguard.com', 'vanguardcharitable.org', 'vanguardmexico.com', 'vanguardcanada.ca', 'vanguard.co.uk', 'vanguard.com.au', 'vanguard.com.hk', 'vanguardinvestor.co.uk', 'vanguardretirement-mail.com', 'e-vanguard.com', 'e-vanguardcharitable.org', 'feedback-vanguard.com', 'm-vanguard.com', 'investordelivery.com', 'retsupport.com', 'vanguardretirement.com')
      • headers.auth_summary.dmarc.pass
    • all of:
      • sender.display_name is 'Vanguard Visa Law'
      • sender.email.domain.root_domain is 'docketwise.com'
  5. 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
  6. not:
    • profile.by_sender().solicited

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: beta.ml_topic, beta.ocr, file.message_screenshot, ml.nlu_classifier, profile.by_sender, strings.ilevenshtein, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (32)

FieldMatchValue
strings.ilikesubstring*vanguard*
strings.ilevenshteinfuzzyvanguard
beta.ml_topic(body.current_thread.text).topics[].namememberSecurity and Authentication
beta.ml_topic(body.current_thread.text).topics[].namememberSecure Message
beta.ml_topic(body.current_thread.text).topics[].namememberFinancial Communications
beta.ml_topic(body.current_thread.text).topics[].confidenceequalshigh
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics[].namememberSecurity and Authentication
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics[].namememberSecure Message
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics[].namememberFinancial Communications
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics[].confidenceequalshigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
20 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].nameequalscred_theft
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].confidenceequalshigh
sender.email.domain.root_domainmembervanguard.com
sender.email.domain.root_domainmembervanguardcharitable.org
sender.email.domain.root_domainmembervanguardmexico.com
sender.email.domain.root_domainmembervanguardcanada.ca
sender.email.domain.root_domainmembervanguard.co.uk
sender.email.domain.root_domainmembervanguard.com.au
sender.email.domain.root_domainmembervanguard.com.hk
sender.email.domain.root_domainmembervanguardinvestor.co.uk
sender.email.domain.root_domainmembervanguardretirement-mail.com
sender.email.domain.root_domainmembere-vanguard.com
sender.email.domain.root_domainmembere-vanguardcharitable.org
sender.email.domain.root_domainmemberfeedback-vanguard.com
sender.email.domain.root_domainmemberm-vanguard.com
sender.email.domain.root_domainmemberinvestordelivery.com
sender.email.domain.root_domainmemberretsupport.com
sender.email.domain.root_domainmembervanguardretirement.com
sender.display_nameequalsVanguard Visa Law
sender.email.domain.root_domainequalsdocketwise.com