Detection rules › Sublime MQL
Brand impersonation: MetaMask
Detects inbound messages containing links where the sender impersonates MetaMask through display name manipulation and includes the MetaMask logo or suspicious language, while not being from legitimate MetaMask domains. The rule checks for credential theft patterns and validates sender authentication.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Event coverage
| Message attribute |
|---|
| body |
| body.current_thread |
| headers.auth_summary |
| sender |
| sender.email |
| type |
Rule body MQL
type.inbound
and length(body.links) > 0
and (
regex.icontains(strings.replace_confusables(sender.display_name),
'\bmetamask\b',
'\bmetamask\.io\b'
)
or strings.contains(strings.replace_confusables(sender.display_name),
"METAMASK"
)
or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
'metamask'
) <= 2
)
and (
any(ml.logo_detect(file.message_screenshot()).brands, .name == "MetaMask")
or any(ml.nlu_classifier(body.current_thread.text).intents,
.name in ("cred_theft", "callback_scam", "steal_pii")
and .confidence in ("high")
)
)
and sender.email.domain.root_domain not in~ ('metamask.io')
// 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
)
and not profile.by_sender().any_messages_benign
Detection logic
Scope: inbound message.
Detects inbound messages containing links where the sender impersonates MetaMask through display name manipulation and includes the MetaMask logo or suspicious language, while not being from legitimate MetaMask domains. The rule checks for credential theft patterns and validates sender authentication.
- inbound message
- length(body.links) > 0
any of:
strings.replace_confusables(sender.display_name) matches any of 2 patterns
\bmetamask\b\bmetamask\.io\b
- strings.replace_confusables(sender.display_name) contains 'METAMASK'
- strings.replace_confusables(sender.display_name) is similar to 'metamask'
any of:
any of
ml.logo_detect(file.message_screenshot()).brandswhere:- .name is 'MetaMask'
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name in ('cred_theft', 'callback_scam', 'steal_pii')
- .confidence in ('high')
- sender.email.domain.root_domain not in ('metamask.io')
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().any_messages_benign
Inspects: body.current_thread.text, body.links, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, regex.icontains, strings.contains, strings.ilevenshtein, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains.
Indicators matched (10)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | \bmetamask\b |
regex.icontains | regex | \bmetamask\.io\b |
strings.contains | substring | METAMASK |
strings.ilevenshtein | fuzzy | metamask |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | MetaMask |
ml.nlu_classifier(body.current_thread.text).intents[].name | member | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].name | member | callback_scam |
ml.nlu_classifier(body.current_thread.text).intents[].name | member | steal_pii |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | member | high |
sender.email.domain.root_domain | member | metamask.io |