Detection rules › Sublime MQL
Link: Display text matches subject line
Message with short body text contains a single link where the display text matches the subject line. The link is deceptive and the recipient patterns are unusual, such as the recipient's address appearing in the body or undisclosed recipients being used.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Credential Phishing |
| Tactics and techniques | Social engineering, Evasion |
Event coverage
Rule body MQL
type.inbound
// short body
and length(body.current_thread.text) < 1500
// suspicious recipient patterns
and (
// recipient email is contained within the body
(
length(recipients.to) == 1
and all(recipients.to,
strings.icontains(body.current_thread.text, .email.email)
)
)
// the sender is the recipient
or sender.email.email in map(recipients.to, .email.email)
// none of the recipients are valid (generally undisclosed recipients)
or not all(recipients.to, .email.domain.valid)
)
// few overall links
and length(body.links) < 10
// none of the links are unsubscribe links
and not any(body.links,
strings.icontains(.display_text, 'unsub')
or strings.icontains(.href_url.url, 'unsub')
or strings.icontains(.display_text, 'optout')
or strings.icontains(.href_url.url, 'optout')
or strings.icontains(.display_text, 'subscription')
// google confidential email use the subject as a link
or .href_url.domain.domain == "confidential-mail.google.com"
)
// even fewer links which are
and 0 < length(filter(body.links,
// not related to the sender domain
.href_url.domain.root_domain != sender.email.domain.root_domain
// not related to the recipient domain
and not any(recipients.to,
.email.domain.root_domain == ..href_url.domain.root_domain
)
// filter out links common in signatures
and not .href_url.domain.root_domain in (
"facebook.com",
"instagram.com",
'twitter.com',
'x.com'
)
// do not contain a display_text (TP samples have the display_text of the subject)
// // this removes domains found in signatures
and .display_text is not null
// not the aka.ms in warning banners
and not .href_url.domain.domain == "aka.ms"
)
) <= 3
// exactly one link with display text that matches the subject
and length(filter(body.links, subject.subject =~ .display_text)) == 1
and (
// the link with the display_text of the subject
any(filter(body.links, subject.subject =~ .display_text),
// when visited is phishing
ml.link_analysis(.).credphish.disposition == "phishing"
or ml.link_analysis(.).final_dom.display_text == "Verify you are human"
or .href_url.domain.root_domain in $self_service_creation_platform_domains
or .href_url.domain.domain in $self_service_creation_platform_domains
or .href_url.domain.domain in $url_shorteners
)
// or the body is cred_theft
or any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "cred_theft"
)
)
// the display text of a link is the subject
and subject.subject in map(body.links, .display_text)
// exclude common in signup links/password resets which are observed in links all the time
and not (
strings.icontains(subject.subject, 'confirm')
or strings.icontains(subject.subject, 'activate')
or strings.icontains(subject.subject, 'reset')
or strings.icontains(subject.subject, 'unlock')
or strings.icontains(subject.subject, 'login')
or strings.icontains(subject.subject, 'log in')
)
Detection logic
Scope: inbound message.
Message with short body text contains a single link where the display text matches the subject line. The link is deceptive and the recipient patterns are unusual, such as the recipient's address appearing in the body or undisclosed recipients being used.
- inbound message
- length(body.current_thread.text) < 1500
any of:
all of:
- length(recipients.to) is 1
all of
recipients.towhere:- strings.icontains(body.current_thread.text)
- sender.email.email in map(recipients.to, .email.email)
not:
all of
recipients.towhere:- .email.domain.valid
- length(body.links) < 10
not:
any of
body.linkswhere any holds:- .display_text contains 'unsub'
- .href_url.url contains 'unsub'
- .display_text contains 'optout'
- .href_url.url contains 'optout'
- .display_text contains 'subscription'
- .href_url.domain.domain is 'confidential-mail.google.com'
all of:
- length(filter(body.links, .href_url.domain.root_domain != sender.email.domain.root_domain and not any(recipients.to, .email.domain.root_domain == ..href_url.domain.root_domain) and not .href_url.domain.root_domain in ('facebook.com', 'instagram.com', 'twitter.com', 'x.com') and .display_text is not null and not .href_url.domain.domain == 'aka.ms')) > 0
- length(filter(body.links, .href_url.domain.root_domain != sender.email.domain.root_domain and not any(recipients.to, .email.domain.root_domain == ..href_url.domain.root_domain) and not .href_url.domain.root_domain in ('facebook.com', 'instagram.com', 'twitter.com', 'x.com') and .display_text is not null and not .href_url.domain.domain == 'aka.ms')) ≤ 3
- length(filter(body.links, subject.subject =~ .display_text)) is 1
any of:
any of
filter(body.links)where any holds:- ml.link_analysis(.).credphish.disposition is 'phishing'
- ml.link_analysis(.).final_dom.display_text is 'Verify you are human'
- .href_url.domain.root_domain in $self_service_creation_platform_domains
- .href_url.domain.domain in $self_service_creation_platform_domains
- .href_url.domain.domain in $url_shorteners
any of
ml.nlu_classifier(body.current_thread.text).intentswhere:- .name is 'cred_theft'
- subject.subject in map(body.links, .display_text)
none of:
- subject.subject contains 'confirm'
- subject.subject contains 'activate'
- subject.subject contains 'reset'
- subject.subject contains 'unlock'
- subject.subject contains 'login'
- subject.subject contains 'log in'
Inspects: body.current_thread.text, body.links, body.links[].display_text, body.links[].href_url.domain.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.url, recipients.to, recipients.to[].email.domain.root_domain, recipients.to[].email.domain.valid, recipients.to[].email.email, sender.email.domain.root_domain, sender.email.email, subject.subject, type.inbound. Sensors: ml.link_analysis, ml.nlu_classifier, strings.icontains. Reference lists: $self_service_creation_platform_domains, $url_shorteners.
Indicators matched (16)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | unsub |
strings.icontains | substring | optout |
strings.icontains | substring | subscription |
body.links[].href_url.domain.domain | equals | confidential-mail.google.com |
body.links[].href_url.domain.root_domain | member | facebook.com |
body.links[].href_url.domain.root_domain | member | instagram.com |
body.links[].href_url.domain.root_domain | member | twitter.com |
body.links[].href_url.domain.root_domain | member | x.com |
body.links[].href_url.domain.domain | equals | aka.ms |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
strings.icontains | substring | confirm |
strings.icontains | substring | activate |
4 more
strings.icontains | substring | reset |
strings.icontains | substring | unlock |
strings.icontains | substring | login |
strings.icontains | substring | log in |