Detection rules › Sublime MQL
Brand impersonation: Vanguard
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).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Callback Phishing, Credential Phishing, Extortion, Malware/Ransomware, Spam |
| Tactics and techniques | Impersonation: Brand |
Event coverage
| Message attribute |
|---|
| body.current_thread |
| headers.auth_summary |
| sender |
| sender.email |
| type |
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.
- inbound message
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*'
all of:
any of:
any of
beta.ml_topic(body.current_thread.text).topicswhere 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).topicswhere 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).intentswhere all hold:- .name is 'cred_theft'
- .confidence is 'high'
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intentswhere all hold:- .name is 'cred_theft'
- .confidence is 'high'
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'
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
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)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *vanguard* |
strings.ilevenshtein | fuzzy | vanguard |
beta.ml_topic(body.current_thread.text).topics[].name | member | Security and Authentication |
beta.ml_topic(body.current_thread.text).topics[].name | member | Secure Message |
beta.ml_topic(body.current_thread.text).topics[].name | member | Financial Communications |
beta.ml_topic(body.current_thread.text).topics[].confidence | equals | high |
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics[].name | member | Security and Authentication |
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics[].name | member | Secure Message |
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics[].name | member | Financial Communications |
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics[].confidence | equals | high |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | equals | high |
20 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].name | equals | cred_theft |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].confidence | equals | high |
sender.email.domain.root_domain | member | vanguard.com |
sender.email.domain.root_domain | member | vanguardcharitable.org |
sender.email.domain.root_domain | member | vanguardmexico.com |
sender.email.domain.root_domain | member | vanguardcanada.ca |
sender.email.domain.root_domain | member | vanguard.co.uk |
sender.email.domain.root_domain | member | vanguard.com.au |
sender.email.domain.root_domain | member | vanguard.com.hk |
sender.email.domain.root_domain | member | vanguardinvestor.co.uk |
sender.email.domain.root_domain | member | vanguardretirement-mail.com |
sender.email.domain.root_domain | member | e-vanguard.com |
sender.email.domain.root_domain | member | e-vanguardcharitable.org |
sender.email.domain.root_domain | member | feedback-vanguard.com |
sender.email.domain.root_domain | member | m-vanguard.com |
sender.email.domain.root_domain | member | investordelivery.com |
sender.email.domain.root_domain | member | retsupport.com |
sender.email.domain.root_domain | member | vanguardretirement.com |
sender.display_name | equals | Vanguard Visa Law |
sender.email.domain.root_domain | equals | docketwise.com |