Detection rules › Sublime MQL
Sublime MQL rules: brand
Body: PayApp transaction reference pattern
#Detects messages containing PayApp transaction reference numbers in a specific format (PayApp# followed by digits) in either the message body or subject line.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, BEC/Fraud |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and regex.icontains(body.current_thread.text, 'PayApp\s?#\d+')
and regex.icontains(body.current_thread.text, '[a-z0-9\.\+\-]+@[a-z0-9\-]+\.')
and strings.icontains(subject.base, "payapp")
Detection logic
Scope: inbound message.
Detects messages containing PayApp transaction reference numbers in a specific format (PayApp# followed by digits) in either the message body or subject line.
- inbound message
- body.current_thread.text matches 'PayApp\\s?#\\d+'
- body.current_thread.text matches '[a-z0-9\\.\\+\\-]+@[a-z0-9\\-]+\\.'
- subject.base contains 'payapp'
Inspects: body.current_thread.text, subject.base, type.inbound. Sensors: regex.icontains, strings.icontains.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | PayApp\s?#\d+ |
regex.icontains | regex | [a-z0-9\.\+\-]+@[a-z0-9\-]+\. |
strings.icontains | substring | payapp |
Stages and Predicates
Stage 1: mql_rule
and
body.current_thread.text regex_match "PayApp\\s?#\\d+"
body.current_thread.text regex_match "[a-z0-9\\.\\+\\-]+@[a-z0-9\\-]+\\."
subject.base contains "payapp"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
subject.base | contains |
| field:"subject.base" kind:contains value:"payapp" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: AARP
#Detects messages impersonating AARP by analyzing sender display name and body content for AARP references, address information, or survey-related language from unauthorized senders.
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 |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
(
strings.icontains(sender.display_name, "AARP")
and any(ml.nlu_classifier(body.current_thread.text).entities,
.name in ("request", "financial")
and regex.icontains(.text, "(?:gift|win|free|renewal)")
)
)
or 2 of (
strings.icontains(body.current_thread.text, 'AARP'),
strings.icontains(body.current_thread.text, '601 E Street NW'),
strings.icontains(body.current_thread.text, 'Washington, DC 20049')
)
or (
strings.icontains(body.current_thread.text, 'AARP')
and (
regex.icontains(body.current_thread.text,
'quick .{0,10}survey',
'\bAAR-[A-Za-z0-9]{5,10}-[A-Za-z0-9]{3,8}' // member number regex
)
or strings.icontains(body.current_thread.text,
"last attempt",
"renewal is complete",
"select membership item"
)
)
)
//
// 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
//
or (
strings.icontains(beta.ocr(file.message_screenshot()).text, "AARP")
and strings.icontains(beta.ocr(file.message_screenshot()).text,
"join or renew now"
)
and strings.icontains(beta.ocr(file.message_screenshot()).text,
"to opt out"
)
)
)
// negate job postings related to AARP and newsletters containing AARP
and not any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Professional and Career Development",
"Newsletters and Digests"
)
and .confidence == "high"
)
// and the sender is not in org_domains or from AARP domains and passes auth
and not (
sender.email.domain.root_domain in $org_domains
or (
sender.email.domain.root_domain in (
"aarp.org",
"proofpointessentials.com",
"expedia.com",
"eventbrite.com",
"zixcorp.com"
)
and headers.auth_summary.dmarc.pass
)
)
Detection logic
Scope: inbound message.
Detects messages impersonating AARP by analyzing sender display name and body content for AARP references, address information, or survey-related language from unauthorized senders.
- inbound message
any of:
all of:
- sender.display_name contains 'AARP'
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name in ('request', 'financial')
- .text matches '(?:gift|win|free|renewal)'
at least 2 of:
- body.current_thread.text contains 'AARP'
- body.current_thread.text contains '601 E Street NW'
- body.current_thread.text contains 'Washington, DC 20049'
all of:
- body.current_thread.text contains 'AARP'
any of:
body.current_thread.text matches any of 2 patterns
quick .{0,10}survey\bAAR-[A-Za-z0-9]{5,10}-[A-Za-z0-9]{3,8}
body.current_thread.text contains any of 3 patterns
last attemptrenewal is completeselect membership item
all of:
- beta.ocr(file.message_screenshot()).text contains 'AARP'
- beta.ocr(file.message_screenshot()).text contains 'join or renew now'
- beta.ocr(file.message_screenshot()).text contains 'to opt out'
not:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Professional and Career Development', 'Newsletters and Digests')
- .confidence is 'high'
none of:
- sender.email.domain.root_domain in $org_domains
all of:
- sender.email.domain.root_domain in ('aarp.org', 'proofpointessentials.com', 'expedia.com', 'eventbrite.com', 'zixcorp.com')
- headers.auth_summary.dmarc.pass
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.nlu_classifier, regex.icontains, strings.icontains. Reference lists: $org_domains.
Indicators matched (13)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | AARP |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | request |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | financial |
regex.icontains | regex | (?:gift|win|free|renewal) |
strings.icontains | substring | 601 E Street NW |
strings.icontains | substring | Washington, DC 20049 |
regex.icontains | regex | quick .{0,10}survey |
regex.icontains | regex | \bAAR-[A-Za-z0-9]{5,10}-[A-Za-z0-9]{3,8} |
strings.icontains | substring | last attempt |
strings.icontains | substring | renewal is complete |
strings.icontains | substring | select membership item |
strings.icontains | substring | join or renew now |
1 more
strings.icontains | substring | to opt out |
Stages and Predicates
Stage 1: mql_rule
and
or
and
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name in ["financial", "request"]
ml.nlu_classifier(body.current_thread.text).entities.text regex_match "(?:gift|win|free|renewal)"
sender.display_name contains "AARP"
and
or
body.current_thread.text contains "last attempt"
body.current_thread.text contains "renewal is complete"
body.current_thread.text contains "select membership item"
body.current_thread.text regex_match "\\bAAR-[A-Za-z0-9]{5,10}-[A-Za-z0-9]{3,8}"
body.current_thread.text regex_match "quick .{0,10}survey"
body.current_thread.text contains "AARP"
and
beta.ocr(file.message_screenshot()).text contains "AARP"
beta.ocr(file.message_screenshot()).text contains "join or renew now"
beta.ocr(file.message_screenshot()).text contains "to opt out"
body.current_thread.text contains "601 E Street NW"
body.current_thread.text contains "AARP"
body.current_thread.text contains "Washington, DC 20049"
not
or
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["aarp.org", "eventbrite.com", "expedia.com", "proofpointessentials.com", "zixcorp.com"]
macro "sender.email.domain.root_domain in org_domains"
not
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).topics.name in ["Newsletters and Digests", "Professional and Career Development"]
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | aarp.org, eventbrite.com, expedia.com, proofpointessentials.com, zixcorp.com | excludes:sender.email.domain.root_domain |
ml.nlu_classifier(body.current_thread.text).topics | array_any | excludes:ml.nlu_classifier(body.current_thread.text).topics |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
beta.ocr(file.message_screenshot()).text | contains |
| field:"beta.ocr(file.message_screenshot()).text" kind:contains |
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
sender.display_name | contains |
| field:"sender.display_name" kind:contains value:"AARP" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Adobe Acrobat Sign PDF phishing file format template
#Detects specific credential phishing PDF attachments that contain Adobe branding or Adobe Acrobat Sign text along with specific file format indicators, potentially indicating fraudulent documents impersonating legitimate Adobe services.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, PDF |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and any(filter(attachments, .file_type == "pdf"),
(
any(ml.logo_detect(.).brands, .name == "Adobe")
or strings.icontains(beta.ocr(.).text,
'Powered by Adobe Acrobat Sign'
)
or strings.icontains(beta.ocr(.).text, 'Adobe Acrobat Sign')
)
and strings.icontains(beta.ocr(.).text, 'File Format: PDF')
)
Detection logic
Scope: inbound message.
Detects specific credential phishing PDF attachments that contain Adobe branding or Adobe Acrobat Sign text along with specific file format indicators, potentially indicating fraudulent documents impersonating legitimate Adobe services.
- inbound message
any of
filter(attachments)where all hold:any of:
any of
ml.logo_detect(.).brandswhere:- .name is 'Adobe'
- beta.ocr(.).text contains 'Powered by Adobe Acrobat Sign'
- beta.ocr(.).text contains 'Adobe Acrobat Sign'
- beta.ocr(.).text contains 'File Format: PDF'
Inspects: attachments[].file_type, type.inbound. Sensors: beta.ocr, ml.logo_detect, strings.icontains.
Indicators matched (5)
| Field | Match | Value |
|---|---|---|
attachments[].file_type | equals | pdf |
ml.logo_detect(filter(attachments)[]).brands[].name | equals | Adobe |
strings.icontains | substring | Powered by Adobe Acrobat Sign |
strings.icontains | substring | Adobe Acrobat Sign |
strings.icontains | substring | File Format: PDF |
Stages and Predicates
Stage 1: mql_rule
and
any(filter(attachments))
and
or
any(ml.logo_detect(filter(attachments)).brands)
ml.logo_detect(filter(attachments)).brands.name eq "Adobe"
beta.ocr(filter(attachments)[]).text contains "Adobe Acrobat Sign"
beta.ocr(filter(attachments)[]).text contains "Powered by Adobe Acrobat Sign"
beta.ocr(filter(attachments)[]).text contains "File Format: PDF"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Adobe Sign with suspicious indicators
#Detects messages impersonating Adobe Sign that contain Adobe branding elements but are not sent from legitimate Adobe domains and lack proper Adobe Sign authentication headers.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
(
length(filter(attachments, .file_type == "pdf")) == 0
and (
regex.icontains(body.html.raw,
'alt="Adobe(?: Acrobat)? Sign"',
"adobe-sign-logo.{0,20}.png",
'alt="Powered by Adobe Acrobat Sign"'
)
or any(html.xpath(body.html, "//img/@src").nodes,
strings.parse_url(.raw).domain.root_domain == "adobesign.com"
and (
strings.istarts_with(strings.parse_url(.raw).path,
"/cobrand_logo/"
)
or strings.icontains(strings.parse_url(.raw).path,
"checkmarkCircle"
)
)
)
)
)
or (
any(attachments,
.file_type == "pdf"
and any(file.explode(.),
any(.scan.url.urls,
regex.icontains(.url,
'(?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn)'
)
)
)
)
)
)
and not (
// inspect the "oldest" thread, negate where that thread is the original Adobe Sign email (based on link domains)
(
length(body.previous_threads[length(body.previous_threads) - 1].links) > 0
and all(body.previous_threads[length(body.previous_threads) - 1].links,
.href_url.domain.root_domain in (
"aka.ms",
"adobe.com",
"adobesign.com",
"echosign.com",
"adobesignsandbox.com",
"mimecastprotect.com",
"mimecast.com"
)
or .href_url.domain.root_domain in $org_domains
or .href_url.domain.root_domain == sender.email.domain.root_domain
or any(recipients.to,
.email.domain.root_domain == ..href_url.domain.root_domain
)
)
)
// legit review button
or any(body.links,
.display_text in (
"Review and sign",
"the document",
"Open agreement",
"VIEW DOCUMENTS",
"Click here to review and sign"
)
and (
.href_url.domain.root_domain in (
"adobe.com",
"adobesign.com",
"echosign.com",
"adobesignsandbox.com",
)
// Mimecast link logic
or (
.href_url.domain.root_domain in (
"mimecastprotect.com",
"mimecast.com"
)
and any(.href_url.query_params_decoded['domain'],
strings.parse_domain(.).root_domain in (
"adobe.com",
"adobesign.com",
"echosign.com",
"adobesignsandbox.com",
)
)
)
)
)
// accidental recipient
or any(recipients.to, .email.email == "adobesign@adobesign.com")
// known Adobe Sign messaage ID formats
or (
(length(headers.references) > 1 or length(body.previous_threads) != 0)
and regex.imatch(headers.references[0],
'[0-9]{9,10}\.[0-9]{4,6}\.[0-9]{13}@event-consumer-prod-[a-z]-[a-z0-9]{7,10}-[a-z0-9]{5}',
'[0-9]{8,10}\.[0-9]{5,7}\.[0-9]{13}@(webapp|job)-prod-.*$',
'[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-APO-PRODHIPAA@apo-p-h'
)
)
// negate Adobe Sign messages from custom domains
or any(headers.hops,
any(.fields, .name in ("Adobesigneventid", "Agreementid"))
)
)
and not (
sender.email.domain.root_domain in (
"adobe.com",
"adobesign.com",
"adobesignsandbox.com",
"echosign.com",
// ticketing software that embeds emails
"helpscout.net"
)
and headers.auth_summary.dmarc.pass
)
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
)
Detection logic
Scope: inbound message.
Detects messages impersonating Adobe Sign that contain Adobe branding elements but are not sent from legitimate Adobe domains and lack proper Adobe Sign authentication headers.
- inbound message
any of:
all of:
- length(filter(attachments, .file_type == 'pdf')) is 0
any of:
body.html.raw matches any of 3 patterns
alt="Adobe(?: Acrobat)? Sign"adobe-sign-logo.{0,20}.pngalt="Powered by Adobe Acrobat Sign"
any of
html.xpath(body.html, '//img/@src').nodeswhere all hold:- strings.parse_url(.raw).domain.root_domain is 'adobesign.com'
any of:
- strings.parse_url(.raw).path starts with '/cobrand_logo/'
- strings.parse_url(.raw).path contains 'checkmarkCircle'
any of
attachmentswhere all hold:- .file_type is 'pdf'
any of
file.explode(.)where:any of
.scan.url.urlswhere:- .url matches '(?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn)'
none of:
all of:
- length(body.previous_threads[].links) > 0
all of
body.previous_threads[].linkswhere any holds:- .href_url.domain.root_domain in ('aka.ms', 'adobe.com', 'adobesign.com', 'echosign.com', 'adobesignsandbox.com', 'mimecastprotect.com', 'mimecast.com')
- .href_url.domain.root_domain in $org_domains
- .href_url.domain.root_domain is sender.email.domain.root_domain
any of
recipients.towhere:- .email.domain.root_domain is .href_url.domain.root_domain
any of
body.linkswhere all hold:- .display_text in ('Review and sign', 'the document', 'Open agreement', 'VIEW DOCUMENTS', 'Click here to review and sign')
any of:
- .href_url.domain.root_domain in ('adobe.com', 'adobesign.com', 'echosign.com', 'adobesignsandbox.com')
all of:
- .href_url.domain.root_domain in ('mimecastprotect.com', 'mimecast.com')
any of
.href_url.query_params_decoded['domain']where:- strings.parse_domain(.).root_domain in ('adobe.com', 'adobesign.com', 'echosign.com', 'adobesignsandbox.com')
any of
recipients.towhere:- .email.email is 'adobesign@adobesign.com'
all of:
any of:
- length(headers.references) > 1
- length(body.previous_threads) is not 0
headers.references[0] matches any of 3 patterns
[0-9]{9,10}\.[0-9]{4,6}\.[0-9]{13}@event-consumer-prod-[a-z]-[a-z0-9]{7,10}-[a-z0-9]{5}[0-9]{8,10}\.[0-9]{5,7}\.[0-9]{13}@(webapp|job)-prod-.*$[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-APO-PRODHIPAA@apo-p-h
any of
headers.hopswhere:any of
.fieldswhere:- .name in ('Adobesigneventid', 'Agreementid')
not:
all of:
- sender.email.domain.root_domain in ('adobe.com', 'adobesign.com', 'adobesignsandbox.com', 'echosign.com', 'helpscout.net')
- headers.auth_summary.dmarc.pass
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
Inspects: attachments[].file_type, body.html, body.html.raw, body.links, body.links[].display_text, body.links[].href_url.domain.root_domain, body.links[].href_url.query_params_decoded['domain'], body.previous_threads, body.previous_threads[].links, body.previous_threads[].links[].href_url.domain.root_domain, headers.auth_summary.dmarc.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.references, headers.references[0], recipients.to, recipients.to[].email.domain.root_domain, recipients.to[].email.email, sender.email.domain.root_domain, type.inbound. Sensors: file.explode, html.xpath, regex.icontains, regex.imatch, strings.icontains, strings.istarts_with, strings.parse_domain, strings.parse_url. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (7)
| Field | Match | Value |
|---|---|---|
attachments[].file_type | equals | pdf |
regex.icontains | regex | alt="Adobe(?: Acrobat)? Sign" |
regex.icontains | regex | adobe-sign-logo.{0,20}.png |
regex.icontains | regex | alt="Powered by Adobe Acrobat Sign" |
strings.istarts_with | prefix | /cobrand_logo/ |
strings.icontains | substring | checkmarkCircle |
regex.icontains | regex | (?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn) |
Stages and Predicates
Stage 1: mql_rule
and
not
or
any(body.links)
and
or
and
any(body.links.href_url.query_params_decoded['domain'])
strings.parse_domain func_call "strings.parse_domain(body.links[].href_url.query_params_decoded['domain'][]).root_domain in (adobe.com, adobesign.com, echosign.com, adobesignsandbox.com)"
body.links.href_url.domain.root_domain in ["mimecast.com", "mimecastprotect.com"]
body.links.href_url.domain.root_domain in ["adobe.com", "adobesign.com", "adobesignsandbox.com", "echosign.com"]
body.links.display_text in ["Click here to review and sign", "Open agreement", "Review and sign", "VIEW DOCUMENTS", "the document"]
and
or
body.previous_threads length_compare "0"
headers.references length_compare "1"
or
headers.references[0] regex_match "[0-9]{8,10}\\.[0-9]{5,7}\\.[0-9]{13}@(webapp|job)-prod-.*$"
headers.references[0] regex_match "[0-9]{9,10}\\.[0-9]{4,6}\\.[0-9]{13}@event-consumer-prod-[a-z]-[a-z0-9]{7,10}-[a-z0-9]{5}"
headers.references[0] regex_match "[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-APO-PRODHIPAA@apo-p-h"
any(headers.hops)
any(headers.hops.fields)
headers.hops.fields.name in ["Adobesigneventid", "Agreementid"]
and
body.previous_threads[].links length_compare "0"
macro "all(body.previous_threads[].links)"
any(recipients.to)
recipients.to.email.email eq "adobesign@adobesign.com"
or
and
or
any(html.xpath(body.html, '//img/@src').nodes)
and
or
strings.parse_url(html.xpath(body.html, '//img/@src').nodes[].raw).path contains "checkmarkCircle"
strings.parse_url(html.xpath(body.html, '//img/@src').nodes[].raw).path starts_with "/cobrand_logo/"
strings.parse_url func_call "strings.parse_url(html.xpath(body.html, '//img/@src').nodes[].raw).domain.root_domain == adobesign.com"
body.html.raw regex_match "adobe-sign-logo.{0,20}.png"
body.html.raw regex_match "alt=\"Adobe(?: Acrobat)? Sign\""
body.html.raw regex_match "alt=\"Powered by Adobe Acrobat Sign\""
filter(attachments, .file_type == 'pdf') length_compare "0"
any(attachments)
and
any(file.explode(attachments))
any(file.explode(attachments).scan.url.urls)
file.explode(attachments).scan.url.urls.url regex_match "(?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn)"
attachments.file_type eq "pdf"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["adobe.com", "adobesign.com", "adobesignsandbox.com", "echosign.com", "helpscout.net"]
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.html.raw | regex_match |
| field:"body.html.raw" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: AliExpress
#Detects messages impersonating AliExpress by matching known footer text and social media links, while confirming the sender is not legitimately from AliExpress or its infrastructure.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
// the address in the footer
strings.icontains(body.current_thread.text,
'26/F Tower One, Times Square, 1 Matheson Street, Causeway Bay'
)
// the social links in the footer
or (
length(filter(body.links,
strings.icontains(.href_url.url,
'https://www.facebook.com/aliexpressbr'
)
or strings.icontains(.href_url.url,
'https://twitter.com/aliexpressbr'
)
or strings.icontains(.href_url.url,
'https://www.youtube.com/user/AliExpressChannel'
)
or strings.icontains(.href_url.url,
'https://www.instagram.com/aliexpressbr'
)
// whatsapp
or strings.icontains(.href_url.url,
'https://wa.me/8657186563839'
)
// messenger
or strings.icontains(.href_url.url, 'https://m.me/AliExpress')
)
) >= 4
)
)
// not from AliExpress or Alibaba
and not (
sender.email.domain.root_domain in ("aliexpress.com", "alibaba.com")
and headers.auth_summary.dmarc.pass
)
// did not traverse the parent org's mail server
and not (any(headers.domains, .root_domain in ('aliyun-inc.com')))
Detection logic
Scope: inbound message.
Detects messages impersonating AliExpress by matching known footer text and social media links, while confirming the sender is not legitimately from AliExpress or its infrastructure.
- inbound message
any of:
- body.current_thread.text contains '26/F Tower One, Times Square, 1 Matheson Street, Causeway Bay'
- length(filter(body.links, strings.icontains(.href_url.url, 'https://www.facebook.com/aliexpressbr') or strings.icontains(.href_url.url, 'https://twitter.com/aliexpressbr') or strings.icontains(.href_url.url, 'https://www.youtube.com/user/AliExpressChannel') or strings.icontains(.href_url.url, 'https://www.instagram.com/aliexpressbr') or strings.icontains(.href_url.url, 'https://wa.me/8657186563839') or strings.icontains(.href_url.url, 'https://m.me/AliExpress'))) ≥ 4
not:
all of:
- sender.email.domain.root_domain in ('aliexpress.com', 'alibaba.com')
- headers.auth_summary.dmarc.pass
not:
any of
headers.domainswhere:- .root_domain in ('aliyun-inc.com')
Inspects: body.current_thread.text, body.links, body.links[].href_url.url, headers.auth_summary.dmarc.pass, headers.domains, headers.domains[].root_domain, sender.email.domain.root_domain, type.inbound. Sensors: strings.icontains.
Indicators matched (7)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | 26/F Tower One, Times Square, 1 Matheson Street, Causeway Bay |
strings.icontains | substring | https://www.facebook.com/aliexpressbr |
strings.icontains | substring | https://twitter.com/aliexpressbr |
strings.icontains | substring | https://www.youtube.com/user/AliExpressChannel |
strings.icontains | substring | https://www.instagram.com/aliexpressbr |
strings.icontains | substring | https://wa.me/8657186563839 |
strings.icontains | substring | https://m.me/AliExpress |
Stages and Predicates
Stage 1: mql_rule
and
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["alibaba.com", "aliexpress.com"]
not
any(headers.domains)
headers.domains.root_domain eq "aliyun-inc.com"
or
body.current_thread.text contains "26/F Tower One, Times Square, 1 Matheson Street, Causeway Bay"
filter(body.links, strings.icontains(.href_url.url, 'https://www.facebook.com/aliexpressbr') or strings.icontains(.href_url.url, 'https://twitter.com/aliexpressbr') or strings.icontains(.href_url.url, 'https://www.youtube.com/user/AliExpressChannel') or strings.icontains(.href_url.url, 'https://www.instagram.com/aliexpressbr') or strings.icontains(.href_url.url, 'https://wa.me/8657186563839') or strings.icontains(.href_url.url, 'https://m.me/AliExpress')) length_compare "4"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | alibaba.com, aliexpress.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"alibaba.com" field:"sender.email.domain.root_domain" value:"aliexpress.com" |
headers.domains | array_any | excludes:headers.domains |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains value:"26/F Tower One, Times Square, 1 Matheson Street, Causeway Bay" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Amazon Web Services (AWS)
#Detects messages impersonating AWS through similar display names combined with security-themed content and authentication failures. Excludes legitimate AWS communications and trusted senders.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and regex.icontains(strings.replace_confusables(sender.display_name),
'\baws\b|amazon web services|\bses\b'
)
and (
// ML Topic Analysis and Credential Theft Detection
any(ml.nlu_classifier(body.current_thread.text).topics,
.name in ("Security and Authentication", "Secure Message")
and .confidence == "high"
)
or (
beta.ocr(file.message_screenshot()).text != ""
and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in ("Security and Authentication", "Secure Message")
and .confidence == "high"
)
)
or 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"
)
)
// Not from legitimate AWS domains
// there was a DMARC check here, but a lot of users send AWS notifications to groups/mailing lists that breaks DMARC
and not (
sender.email.domain.root_domain in $org_domains
or sender.email.domain.root_domain in (
"amazon.com",
"amazonaws.com",
"amazonses.com",
"awsevents.com",
"awsmp-seller-conference.com",
"aws-experience.com",
"marketplace.aws",
"aws.com",
"amazonaws.cn",
"repost.aws",
"awscustomercouncil.com",
"airtableemail.com", // used for re:Invent
"nmls.org", // "state examination system", realtor software
"mktgcampaigns.com", // Elastic + AWS co-marketing emails
"awseducate.com",
"awsacademy.com"
)
or sender.email.domain.tld == "local"
)
// 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
)
// sender email specific
and not (
profile.by_sender_email().solicited
// sender domain specific
or (
profile.by_sender().solicited
// 30 day decay
and (profile.by_sender().days_since.last_contact < 30)
)
)
Detection logic
Scope: inbound message.
Detects messages impersonating AWS through similar display names combined with security-themed content and authentication failures. Excludes legitimate AWS communications and trusted senders.
- inbound message
- strings.replace_confusables(sender.display_name) matches '\\baws\\b|amazon web services|\\bses\\b'
any of:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message')
- .confidence is 'high'
all of:
- beta.ocr(file.message_screenshot()).text is not ''
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message')
- .confidence is 'high'
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
- sender.email.domain.root_domain in ('amazon.com', 'amazonaws.com', 'amazonses.com', 'awsevents.com', 'awsmp-seller-conference.com', 'aws-experience.com', 'marketplace.aws', 'aws.com', 'amazonaws.cn', 'repost.aws', 'awscustomercouncil.com', 'airtableemail.com', 'nmls.org', 'mktgcampaigns.com', 'awseducate.com', 'awsacademy.com')
- sender.email.domain.tld is 'local'
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
none of:
- profile.by_sender_email().solicited
all of:
- profile.by_sender().solicited
- profile.by_sender().days_since.last_contact < 30
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, sender.email.domain.tld, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.nlu_classifier, profile.by_sender, profile.by_sender_email, regex.icontains, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (11)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | \baws\b|amazon web services|\bses\b |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Secure Message |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | equals | high |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Secure Message |
ml.nlu_classifier(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 |
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 |
Stages and Predicates
Stage 1: mql_rule
and
or
and
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence eq "high"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Secure Message", "Security and Authentication"]
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).topics.name in ["Secure Message", "Security and Authentication"]
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
not
or
and
profile.by_sender func_call "profile.by_sender().days_since.last_contact < 30"
profile.by_sender func_call "profile.by_sender().solicited"
profile.by_sender_email func_call "profile.by_sender_email().solicited"
not
or
sender.email.domain.root_domain in ["airtableemail.com", "amazon.com", "amazonaws.cn", "amazonaws.com", "amazonses.com", "aws-experience.com", "aws.com", "awsacademy.com", "awscustomercouncil.com", "awseducate.com", "awsevents.com", "awsmp-seller-conference.com", "marketplace.aws", "mktgcampaigns.com", "nmls.org", "repost.aws"]
sender.email.domain.tld eq "local"
macro "sender.email.domain.root_domain in org_domains"
strings.replace_confusables(sender.display_name) regex_match "\\baws\\b|amazon web services|\\bses\\b"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.email.domain.root_domain | in | airtableemail.com, amazon.com, amazonaws.cn, amazonaws.com, amazonses.com, aws-experience.com, aws.com, awsacademy.com, awscustomercouncil.com, awseducate.com, awsevents.com, awsmp-seller-conference.com, marketplace.aws, mktgcampaigns.com, nmls.org, repost.aws | excludes:sender.email.domain.root_domain |
sender.email.domain.tld | eq | local | excludes:sender.email.domain.tld field:"sender.email.domain.tld" value:"local" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
strings.replace_confusables(sender.display_name) | regex_match |
| field:"strings.replace_confusables(sender.display_name)" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Aquent
#Detects messages impersonating Aquent, a staffing and talent solutions company, by analyzing sender display names and body content for Aquent branding and office addresses from unauthorized domains.
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 |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
regex.icontains(sender.display_name, 'Aquent\b')
// look for Aquent address from footer, or current address being used by actors
or (
strings.icontains(body.current_thread.text, 'Aquent')
and (
(
strings.icontains(body.current_thread.text, '2884 Sand Hill Road')
and strings.icontains(body.current_thread.text, 'Menlo Park, CA 94025')
)
or (
strings.icontains(body.current_thread.text, '501 Boylston St')
and strings.icontains(body.current_thread.text, 'Boston, MA 02116')
)
)
)
)
and not (
sender.email.domain.root_domain in $org_domains
or (
sender.email.domain.root_domain in (
"aquent.com",
"dice.com",
"roberthalf.com",
"roberthalf.be",
"service-now.com",
"protiviti.com",
"atlassian.net",
"workday.com",
"myworkday.com",
"rapdev.io",
"immersivelabs.com",
"outsidegc.com"
)
and headers.auth_summary.dmarc.pass
)
)
// not a forward or reply
and (headers.in_reply_to is null or length(headers.references) == 0)
and not any(ml.nlu_classifier(body.current_thread.text).topics,
.name == "Advertising and Promotions" and .confidence != "low"
)
// negate instances where proofpoint sends a review of a reported message via analyzer
and not (
sender.email.email == "analyzer@analyzer.securityeducation.com"
and any(headers.domains, .root_domain == "pphosted.com")
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
)
Detection logic
Scope: inbound message.
Detects messages impersonating Aquent, a staffing and talent solutions company, by analyzing sender display names and body content for Aquent branding and office addresses from unauthorized domains.
- inbound message
any of:
- sender.display_name matches 'Aquent\\b'
all of:
- body.current_thread.text contains 'Aquent'
any of:
all of:
- body.current_thread.text contains '2884 Sand Hill Road'
- body.current_thread.text contains 'Menlo Park, CA 94025'
all of:
- body.current_thread.text contains '501 Boylston St'
- body.current_thread.text contains 'Boston, MA 02116'
none of:
- sender.email.domain.root_domain in $org_domains
all of:
- sender.email.domain.root_domain in ('aquent.com', 'dice.com', 'roberthalf.com', 'roberthalf.be', 'service-now.com', 'protiviti.com', 'atlassian.net', 'workday.com', 'myworkday.com', 'rapdev.io', 'immersivelabs.com', 'outsidegc.com')
- headers.auth_summary.dmarc.pass
any of:
- headers.in_reply_to is missing
- length(headers.references) is 0
not:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name is 'Advertising and Promotions'
- .confidence is not 'low'
not:
all of:
- sender.email.email is 'analyzer@analyzer.securityeducation.com'
any of
headers.domainswhere:- .root_domain is 'pphosted.com'
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.domains, headers.domains[].root_domain, headers.in_reply_to, headers.references, sender.display_name, sender.email.domain.root_domain, sender.email.email, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains. Reference lists: $org_domains.
Indicators matched (6)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | Aquent\b |
strings.icontains | substring | Aquent |
strings.icontains | substring | 2884 Sand Hill Road |
strings.icontains | substring | Menlo Park, CA 94025 |
strings.icontains | substring | 501 Boylston St |
strings.icontains | substring | Boston, MA 02116 |
Stages and Predicates
Stage 1: mql_rule
and
or
and
or
and
body.current_thread.text contains "2884 Sand Hill Road"
body.current_thread.text contains "Menlo Park, CA 94025"
and
body.current_thread.text contains "501 Boylston St"
body.current_thread.text contains "Boston, MA 02116"
body.current_thread.text contains "Aquent"
sender.display_name regex_match "Aquent\\b"
not
or
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["aquent.com", "atlassian.net", "dice.com", "immersivelabs.com", "myworkday.com", "outsidegc.com", "protiviti.com", "rapdev.io", "roberthalf.be", "roberthalf.com", "service-now.com", "workday.com"]
macro "sender.email.domain.root_domain in org_domains"
not
and
any(headers.domains)
headers.domains.root_domain eq "pphosted.com"
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.pass eq "true"
sender.email.email eq "analyzer@analyzer.securityeducation.com"
not
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).topics.name eq "Advertising and Promotions"
or
headers.in_reply_to is_null
headers.references length_compare "0"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | aquent.com, atlassian.net, dice.com, immersivelabs.com, myworkday.com, outsidegc.com, protiviti.com, rapdev.io, roberthalf.be, roberthalf.com, service-now.com, workday.com | excludes:sender.email.domain.root_domain |
headers.domains | array_any | excludes:headers.domains | |
headers.auth_summary.spf.pass | eq | true | excludes:headers.auth_summary.spf.pass field:"headers.auth_summary.spf.pass" value:"true" |
sender.email.email | eq | analyzer@analyzer.securityeducation.com | excludes:sender.email.email field:"sender.email.email" value:"analyzer@analyzer.securityeducation.com" |
ml.nlu_classifier(body.current_thread.text).topics | array_any | excludes:ml.nlu_classifier(body.current_thread.text).topics |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
headers.in_reply_to | is_null | field:"headers.in_reply_to" kind:is_null | |
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match value:"Aquent\b" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Automobile assistance associations
#Detects messages impersonating automobile associations (AAA, CAA, RAC, etc.) offering vehicle emergency kits or roadside assistance services from untrusted senders.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and any(ml.nlu_classifier(body.current_thread.text).entities,
.name in ("org", "sender")
and regex.contains(.text, '\b(?:AAA|RAC|RAA|CAA|BCAA|AMA)\b')
)
and regex.icontains(body.current_thread.text,
'(?:car|vehicle|motor|driver|emergency|road.?side|break.?down|assist|save|discount|complimentary|free\b).{0,10}kit'
)
// and the sender is not from high trust sender root domains
and not (
sender.email.domain.root_domain in $high_trust_sender_root_domains
and coalesce(headers.auth_summary.dmarc.pass, false)
)
// negate newsletters and quarantine notifications
and not (
any(ml.nlu_classifier(body.current_thread.text).topics,
.name in ("Newsletters and Digests") and .confidence != "low"
)
or strings.icontains(subject.subject, "quarantine")
)
Detection logic
Scope: inbound message.
Detects messages impersonating automobile associations (AAA, CAA, RAC, etc.) offering vehicle emergency kits or roadside assistance services from untrusted senders.
- inbound message
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name in ('org', 'sender')
- .text matches '\\b(?:AAA|RAC|RAA|CAA|BCAA|AMA)\\b'
- body.current_thread.text matches '(?:car|vehicle|motor|driver|emergency|road.?side|break.?down|assist|save|discount|complimentary|free\\b).{0,10}kit'
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass)
none of:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Newsletters and Digests')
- .confidence is not 'low'
- subject.subject contains 'quarantine'
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: ml.nlu_classifier, regex.contains, regex.icontains, strings.icontains. Reference lists: $high_trust_sender_root_domains.
Indicators matched (4)
| Field | Match | Value |
|---|---|---|
ml.nlu_classifier(body.current_thread.text).entities[].name | member | org |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | sender |
regex.contains | regex | \b(?:AAA|RAC|RAA|CAA|BCAA|AMA)\b |
regex.icontains | regex | (?:car|vehicle|motor|driver|emergency|road.?side|break.?down|assist|save|discount|complimentary|free\b).{0,10}kit |
Stages and Predicates
Stage 1: mql_rule
and
not
or
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).topics.name eq "Newsletters and Digests"
subject.subject contains "quarantine"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name in ["org", "sender"]
ml.nlu_classifier(body.current_thread.text).entities.text regex_match "\\b(?:AAA|RAC|RAA|CAA|BCAA|AMA)\\b"
body.current_thread.text regex_match "(?:car|vehicle|motor|driver|emergency|road.?side|break.?down|assist|save|discount|complimentary|free\\b).{0,10}kit"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
ml.nlu_classifier(body.current_thread.text).topics | array_any | excludes:ml.nlu_classifier(body.current_thread.text).topics | |
subject.subject | contains | quarantine | excludes:subject.subject field:"subject.subject" value:"quarantine" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match value:"(?:car|vehicle|motor|driver|emergency|road.?side|break.?down|assist|save|discount|complimentary|free\b).{0,10}kit" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Bids & Tenders
#Detects links impersonating the Bids & Tenders platform. The rule identifies suspicious links from non-legitimate domains that load Bids & Tenders logo assets, suggesting the sender is spoofing the platform to appear legitimate.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Spoofing, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// self sender or invaild recipent domain
and length(recipients.to) == 1
and (
sender.email.email == recipients.to[0].email.email
or recipients.to[0].email.domain.valid == false
)
and 0 < length(body.current_thread.links) < 10
and any(body.current_thread.links,
.href_url.domain.root_domain != 'bidsandtenders.ca'
and any(ml.link_analysis(., mode="aggressive").unique_urls_accessed,
.domain.domain == 'bids.bidsandtenders.ca'
and strings.icontains(.path, '/Logo/')
)
)
Detection logic
Scope: inbound message.
Detects links impersonating the Bids & Tenders platform. The rule identifies suspicious links from non-legitimate domains that load Bids & Tenders logo assets, suggesting the sender is spoofing the platform to appear legitimate.
- inbound message
- length(recipients.to) is 1
any of:
- sender.email.email is recipients.to[0].email.email
- recipients.to[0].email.domain.valid is False
all of:
- length(body.current_thread.links) > 0
- length(body.current_thread.links) < 10
any of
body.current_thread.linkswhere all hold:- .href_url.domain.root_domain is not 'bidsandtenders.ca'
any of
ml.link_analysis(., mode='aggressive').unique_urls_accessedwhere all hold:- .domain.domain is 'bids.bidsandtenders.ca'
- .path contains '/Logo/'
Inspects: body.current_thread.links, body.current_thread.links[].href_url.domain.root_domain, recipients.to, recipients.to[0].email.domain.valid, recipients.to[0].email.email, sender.email.email, type.inbound. Sensors: ml.link_analysis, strings.icontains.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
ml.link_analysis(body.current_thread.links[], mode='aggressive').unique_urls_accessed[].domain.domain | equals | bids.bidsandtenders.ca |
strings.icontains | substring | /Logo/ |
Stages and Predicates
Stage 1: mql_rule
and
any(body.current_thread.links)
and
any(ml.link_analysis(body.current_thread.links, mode='aggressive').unique_urls_accessed)
and
ml.link_analysis(body.current_thread.links[], mode='aggressive').unique_urls_accessed[].domain.domain eq "bids.bidsandtenders.ca"
ml.link_analysis(body.current_thread.links[], mode='aggressive').unique_urls_accessed[].path contains "/Logo/"
body.current_thread.links.href_url.domain.root_domain ne "bidsandtenders.ca"
or
recipients.to[0].email.domain.valid eq "false"
sender.email.email cross_field_compare "recipients.to[0].email.email"
body.current_thread.links length_compare "0"
body.current_thread.links length_compare "10"
recipients.to length_compare "1"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
recipients.to[0].email.domain.valid | eq |
| field:"recipients.to[0].email.domain.valid" kind:eq value:"false" |
sender.email.email | cross_field_compare |
| field:"sender.email.email" kind:cross_field_compare value:"recipients.to[0].email.email" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Booking.com
#Detects messages purporting to be from Booking.com's support team that contain suspicious credential collection patterns. The sender is not from a legitimate Booking.com domain and shows a history of problematic behavior or lacks prior solicited communication. Additional checks enforce DMARC authentication for trusted domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(body.links) < 10
and (
any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Travel and Transportation",
"Customer Service and Support",
"Security and Authentication"
)
and .confidence != "low"
)
// handle instances in which ml_topic does not hit
or (
length(body.links) == 0
and length(attachments) == 0
and length(body.current_thread.text) < 1000
and strings.icontains(sender.display_name, "booking.com")
)
)
and (
any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "org" and .text == "Booking.com"
)
or strings.icontains(body.current_thread.text, ' booking.com ')
or strings.icontains(sender.display_name, "booking.com")
or 2 of (
strings.icontains(body.current_thread.text, "Booking.com"),
strings.icontains(body.current_thread.text, "Oosterdokskade 163"),
strings.icontains(body.current_thread.text, "Amsterdam")
)
)
and (
any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "cred_theft"
)
or any(body.links,
strings.ilike(.display_text,
"*review*",
"*response*",
"*respond*",
"*complaint*",
"*contact*",
"*accommodation*",
"*view*details*"
)
or .display_url.domain.root_domain == "booking.com" and .mismatched
or .href_url.domain.root_domain == 'share.google'
or network.whois(.href_url.domain).days_old < 30
or strings.icontains(.href_url.path, "/redir")
)
// check for text strings that betray intent
or regex.icontains(body.current_thread.text, '(?:book\sa|open)\srooms', )
or strings.ilike(body.current_thread.text, "* availab*", )
// two seperate HTML elements impersonating the logo
or (
any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes,
.display_text =~ "Booking"
)
and any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes,
.display_text =~ ".com"
)
)
)
and not (
sender.email.domain.root_domain in~ (
'booking.com',
'siteminder.com',
'thinkreservations.com'
)
and headers.auth_summary.dmarc.pass
)
and (
not profile.by_sender().solicited
or (
profile.by_sender().any_messages_malicious_or_spam
and not profile.by_sender().any_messages_benign
)
)
// negate microsoft quarantine messages
and not (
sender.email.email == "quarantine@messaging.microsoft.com"
and (
headers.auth_summary.dmarc.pass
// no sender auth but MS AuthAs is Internal
or (
not coalesce(headers.auth_summary.dmarc.pass, false)
and any(headers.hops,
.index == 0
and any(.fields,
.name == "X-MS-Exchange-CrossTenant-AuthAs"
and .value == "Internal"
)
)
)
)
)
Detection logic
Scope: inbound message.
Detects messages purporting to be from Booking.com's support team that contain suspicious credential collection patterns. The sender is not from a legitimate Booking.com domain and shows a history of problematic behavior or lacks prior solicited communication. Additional checks enforce DMARC authentication for trusted domains.
- inbound message
- length(body.links) < 10
any of:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Travel and Transportation', 'Customer Service and Support', 'Security and Authentication')
- .confidence is not 'low'
all of:
- length(body.links) is 0
- length(attachments) is 0
- length(body.current_thread.text) < 1000
- sender.display_name contains 'booking.com'
any of:
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name is 'org'
- .text is 'Booking.com'
- body.current_thread.text contains ' booking.com '
- sender.display_name contains 'booking.com'
at least 2 of:
- body.current_thread.text contains 'Booking.com'
- body.current_thread.text contains 'Oosterdokskade 163'
- body.current_thread.text contains 'Amsterdam'
any of:
any of
ml.nlu_classifier(body.current_thread.text).intentswhere:- .name is 'cred_theft'
any of
body.linkswhere any holds:.display_text matches any of 7 patterns
*review**response**respond**complaint**contact**accommodation**view*details*
all of:
- .display_url.domain.root_domain is 'booking.com'
- .mismatched
- .href_url.domain.root_domain is 'share.google'
- network.whois(.href_url.domain).days_old < 30
- .href_url.path contains '/redir'
- body.current_thread.text matches '(?:book\\sa|open)\\srooms'
- body.current_thread.text matches '* availab*'
all of:
any of
html.xpath(body.html, '//*[text()[normalize-space()]]').nodeswhere:- .display_text is 'Booking'
any of
html.xpath(body.html, '//*[text()[normalize-space()]]').nodeswhere:- .display_text is '.com'
not:
all of:
- sender.email.domain.root_domain in ('booking.com', 'siteminder.com', 'thinkreservations.com')
- headers.auth_summary.dmarc.pass
any of:
not:
- profile.by_sender().solicited
all of:
- profile.by_sender().any_messages_malicious_or_spam
not:
- profile.by_sender().any_messages_benign
not:
all of:
- sender.email.email is 'quarantine@messaging.microsoft.com'
any of:
- headers.auth_summary.dmarc.pass
all of:
not:
- coalesce(headers.auth_summary.dmarc.pass)
any of
headers.hopswhere all hold:- .index is 0
any of
.fieldswhere all hold:- .name is 'X-MS-Exchange-CrossTenant-AuthAs'
- .value is 'Internal'
Inspects: body.current_thread.text, body.html, body.links, body.links[].display_text, body.links[].display_url.domain.root_domain, body.links[].href_url.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.links[].mismatched, headers.auth_summary.dmarc.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, headers.hops[].index, sender.display_name, sender.email.domain.root_domain, sender.email.email, type.inbound. Sensors: html.xpath, ml.nlu_classifier, network.whois, profile.by_sender, regex.icontains, strings.icontains, strings.ilike.
Indicators matched (25)
| Field | Match | Value |
|---|---|---|
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Travel and Transportation |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Customer Service and Support |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Security and Authentication |
strings.icontains | substring | booking.com |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | org |
ml.nlu_classifier(body.current_thread.text).entities[].text | equals | Booking.com |
strings.icontains | substring | booking.com |
strings.icontains | substring | Booking.com |
strings.icontains | substring | Oosterdokskade 163 |
strings.icontains | substring | Amsterdam |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
strings.ilike | substring | *review* |
13 more
strings.ilike | substring | *response* |
strings.ilike | substring | *respond* |
strings.ilike | substring | *complaint* |
strings.ilike | substring | *contact* |
strings.ilike | substring | *accommodation* |
strings.ilike | substring | *view*details* |
body.links[].display_url.domain.root_domain | equals | booking.com |
body.links[].href_url.domain.root_domain | equals | share.google |
strings.icontains | substring | /redir |
regex.icontains | regex | (?:book\sa|open)\srooms |
strings.ilike | substring | * availab* |
html.xpath(body.html, '//*[text()[normalize-space()]]').nodes[].display_text | equals | Booking |
html.xpath(body.html, '//*[text()[normalize-space()]]').nodes[].display_text | equals | .com |
Stages and Predicates
Stage 1: mql_rule
and
not
and
or
and
any(headers.hops)
and
any(headers.hops.fields)
and
headers.hops.fields[].name eq "X-MS-Exchange-CrossTenant-AuthAs"
headers.hops.fields[].value eq "Internal"
headers.hops.index eq "0"
not
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
headers.auth_summary.dmarc.pass eq "true"
sender.email.email eq "quarantine@messaging.microsoft.com"
or
any(body.links)
or
and
body.links.display_url.domain.root_domain eq "booking.com"
body.links.mismatched eq "true"
body.links.display_text match "accommodation"
body.links.display_text match "complaint"
body.links.display_text match "contact"
body.links.display_text match "respond"
body.links.display_text match "response"
body.links.display_text match "review"
body.links.display_text wildcard "*view*details*"
body.links.href_url.domain.root_domain eq "share.google"
body.links.href_url.path contains "/redir"
network.whois func_call "network.whois(body.links[].href_url.domain).days_old < 30"
and
any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes)
html.xpath(body.html, '//*[text()[normalize-space()]]').nodes.display_text eq ".com"
any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes)
html.xpath(body.html, '//*[text()[normalize-space()]]').nodes.display_text eq "Booking"
any(ml.nlu_classifier(body.current_thread.text).intents)
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
body.current_thread.text match " availab"
body.current_thread.text regex_match "(?:book\\sa|open)\\srooms"
or
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name eq "org"
ml.nlu_classifier(body.current_thread.text).entities.text eq "Booking.com"
body.current_thread.text contains " booking.com "
body.current_thread.text contains "Amsterdam"
body.current_thread.text contains "Booking.com"
body.current_thread.text contains "Oosterdokskade 163"
sender.display_name contains "booking.com"
or
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).topics.name in ["Customer Service and Support", "Security and Authentication", "Travel and Transportation"]
and
attachments length_compare "0"
body.current_thread.text length_compare "1000"
body.links length_compare "0"
sender.display_name contains "booking.com"
or
and
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
profile.by_sender func_call "profile.by_sender().any_messages_malicious_or_spam"
not
profile.by_sender func_call "profile.by_sender().solicited"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["booking.com", "siteminder.com", "thinkreservations.com"]
body.links length_compare "10"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.hops | array_any | excludes:headers.hops | |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.email | eq | quarantine@messaging.microsoft.com | excludes:sender.email.email field:"sender.email.email" value:"quarantine@messaging.microsoft.com" |
sender.email.domain.root_domain | in | booking.com, siteminder.com, thinkreservations.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"booking.com" field:"sender.email.domain.root_domain" value:"siteminder.com" field:"sender.email.domain.root_domain" value:"thinkreservations.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match value:"(?:book\sa|open)\srooms" |
body.current_thread.text | wildcard |
| field:"body.current_thread.text" kind:wildcard value:"* availab*" |
sender.display_name | contains |
| field:"sender.display_name" kind:contains value:"booking.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand Impersonation: Disney
#Detects messages from senders impersonating Disney through display name spoofing or brand logo usage, combined with security-themed content and suspicious authentication patterns.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
// display name contains Disney
(
(
strings.ilike(strings.replace_confusables(sender.display_name),
'*disney*'
)
and not strings.ilike(strings.replace_confusables(sender.display_name),
'*disney springs*'
)
)
// levenshtein distance similar to Disney
or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
'disney'
) <= 1
or any(ml.logo_detect(file.message_screenshot()).brands,
.name == "Disney" and .confidence == "high"
)
)
)
and (
(
any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications"
)
and .confidence in ("medium", "high")
)
and not any(ml.nlu_classifier(body.current_thread.text).topics,
.name in ("Newsletters and Digests", "Entertainment and Sports")
and .confidence in ("medium", "high")
)
)
or (
beta.ocr(file.message_screenshot()).text != ""
and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications"
)
and .confidence in ("medium", "high")
)
and not any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in ("Newsletters and Digests", "Entertainment and Sports")
and .confidence in ("medium", "high")
)
)
or 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 Disney domains and passes auth
and not (
sender.email.domain.root_domain in $org_domains
or (
// from https://github.com/v2fly/domain-list-community/blob/master/data/disney
sender.email.domain.root_domain in (
"disney.asia",
"disney.be",
"disney.bg",
"disney.ca",
"disney.ch",
"disney.co.il",
"disney.co.jp",
"disney.co.kr",
"disney.co.th",
"disney.co.uk",
"disney.co.za",
"disney.com",
"disney.com.au",
"disney.com.br",
"disney.com.hk",
"disney.com.tw",
"disney.cz",
"disney.de",
"disney.dk",
"disney.es",
"disney.fi",
"disney.fr",
"disney.gr",
"disney.hu",
"disney.id",
"disney.in",
"disney.io",
"disney.it",
"disney.my",
"disney.nl",
"disney.no",
"disney.ph",
"disney.pl",
"disney.pt",
"disney.ro",
"disney.ru",
"disney.se",
"disney.sg",
"disneysurveys.com",
"disneyonline.com",
"disneyaccount.com",
"disneyadvertising.com",
"disneydestinations.com",
"hulu.com",
"hulumail.com",
"canarytechnologies.com", // domain used by a disney resort - hotel mgmt software company
"disneyvacationclub.com",
"twdc.com",
"disneyrewards.com",
"disneystore.com",
"disneyworld.com"
)
and headers.auth_summary.dmarc.pass
)
)
// 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
or not headers.auth_summary.dmarc.pass
or not headers.auth_summary.spf.pass
)
Detection logic
Scope: inbound message.
Detects messages from senders impersonating Disney through display name spoofing or brand logo usage, combined with security-themed content and suspicious authentication patterns.
- inbound message
any of:
all of:
- strings.replace_confusables(sender.display_name) matches '*disney*'
not:
- strings.replace_confusables(sender.display_name) matches '*disney springs*'
- strings.replace_confusables(sender.display_name) is similar to 'disney'
any of
ml.logo_detect(file.message_screenshot()).brandswhere all hold:- .name is 'Disney'
- .confidence is 'high'
any of:
all of:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
- .confidence in ('medium', 'high')
not:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Newsletters and Digests', 'Entertainment and Sports')
- .confidence in ('medium', 'high')
all of:
- beta.ocr(file.message_screenshot()).text is not ''
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
- .confidence in ('medium', 'high')
not:
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Newsletters and Digests', 'Entertainment and Sports')
- .confidence in ('medium', 'high')
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 ('disney.asia', 'disney.be', 'disney.bg', 'disney.ca', 'disney.ch', 'disney.co.il', 'disney.co.jp', 'disney.co.kr', 'disney.co.th', 'disney.co.uk', 'disney.co.za', 'disney.com', 'disney.com.au', 'disney.com.br', 'disney.com.hk', 'disney.com.tw', 'disney.cz', 'disney.de', 'disney.dk', 'disney.es', 'disney.fi', 'disney.fr', 'disney.gr', 'disney.hu', 'disney.id', 'disney.in', 'disney.io', 'disney.it', 'disney.my', 'disney.nl', 'disney.no', 'disney.ph', 'disney.pl', 'disney.pt', 'disney.ro', 'disney.ru', 'disney.se', 'disney.sg', 'disneysurveys.com', 'disneyonline.com', 'disneyaccount.com', 'disneyadvertising.com', 'disneydestinations.com', 'hulu.com', 'hulumail.com', 'canarytechnologies.com', 'disneyvacationclub.com', 'twdc.com', 'disneyrewards.com', 'disneystore.com', 'disneyworld.com')
- headers.auth_summary.dmarc.pass
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
any of:
not:
- profile.by_sender().solicited
not:
- headers.auth_summary.dmarc.pass
not:
- headers.auth_summary.spf.pass
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, strings.ilevenshtein, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (18)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *disney* |
strings.ilevenshtein | fuzzy | disney |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | Disney |
ml.logo_detect(file.message_screenshot()).brands[].confidence | equals | high |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Secure Message |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Reminders and Notifications |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | medium |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | high |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Secure Message |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Reminders and Notifications |
6 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | medium |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | high |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | equals | high |
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 |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Entertainment and Sports", "Newsletters and Digests"]
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
and
not
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(body.current_thread.text).topics.name in ["Entertainment and Sports", "Newsletters and Digests"]
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(body.current_thread.text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
not
or
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["canarytechnologies.com", "disney.asia", "disney.be", "disney.bg", "disney.ca", "disney.ch", "disney.co.il", "disney.co.jp", "disney.co.kr", "disney.co.th", "disney.co.uk", "disney.co.za", "disney.com", "disney.com.au", "disney.com.br", "disney.com.hk", "disney.com.tw", "disney.cz", "disney.de", "disney.dk", "disney.es", "disney.fi", "disney.fr", "disney.gr", "disney.hu", "disney.id", "disney.in", "disney.io", "disney.it", "disney.my", "disney.nl", "disney.no", "disney.ph", "disney.pl", "disney.pt", "disney.ro", "disney.ru", "disney.se", "disney.sg", "disneyaccount.com", "disneyadvertising.com", "disneydestinations.com", "disneyonline.com", "disneyrewards.com", "disneystore.com", "disneysurveys.com", "disneyvacationclub.com", "disneyworld.com", "hulu.com", "hulumail.com", "twdc.com"]
macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
any(ml.logo_detect(file.message_screenshot()).brands)
and
ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
ml.logo_detect(file.message_screenshot()).brands.name eq "Disney"
and
not
strings.replace_confusables(sender.display_name) match "disney springs"
strings.replace_confusables(sender.display_name) match "disney"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"disney\") <= 1"
or
not
headers.auth_summary.dmarc.pass eq "true"
not
headers.auth_summary.spf.pass eq "true"
not
profile.by_sender func_call "profile.by_sender().solicited"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | canarytechnologies.com, disney.asia, disney.be, disney.bg, disney.ca, disney.ch, disney.co.il, disney.co.jp, disney.co.kr, disney.co.th, disney.co.uk, disney.co.za, disney.com, disney.com.au, disney.com.br, disney.com.hk, disney.com.tw, disney.cz, disney.de, disney.dk, disney.es, disney.fi, disney.fr, disney.gr, disney.hu, disney.id, disney.in, disney.io, disney.it, disney.my, disney.nl, disney.no, disney.ph, disney.pl, disney.pt, disney.ro, disney.ru, disney.se, disney.sg, disneyaccount.com, disneyadvertising.com, disneydestinations.com, disneyonline.com, disneyrewards.com, disneystore.com, disneysurveys.com, disneyvacationclub.com, disneyworld.com, hulu.com, hulumail.com, twdc.com | excludes:sender.email.domain.root_domain |
Indicators
These rows show field, operator, and value matches.
Brand impersonation: DocSend
#Attack impersonating DocSend.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Lookalike domain, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
(
sender.display_name =~ 'DocSend'
or strings.ilevenshtein(sender.display_name, 'DocSend') <= 1
or strings.icontains(sender.email.domain.domain, '*docsend*')
or regex.icontains(body.current_thread.text, 'on Dropbox\s*(?:Doc)?\s*Send')
or regex.icontains(body.current_thread.text,
'The Dropbox\s*(?:Doc)?\s*Send Team'
)
or regex.icontains(body.current_thread.text,
'Report to Dropbox\s*(?:Doc)?\s*Send'
)
or regex.icontains(body.current_thread.text,
'©\s*20[0-9]{2}\s*,\s*Dropbox DocSend'
)
or any(ml.nlu_classifier(body.current_thread.text).entities,
.name in ("sender", "org")
and strings.icontains(.text, 'Dropbox DocSend')
)
)
)
and not (
sender.email.domain.root_domain in~ ('docsend.com')
and coalesce(headers.auth_summary.dmarc.pass, false)
)
and not profile.by_sender_email().solicited
// 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
)
Detection logic
Scope: inbound message.
Attack impersonating DocSend.
- inbound message
any of:
- sender.display_name is 'DocSend'
- sender.display_name is similar to 'DocSend'
- sender.email.domain.domain contains '*docsend*'
- body.current_thread.text matches 'on Dropbox\\s*(?:Doc)?\\s*Send'
- body.current_thread.text matches 'The Dropbox\\s*(?:Doc)?\\s*Send Team'
- body.current_thread.text matches 'Report to Dropbox\\s*(?:Doc)?\\s*Send'
- body.current_thread.text matches '©\\s*20[0-9]{2}\\s*,\\s*Dropbox DocSend'
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name in ('sender', 'org')
- .text contains 'Dropbox DocSend'
not:
all of:
- sender.email.domain.root_domain in ('docsend.com')
- coalesce(headers.auth_summary.dmarc.pass)
not:
- profile.by_sender_email().solicited
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
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: ml.nlu_classifier, profile.by_sender_email, regex.icontains, strings.icontains, strings.ilevenshtein. Reference lists: $high_trust_sender_root_domains.
Indicators matched (10)
| Field | Match | Value |
|---|---|---|
sender.display_name | equals | DocSend |
strings.ilevenshtein | fuzzy | DocSend |
strings.icontains | substring | *docsend* |
regex.icontains | regex | on Dropbox\s*(?:Doc)?\s*Send |
regex.icontains | regex | The Dropbox\s*(?:Doc)?\s*Send Team |
regex.icontains | regex | Report to Dropbox\s*(?:Doc)?\s*Send |
regex.icontains | regex | ©\s*20[0-9]{2}\s*,\s*Dropbox DocSend |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | sender |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | org |
strings.icontains | substring | Dropbox DocSend |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name in ["org", "sender"]
ml.nlu_classifier(body.current_thread.text).entities.text contains "Dropbox DocSend"
body.current_thread.text regex_match "Report to Dropbox\\s*(?:Doc)?\\s*Send"
body.current_thread.text regex_match "The Dropbox\\s*(?:Doc)?\\s*Send Team"
body.current_thread.text regex_match "on Dropbox\\s*(?:Doc)?\\s*Send"
body.current_thread.text regex_match "©\\s*20[0-9]{2}\\s*,\\s*Dropbox DocSend"
sender.display_name eq "DocSend"
sender.email.domain.domain contains "*docsend*"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"DocSend\") <= 1"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
sender.email.domain.root_domain eq "docsend.com"
not
profile.by_sender_email func_call "profile.by_sender_email().solicited"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.email.domain.root_domain | eq | docsend.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"docsend.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
sender.display_name | eq |
| field:"sender.display_name" kind:eq value:"DocSend" |
sender.email.domain.domain | contains |
| field:"sender.email.domain.domain" kind:contains value:"*docsend*" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: DocuSign PDF attachment with suspicious link
#This rule detects DocuSign logos within PDF's that do not link to reputable domains, nor docusign themselves. This is typically indicative of Credential Phishing.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, PDF, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and any(attachments,
.file_type == "pdf"
and any(ml.logo_detect(.).brands, .name == "DocuSign")
and any(file.explode(.),
length(.scan.url.urls) <= 9
and any(.scan.url.urls,
.domain.root_domain not in $tranco_1m
and .domain.root_domain not in $org_domains
and .domain.root_domain != "sublimesecurity.com"
and not strings.ilike(.domain.root_domain, "docusign.*")
)
)
and any(file.explode(.),
any(ml.nlu_classifier(.scan.ocr.raw).entities,
.name == "org" and .text == "DocuSign"
)
)
and any(file.explode(.),
any(ml.nlu_classifier(.scan.ocr.raw).entities,
.name == "request"
)
)
)
Detection logic
Scope: inbound message.
This rule detects DocuSign logos within PDF's that do not link to reputable domains, nor docusign themselves. This is typically indicative of Credential Phishing.
- inbound message
any of
attachmentswhere all hold:- .file_type is 'pdf'
any of
ml.logo_detect(.).brandswhere:- .name is 'DocuSign'
any of
file.explode(.)where all hold:- length(.scan.url.urls) ≤ 9
any of
.scan.url.urlswhere all hold:- .domain.root_domain not in $tranco_1m
- .domain.root_domain not in $org_domains
- .domain.root_domain is not 'sublimesecurity.com'
not:
- .domain.root_domain matches 'docusign.*'
any of
file.explode(.)where:any of
ml.nlu_classifier(.scan.ocr.raw).entitieswhere all hold:- .name is 'org'
- .text is 'DocuSign'
any of
file.explode(.)where:any of
ml.nlu_classifier(.scan.ocr.raw).entitieswhere:- .name is 'request'
Inspects: attachments[].file_type, type.inbound. Sensors: file.explode, ml.logo_detect, ml.nlu_classifier, strings.ilike. Reference lists: $org_domains, $tranco_1m.
Indicators matched (5)
| Field | Match | Value |
|---|---|---|
attachments[].file_type | equals | pdf |
ml.logo_detect(attachments[]).brands[].name | equals | DocuSign |
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).entities[].name | equals | org |
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).entities[].text | equals | DocuSign |
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).entities[].name | equals | request |
Stages and Predicates
Stage 1: mql_rule
and
any(attachments)
and
any(file.explode(attachments))
and
any(file.explode(attachments).scan.url.urls)
and
not
file.explode(attachments[])[].scan.url.urls[].domain.root_domain starts_with "docusign."
file.explode(attachments[])[].scan.url.urls[].domain.root_domain ne "sublimesecurity.com"
macro "file.explode(attachments[])[].scan.url.urls[].domain.root_domain not in org_domains"
macro "file.explode(attachments[])[].scan.url.urls[].domain.root_domain not in tranco_1m"
file.explode(attachments[])[].scan.url.urls length_compare "9"
any(file.explode(attachments))
any(ml.nlu_classifier(file.explode(attachments).scan.ocr.raw).entities)
and
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).entities[].name eq "org"
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).entities[].text eq "DocuSign"
any(file.explode(attachments))
any(ml.nlu_classifier(file.explode(attachments).scan.ocr.raw).entities)
ml.nlu_classifier(file.explode(attachments).scan.ocr.raw).entities.name eq "request"
any(ml.logo_detect(attachments).brands)
ml.logo_detect(attachments).brands.name eq "DocuSign"
attachments.file_type eq "pdf"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: DocuSign with embedded QR code
#This rule detects unsolicited messages with short bodies containing a DocuSign logo, QR code language and an embedded QR code.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Evasion, Image as content, Impersonation: Brand, QR code |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(body.current_thread.text) < 1000
and length(attachments) == 0
and regex.icontains(body.current_thread.text, '\bQ(\.)?R(\.)?\b')
and regex.icontains(body.current_thread.text, "scan|mobile|camera")
and any(ml.logo_detect(file.message_screenshot()).brands,
strings.starts_with(.name, "DocuSign")
)
//
// 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 any(beta.scan_qr(file.message_screenshot()).items,
.type is not null and regex.contains(.data, '\.')
)
// 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
)
Detection logic
Scope: inbound message.
This rule detects unsolicited messages with short bodies containing a DocuSign logo, QR code language and an embedded QR code.
- inbound message
- length(body.current_thread.text) < 1000
- length(attachments) is 0
- body.current_thread.text matches '\\bQ(\\.)?R(\\.)?\\b'
- body.current_thread.text matches 'scan|mobile|camera'
any of
ml.logo_detect(file.message_screenshot()).brandswhere:- .name starts with 'DocuSign'
any of
beta.scan_qr(file.message_screenshot()).itemswhere all hold:- .type is set
- .data matches '\\.'
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
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: beta.scan_qr, file.message_screenshot, ml.logo_detect, regex.contains, regex.icontains, strings.starts_with. Reference lists: $high_trust_sender_root_domains.
Indicators matched (4)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | \bQ(\.)?R(\.)?\b |
regex.icontains | regex | scan|mobile|camera |
strings.starts_with | prefix | DocuSign |
regex.contains | regex | \. |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
any(beta.scan_qr(file.message_screenshot()).items)
and
beta.scan_qr(file.message_screenshot()).items.data regex_match "\\."
beta.scan_qr(file.message_screenshot()).items.type is_not_null
any(ml.logo_detect(file.message_screenshot()).brands)
ml.logo_detect(file.message_screenshot()).brands.name starts_with "DocuSign"
attachments length_compare "0"
body.current_thread.text length_compare "1000"
body.current_thread.text regex_match "\\bQ(\\.)?R(\\.)?\\b"
body.current_thread.text regex_match "scan|mobile|camera"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Enbridge
#Impersonation of the Canadian energy company Enbridge.
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 |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
strings.ilike(sender.display_name, '*enbridge*')
or strings.ilike(sender.email.domain.domain, '*enbridge*')
or strings.ilike(subject.subject, '*enbridge*')
)
and any(body.links,
strings.ilike(.display_text, "*pay now*", "*view your bill*")
)
// negate replies
and (length(headers.references) == 0 or headers.in_reply_to is null)
and sender.email.domain.root_domain not in~ (
'enbridge.com',
'enbridgegas.com',
// Enbridge Subsidiaries
'domenergyoheb.com', // Dominion Energy Ohio
'domenergyuteb.com' // Dominion Energy Utah
)
Detection logic
Scope: inbound message.
Impersonation of the Canadian energy company Enbridge.
- inbound message
any of:
- sender.display_name matches '*enbridge*'
- sender.email.domain.domain matches '*enbridge*'
- subject.subject matches '*enbridge*'
any of
body.linkswhere:.display_text matches any of 2 patterns
*pay now**view your bill*
any of:
- length(headers.references) is 0
- headers.in_reply_to is missing
- sender.email.domain.root_domain not in ('enbridge.com', 'enbridgegas.com', 'domenergyoheb.com', 'domenergyuteb.com')
Inspects: body.links, body.links[].display_text, headers.in_reply_to, headers.references, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: strings.ilike.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *enbridge* |
strings.ilike | substring | *pay now* |
strings.ilike | substring | *view your bill* |
Stages and Predicates
Stage 1: mql_rule
and
any(body.links)
or
body.links.display_text match "pay now"
body.links.display_text match "view your bill"
or
headers.in_reply_to is_null
headers.references length_compare "0"
or
sender.display_name match "enbridge"
sender.email.domain.domain match "enbridge"
subject.subject match "enbridge"
not
sender.email.domain.root_domain in ["domenergyoheb.com", "domenergyuteb.com", "enbridge.com", "enbridgegas.com"]
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.email.domain.root_domain | in | domenergyoheb.com, domenergyuteb.com, enbridge.com, enbridgegas.com | excludes:sender.email.domain.root_domain |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
headers.in_reply_to | is_null | field:"headers.in_reply_to" kind:is_null | |
sender.display_name | wildcard |
| field:"sender.display_name" kind:wildcard value:"*enbridge*" |
sender.email.domain.domain | wildcard |
| field:"sender.email.domain.domain" kind:wildcard value:"*enbridge*" |
subject.subject | wildcard |
| field:"subject.subject" kind:wildcard value:"*enbridge*" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Evite
#Detects messages impersonating Evite invitations by looking for invitation language while not originating from legitimate Evite domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and strings.contains(body.html.raw, 'evitecdn.com')
and length(filter(html.xpath(body.html, '//img/@src').nodes,
// calling parse_url allows url decoding to help us
strings.parse_url(.raw).domain.root_domain == 'evitecdn.com'
)
) >= 2
and length(filter(body.links,
.href_url.domain.root_domain == "evite.com"
and regex.contains(.href_url.path, '^/_ct/[a-f0-9]{40}/')
)
) <= 4
and not (
(subject.is_forward or subject.is_reply)
and (length(headers.references) != 0 or headers.in_reply_to is not null)
and length(body.previous_threads) > 0
)
and not (
sender.email.domain.root_domain == "evite.com"
and headers.auth_summary.dmarc.pass
)
Detection logic
Scope: inbound message.
Detects messages impersonating Evite invitations by looking for invitation language while not originating from legitimate Evite domains.
- inbound message
- body.html.raw contains 'evitecdn.com'
- length(filter(html.xpath(body.html, '//img/@src').nodes, strings.parse_url(.raw).domain.root_domain == 'evitecdn.com')) ≥ 2
- length(filter(body.links, .href_url.domain.root_domain == 'evite.com' and regex.contains(.href_url.path, '^/_ct/[a-f0-9]{40}/'))) ≤ 4
not:
all of:
any of:
- subject.is_forward
- subject.is_reply
any of:
- length(headers.references) is not 0
- headers.in_reply_to is set
- length(body.previous_threads) > 0
not:
all of:
- sender.email.domain.root_domain is 'evite.com'
- headers.auth_summary.dmarc.pass
Inspects: body.html, body.html.raw, body.links, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.previous_threads, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: html.xpath, regex.contains, strings.contains, strings.parse_url.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
strings.contains | substring | evitecdn.com |
body.links[].href_url.domain.root_domain | equals | evite.com |
regex.contains | regex | ^/_ct/[a-f0-9]{40}/ |
Stages and Predicates
Stage 1: mql_rule
and
not
and
or
headers.in_reply_to is_not_null
headers.references length_compare "0"
or
subject.is_forward eq "true"
subject.is_reply eq "true"
body.previous_threads length_compare "0"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain eq "evite.com"
body.html.raw contains "evitecdn.com"
filter(body.links, .href_url.domain.root_domain == 'evite.com' and regex.contains(.href_url.path, '^/_ct/[a-f0-9]{40}/')) length_compare "4"
filter(html.xpath(body.html, '//img/@src').nodes, strings.parse_url(.raw).domain.root_domain == 'evitecdn.com') length_compare "2"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.in_reply_to | is_not_null | excludes:headers.in_reply_to | |
headers.references | length_compare | 0 | excludes:headers.references field:"headers.references" value:"0" |
subject.is_forward | eq | true | excludes:subject.is_forward field:"subject.is_forward" value:"true" |
subject.is_reply | eq | true | excludes:subject.is_reply field:"subject.is_reply" value:"true" |
body.previous_threads | length_compare | 0 | excludes:body.previous_threads field:"body.previous_threads" value:"0" |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | eq | evite.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"evite.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.html.raw | contains |
| field:"body.html.raw" kind:contains value:"evitecdn.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Fake procurement/RFQ PDF from energy and industrial companies
#Detects inbound PDF attachments impersonating well-known energy and industrial companies (Neste, TotalEnergies, Vattenfall, MOL Group, Unilever, Shell, Waldinger, Novo Nordisk) using fabricated procurement orders, requests for quotation, or supply chain solicitation documents. OCR is used to identify specific branding, addresses, and keywords embedded in these fraudulent PDF templates.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Impersonation: Brand, PDF, Social engineering, Image as content |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and any(filter(attachments, .file_extension == "pdf"),
//
// 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
//
(
strings.icontains(beta.ocr(.).text, "Neste Niederlande")
and strings.icontains(beta.ocr(.).text, "Antarcticaweg 185")
and strings.icontains(beta.ocr(.).text,
"NESTE PROCUREMENT ORDER",
"This is not a Purchase Order"
)
)
or (
strings.icontains(beta.ocr(.).text, "TotalEnergies Tower")
and strings.icontains(beta.ocr(.).text, "Louisiana")
and strings.icontains(beta.ocr(.).text, "SUPPLY CHAIN MANAGEMENT")
)
or (
strings.icontains(beta.ocr(.).text, "Vattenfall")
and strings.icontains(beta.ocr(.).text, "Hoekenrode 8")
and strings.icontains(beta.ocr(.).text, "SUPPLY CHAIN MANAGEMENT")
)
or (
strings.icontains(beta.ocr(.).text, "MOLGROUP", "MOL Ceská")
and strings.icontains(beta.ocr(.).text, "Purkynova 2121/3")
and strings.icontains(beta.ocr(.).text,
"REQUEST FOR PROPOSAL",
"This is not a Purchase Order"
)
)
or (
strings.icontains(beta.ocr(.).text,
"219 NORTH ROCKS ROAD",
"100 Victoria Embankment",
"WEENA 455"
)
and strings.icontains(beta.ocr(.).text,
"SUPPLY CHAIN MANAGEMENT",
"COMPULSORY BIDDERS MUST QUOTE",
"INVITATION TO TENDER",
"UNILEVER SUPPLY CHAIN RFQ"
)
)
or (
strings.icontains(beta.ocr(.).text, "Shell USA")
and strings.icontains(beta.ocr(.).text, "150 N Dairy Ashford Road")
and strings.icontains(beta.ocr(.).text,
"Public Tender Documentation",
"This is not a Purchase Order"
)
)
or (
strings.icontains(beta.ocr(.).text, "Waldinger Corporation")
and strings.icontains(beta.ocr(.).text, "6200 Scout Trail")
and strings.icontains(beta.ocr(.).text,
"REQUEST FOR QUOTATION",
"This is not a Purchase Order"
)
)
or (
strings.icontains(beta.ocr(.).text,
"NOVO NORDISK",
"nordisksourcingeu.com"
)
and strings.icontains(beta.ocr(.).text, "CARRE MICHELET")
and strings.icontains(beta.ocr(.).text,
"COMPULSORY BIDDERS MUST QUOTE",
"This is not a Purchase Order"
)
)
)
Detection logic
Scope: inbound message.
Detects inbound PDF attachments impersonating well-known energy and industrial companies (Neste, TotalEnergies, Vattenfall, MOL Group, Unilever, Shell, Waldinger, Novo Nordisk) using fabricated procurement orders, requests for quotation, or supply chain solicitation documents. OCR is used to identify specific branding, addresses, and keywords embedded in these fraudulent PDF templates.
- inbound message
any of
filter(attachments)where any holds:all of:
- beta.ocr(.).text contains 'Neste Niederlande'
- beta.ocr(.).text contains 'Antarcticaweg 185'
beta.ocr(.).text contains any of 2 patterns
NESTE PROCUREMENT ORDERThis is not a Purchase Order
all of:
- beta.ocr(.).text contains 'TotalEnergies Tower'
- beta.ocr(.).text contains 'Louisiana'
- beta.ocr(.).text contains 'SUPPLY CHAIN MANAGEMENT'
all of:
- beta.ocr(.).text contains 'Vattenfall'
- beta.ocr(.).text contains 'Hoekenrode 8'
- beta.ocr(.).text contains 'SUPPLY CHAIN MANAGEMENT'
all of:
beta.ocr(.).text contains any of 2 patterns
MOLGROUPMOL Ceská
- beta.ocr(.).text contains 'Purkynova 2121/3'
beta.ocr(.).text contains any of 2 patterns
REQUEST FOR PROPOSALThis is not a Purchase Order
all of:
beta.ocr(.).text contains any of 3 patterns
219 NORTH ROCKS ROAD100 Victoria EmbankmentWEENA 455
beta.ocr(.).text contains any of 4 patterns
SUPPLY CHAIN MANAGEMENTCOMPULSORY BIDDERS MUST QUOTEINVITATION TO TENDERUNILEVER SUPPLY CHAIN RFQ
all of:
- beta.ocr(.).text contains 'Shell USA'
- beta.ocr(.).text contains '150 N Dairy Ashford Road'
beta.ocr(.).text contains any of 2 patterns
Public Tender DocumentationThis is not a Purchase Order
all of:
- beta.ocr(.).text contains 'Waldinger Corporation'
- beta.ocr(.).text contains '6200 Scout Trail'
beta.ocr(.).text contains any of 2 patterns
REQUEST FOR QUOTATIONThis is not a Purchase Order
all of:
beta.ocr(.).text contains any of 2 patterns
NOVO NORDISKnordisksourcingeu.com
- beta.ocr(.).text contains 'CARRE MICHELET'
beta.ocr(.).text contains any of 2 patterns
COMPULSORY BIDDERS MUST QUOTEThis is not a Purchase Order
Inspects: attachments[].file_extension, type.inbound. Sensors: beta.ocr, strings.icontains.
Indicators matched (29)
| Field | Match | Value |
|---|---|---|
attachments[].file_extension | equals | pdf |
strings.icontains | substring | Neste Niederlande |
strings.icontains | substring | Antarcticaweg 185 |
strings.icontains | substring | NESTE PROCUREMENT ORDER |
strings.icontains | substring | This is not a Purchase Order |
strings.icontains | substring | TotalEnergies Tower |
strings.icontains | substring | Louisiana |
strings.icontains | substring | SUPPLY CHAIN MANAGEMENT |
strings.icontains | substring | Vattenfall |
strings.icontains | substring | Hoekenrode 8 |
strings.icontains | substring | MOLGROUP |
strings.icontains | substring | MOL Ceská |
17 more
strings.icontains | substring | Purkynova 2121/3 |
strings.icontains | substring | REQUEST FOR PROPOSAL |
strings.icontains | substring | 219 NORTH ROCKS ROAD |
strings.icontains | substring | 100 Victoria Embankment |
strings.icontains | substring | WEENA 455 |
strings.icontains | substring | COMPULSORY BIDDERS MUST QUOTE |
strings.icontains | substring | INVITATION TO TENDER |
strings.icontains | substring | UNILEVER SUPPLY CHAIN RFQ |
strings.icontains | substring | Shell USA |
strings.icontains | substring | 150 N Dairy Ashford Road |
strings.icontains | substring | Public Tender Documentation |
strings.icontains | substring | Waldinger Corporation |
strings.icontains | substring | 6200 Scout Trail |
strings.icontains | substring | REQUEST FOR QUOTATION |
strings.icontains | substring | NOVO NORDISK |
strings.icontains | substring | nordisksourcingeu.com |
strings.icontains | substring | CARRE MICHELET |
Stages and Predicates
Stage 1: mql_rule
and
any(filter(attachments))
or
and
or
beta.ocr(filter(attachments)[]).text contains "100 Victoria Embankment"
beta.ocr(filter(attachments)[]).text contains "219 NORTH ROCKS ROAD"
beta.ocr(filter(attachments)[]).text contains "WEENA 455"
or
beta.ocr(filter(attachments)[]).text contains "COMPULSORY BIDDERS MUST QUOTE"
beta.ocr(filter(attachments)[]).text contains "INVITATION TO TENDER"
beta.ocr(filter(attachments)[]).text contains "SUPPLY CHAIN MANAGEMENT"
beta.ocr(filter(attachments)[]).text contains "UNILEVER SUPPLY CHAIN RFQ"
and
or
beta.ocr(filter(attachments)[]).text contains "COMPULSORY BIDDERS MUST QUOTE"
beta.ocr(filter(attachments)[]).text contains "This is not a Purchase Order"
or
beta.ocr(filter(attachments)[]).text contains "NOVO NORDISK"
beta.ocr(filter(attachments)[]).text contains "nordisksourcingeu.com"
beta.ocr(filter(attachments)[]).text contains "CARRE MICHELET"
and
or
beta.ocr(filter(attachments)[]).text contains "MOL Ceská"
beta.ocr(filter(attachments)[]).text contains "MOLGROUP"
or
beta.ocr(filter(attachments)[]).text contains "REQUEST FOR PROPOSAL"
beta.ocr(filter(attachments)[]).text contains "This is not a Purchase Order"
beta.ocr(filter(attachments)[]).text contains "Purkynova 2121/3"
and
or
beta.ocr(filter(attachments)[]).text contains "NESTE PROCUREMENT ORDER"
beta.ocr(filter(attachments)[]).text contains "This is not a Purchase Order"
beta.ocr(filter(attachments)[]).text contains "Antarcticaweg 185"
beta.ocr(filter(attachments)[]).text contains "Neste Niederlande"
and
or
beta.ocr(filter(attachments)[]).text contains "Public Tender Documentation"
beta.ocr(filter(attachments)[]).text contains "This is not a Purchase Order"
beta.ocr(filter(attachments)[]).text contains "150 N Dairy Ashford Road"
beta.ocr(filter(attachments)[]).text contains "Shell USA"
and
or
beta.ocr(filter(attachments)[]).text contains "REQUEST FOR QUOTATION"
beta.ocr(filter(attachments)[]).text contains "This is not a Purchase Order"
beta.ocr(filter(attachments)[]).text contains "6200 Scout Trail"
beta.ocr(filter(attachments)[]).text contains "Waldinger Corporation"
and
beta.ocr(filter(attachments)[]).text contains "Hoekenrode 8"
beta.ocr(filter(attachments)[]).text contains "SUPPLY CHAIN MANAGEMENT"
beta.ocr(filter(attachments)[]).text contains "Vattenfall"
and
beta.ocr(filter(attachments)[]).text contains "Louisiana"
beta.ocr(filter(attachments)[]).text contains "SUPPLY CHAIN MANAGEMENT"
beta.ocr(filter(attachments)[]).text contains "TotalEnergies Tower"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Figma with malicious document access overlay
#"Detects malicious Figma design shares containing brand impersonation or credential phishing content. The rule identifies legitimate Figma share notifications where the embedded thumbnail preview contains "access document" text when OCR'd. Attackers create phishing designs (impersonating Microsoft, DocuSign, or other brands) within Figma, then share them via Figma's legitimate infrastructure to bypass sender reputation checks. The malicious content is rendered in the Figma-hosted thumbnail image itself."
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering, Image as content |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and sender.email.email == "no-reply@email.figma.com"
and strings.icontains(subject.base, "proposal")
and length(html.xpath(body.html,
"//img[contains(@src, 'https://api-cdn.figma.com/resize/thumbnails')]"
).nodes
) == 1
//
// 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 strings.icontains(beta.ocr(file.message_screenshot()).text,
'access document'
)
Detection logic
Scope: inbound message.
"Detects malicious Figma design shares containing brand impersonation or credential phishing content. The rule identifies legitimate Figma share notifications where the embedded thumbnail preview contains "access document" text when OCR'd. Attackers create phishing designs (impersonating Microsoft, DocuSign, or other brands) within Figma, then share them via Figma's legitimate infrastructure to bypass sender reputation checks. The malicious content is rendered in the Figma-hosted thumbnail image itself."
- inbound message
- sender.email.email is 'no-reply@email.figma.com'
- subject.base contains 'proposal'
- length(html.xpath(body.html, "//img[contains(@src, 'https://api-cdn.figma.com/resize/thumbnails')]").nodes) is 1
- beta.ocr(file.message_screenshot()).text contains 'access document'
Inspects: body.html, sender.email.email, subject.base, type.inbound. Sensors: beta.ocr, file.message_screenshot, html.xpath, strings.icontains.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | no-reply@email.figma.com |
strings.icontains | substring | proposal |
strings.icontains | substring | access document |
Stages and Predicates
Stage 1: mql_rule
and
beta.ocr(file.message_screenshot()).text contains "access document"
html.xpath(body.html, "//img[contains(@src, 'https://api-cdn.figma.com/resize/thumbnails')]").nodes length_compare "1"
sender.email.email eq "no-reply@email.figma.com"
subject.base contains "proposal"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
beta.ocr(file.message_screenshot()).text | contains |
| field:"beta.ocr(file.message_screenshot()).text" kind:contains value:"access document" |
sender.email.email | eq |
| field:"sender.email.email" kind:eq value:"no-reply@email.figma.com" |
subject.base | contains |
| field:"subject.base" kind:contains value:"proposal" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand Impersonation: Gemini Trust Company
#Detects messages impersonating Gemini Trust Company through analysis of footer content, social media links, and address verification, excluding legitimate communications from authenticated Gemini domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
// the address in the footer
(
regex.icontains(body.current_thread.text,
"600 Third Avenue.{1,2}2nd Floor.{1,2}New York, NY"
)
and strings.icontains(body.current_thread.text, "Gemini Trust Company")
)
// logo detect combined with sender display name
// need to be more specific here due to other uses of the word "Gemini"
or (
sender.display_name =~ "Gemini"
and any(ml.logo_detect(file.message_screenshot()).brands,
.name == "Gemini Trust" and .confidence != "low"
)
)
// copyright footer
or strings.icontains(body.current_thread.text,
'© 2025 Gemini Trust Company, LLC'
)
// the social links in the footer
or (
length(filter(body.links,
strings.icontains(.href_url.url,
'https://www.instagram.com/gemini/'
)
or strings.icontains(.href_url.url,
'https://www.linkedin.com/company/geminitrust/'
)
or strings.icontains(.href_url.url,
'https://facebook.com/GeminiTrust'
)
or strings.icontains(.href_url.url,
'https://twitter.com/Gemini'
)
or strings.icontains(.href_url.url,
'https://support.gemini.com/hc/en-us/requests/new'
)
or strings.icontains(.href_url.url,
'https://support.gemini.com/hc/en-us/requests/new'
)
)
) >= 4
)
)
// not forwards/replies
and not (
length(headers.references) > 0
and (subject.is_forward or subject.is_reply)
and length(body.previous_threads) >= 1
)
// not from Gemini actual
and not (
sender.email.domain.root_domain in (
"gemini.com",
"niftygateway.com" // NFT market place owned by Gemini Trust Company
)
and headers.auth_summary.dmarc.pass
)
Detection logic
Scope: inbound message.
Detects messages impersonating Gemini Trust Company through analysis of footer content, social media links, and address verification, excluding legitimate communications from authenticated Gemini domains.
- inbound message
any of:
all of:
- body.current_thread.text matches '600 Third Avenue.{1,2}2nd Floor.{1,2}New York, NY'
- body.current_thread.text contains 'Gemini Trust Company'
all of:
- sender.display_name is 'Gemini'
any of
ml.logo_detect(file.message_screenshot()).brandswhere all hold:- .name is 'Gemini Trust'
- .confidence is not 'low'
- body.current_thread.text contains '© 2025 Gemini Trust Company, LLC'
- length(filter(body.links, strings.icontains(.href_url.url, 'https://www.instagram.com/gemini/') or strings.icontains(.href_url.url, 'https://www.linkedin.com/company/geminitrust/') or strings.icontains(.href_url.url, 'https://facebook.com/GeminiTrust') or strings.icontains(.href_url.url, 'https://twitter.com/Gemini') or strings.icontains(.href_url.url, 'https://support.gemini.com/hc/en-us/requests/new') or strings.icontains(.href_url.url, 'https://support.gemini.com/hc/en-us/requests/new'))) ≥ 4
not:
all of:
- length(headers.references) > 0
any of:
- subject.is_forward
- subject.is_reply
- length(body.previous_threads) ≥ 1
not:
all of:
- sender.email.domain.root_domain in ('gemini.com', 'niftygateway.com')
- headers.auth_summary.dmarc.pass
Inspects: body.current_thread.text, body.links, body.links[].href_url.url, body.previous_threads, headers.auth_summary.dmarc.pass, headers.references, sender.display_name, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: file.message_screenshot, ml.logo_detect, regex.icontains, strings.icontains.
Indicators matched (10)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | 600 Third Avenue.{1,2}2nd Floor.{1,2}New York, NY |
strings.icontains | substring | Gemini Trust Company |
sender.display_name | equals | Gemini |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | Gemini Trust |
strings.icontains | substring | © 2025 Gemini Trust Company, LLC |
strings.icontains | substring | https://www.instagram.com/gemini/ |
strings.icontains | substring | https://www.linkedin.com/company/geminitrust/ |
strings.icontains | substring | https://facebook.com/GeminiTrust |
strings.icontains | substring | https://twitter.com/Gemini |
strings.icontains | substring | https://support.gemini.com/hc/en-us/requests/new |
Stages and Predicates
Stage 1: mql_rule
and
or
and
any(ml.logo_detect(file.message_screenshot()).brands)
and
ml.logo_detect(file.message_screenshot()).brands.confidence ne "low"
ml.logo_detect(file.message_screenshot()).brands.name eq "Gemini Trust"
sender.display_name eq "Gemini"
and
body.current_thread.text contains "Gemini Trust Company"
body.current_thread.text regex_match "600 Third Avenue.{1,2}2nd Floor.{1,2}New York, NY"
body.current_thread.text contains "© 2025 Gemini Trust Company, LLC"
filter(body.links, strings.icontains(.href_url.url, 'https://www.instagram.com/gemini/') or strings.icontains(.href_url.url, 'https://www.linkedin.com/company/geminitrust/') or strings.icontains(.href_url.url, 'https://facebook.com/GeminiTrust') or strings.icontains(.href_url.url, 'https://twitter.com/Gemini') or strings.icontains(.href_url.url, 'https://support.gemini.com/hc/en-us/requests/new') or strings.icontains(.href_url.url, 'https://support.gemini.com/hc/en-us/requests/new')) length_compare "4"
not
and
or
subject.is_forward eq "true"
subject.is_reply eq "true"
body.previous_threads length_compare "1"
headers.references length_compare "0"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["gemini.com", "niftygateway.com"]
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
subject.is_forward | eq | true | excludes:subject.is_forward field:"subject.is_forward" value:"true" |
subject.is_reply | eq | true | excludes:subject.is_reply field:"subject.is_reply" value:"true" |
body.previous_threads | length_compare | 1 | excludes:body.previous_threads field:"body.previous_threads" value:"1" |
headers.references | length_compare | 0 | excludes:headers.references field:"headers.references" value:"0" |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | gemini.com, niftygateway.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"gemini.com" field:"sender.email.domain.root_domain" value:"niftygateway.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match value:"600 Third Avenue.{1,2}2nd Floor.{1,2}New York, NY" |
sender.display_name | eq |
| field:"sender.display_name" kind:eq value:"Gemini" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: GoDaddy
#Detects messages where the sender is impersonating GoDaddy through display name manipulation or lookalike domains, while not being legitimately authenticated from GoDaddy's infrastructure.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
strings.icontains(sender.display_name, 'godaddy')
or strings.ilevenshtein(sender.display_name, 'godaddy') <= 1
or strings.icontains(sender.email.domain.domain, 'godaddy')
)
and not (
sender.email.domain.root_domain in (
"godaddy.com",
"registry.godaddy",
"sucuri.net"
)
and headers.auth_summary.dmarc.pass
)
and not profile.by_sender().solicited
// 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
)
Detection logic
Scope: inbound message.
Detects messages where the sender is impersonating GoDaddy through display name manipulation or lookalike domains, while not being legitimately authenticated from GoDaddy's infrastructure.
- inbound message
any of:
- sender.display_name contains 'godaddy'
- sender.display_name is similar to 'godaddy'
- sender.email.domain.domain contains 'godaddy'
not:
all of:
- sender.email.domain.root_domain in ('godaddy.com', 'registry.godaddy', 'sucuri.net')
- headers.auth_summary.dmarc.pass
not:
- profile.by_sender().solicited
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
Inspects: headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: profile.by_sender, strings.icontains, strings.ilevenshtein. Reference lists: $high_trust_sender_root_domains.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | godaddy |
strings.ilevenshtein | fuzzy | godaddy |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["godaddy.com", "registry.godaddy", "sucuri.net"]
not
profile.by_sender func_call "profile.by_sender().solicited"
or
sender.display_name contains "godaddy"
sender.email.domain.domain contains "godaddy"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"godaddy\") <= 1"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | godaddy.com, registry.godaddy, sucuri.net | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"godaddy.com" field:"sender.email.domain.root_domain" value:"registry.godaddy" field:"sender.email.domain.root_domain" value:"sucuri.net" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.display_name | contains |
| field:"sender.display_name" kind:contains value:"godaddy" |
sender.email.domain.domain | contains |
| field:"sender.email.domain.domain" kind:contains value:"godaddy" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Google Careers
#Detects messages impersonating Google Careers or job opportunities in multiple languages that contain links to domains other than Google's legitimate domains, from senders not authenticated as Google.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
strings.icontains(body.current_thread.text, 'Google Careers')
or strings.icontains(body.current_thread.text, 'GoogleCareers')
// Spanish
or strings.icontains(body.current_thread.text, 'Google Carreras')
or strings.icontains(body.current_thread.text, 'GoogleCarreras')
// German Norwegian
or strings.icontains(body.current_thread.text, 'Google Karriere')
or strings.icontains(body.current_thread.text, 'GoogleKarriere')
// Swedish
or strings.icontains(body.current_thread.text, 'Google Karriär')
or strings.icontains(body.current_thread.text, 'GoogleKarriär')
// Dutch
or strings.icontains(body.current_thread.text, 'Google Carrières')
or strings.icontains(body.current_thread.text, 'GoogleCarrières')
// Turkish
or strings.icontains(body.current_thread.text, 'Google Kariyer')
or strings.icontains(body.current_thread.text, 'GoogleKariyer')
// The screenshot OCR captures google careers or the google logo
or (
sender.email.domain.root_domain == "salesforce.com"
and (
regex.icontains(beta.ocr(file.message_screenshot()).text,
"google careers"
)
or any(ml.logo_detect(file.message_screenshot()).brands,
strings.starts_with(.name, "Google")
)
)
)
)
and not any(body.links, .href_url.domain.root_domain in ("google.com", "c.gle"))
and not (
sender.email.domain.root_domain in ("google.com", "sublimesecurity.com")
and headers.auth_summary.dmarc.pass
)
Detection logic
Scope: inbound message.
Detects messages impersonating Google Careers or job opportunities in multiple languages that contain links to domains other than Google's legitimate domains, from senders not authenticated as Google.
- inbound message
any of:
- body.current_thread.text contains 'Google Careers'
- body.current_thread.text contains 'GoogleCareers'
- body.current_thread.text contains 'Google Carreras'
- body.current_thread.text contains 'GoogleCarreras'
- body.current_thread.text contains 'Google Karriere'
- body.current_thread.text contains 'GoogleKarriere'
- body.current_thread.text contains 'Google Karriär'
- body.current_thread.text contains 'GoogleKarriär'
- body.current_thread.text contains 'Google Carrières'
- body.current_thread.text contains 'GoogleCarrières'
- body.current_thread.text contains 'Google Kariyer'
- body.current_thread.text contains 'GoogleKariyer'
all of:
- sender.email.domain.root_domain is 'salesforce.com'
any of:
- beta.ocr(file.message_screenshot()).text matches 'google careers'
any of
ml.logo_detect(file.message_screenshot()).brandswhere:- .name starts with 'Google'
not:
any of
body.linkswhere:- .href_url.domain.root_domain in ('google.com', 'c.gle')
not:
all of:
- sender.email.domain.root_domain in ('google.com', 'sublimesecurity.com')
- headers.auth_summary.dmarc.pass
Inspects: body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, regex.icontains, strings.icontains, strings.starts_with.
Indicators matched (15)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | Google Careers |
strings.icontains | substring | GoogleCareers |
strings.icontains | substring | Google Carreras |
strings.icontains | substring | GoogleCarreras |
strings.icontains | substring | Google Karriere |
strings.icontains | substring | GoogleKarriere |
strings.icontains | substring | Google Karriär |
strings.icontains | substring | GoogleKarriär |
strings.icontains | substring | Google Carrières |
strings.icontains | substring | GoogleCarrières |
strings.icontains | substring | Google Kariyer |
strings.icontains | substring | GoogleKariyer |
3 more
sender.email.domain.root_domain | equals | salesforce.com |
regex.icontains | regex | google careers |
strings.starts_with | prefix | Google |
Stages and Predicates
Stage 1: mql_rule
and
or
and
or
any(ml.logo_detect(file.message_screenshot()).brands)
ml.logo_detect(file.message_screenshot()).brands.name starts_with "Google"
beta.ocr(file.message_screenshot()).text regex_match "google careers"
sender.email.domain.root_domain eq "salesforce.com"
body.current_thread.text contains "Google Careers"
body.current_thread.text contains "Google Carreras"
body.current_thread.text contains "Google Carrières"
body.current_thread.text contains "Google Kariyer"
body.current_thread.text contains "Google Karriere"
body.current_thread.text contains "Google Karriär"
body.current_thread.text contains "GoogleCareers"
body.current_thread.text contains "GoogleCarreras"
body.current_thread.text contains "GoogleCarrières"
body.current_thread.text contains "GoogleKariyer"
body.current_thread.text contains "GoogleKarriere"
body.current_thread.text contains "GoogleKarriär"
not
any(body.links)
body.links.href_url.domain.root_domain in ["c.gle", "google.com"]
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["google.com", "sublimesecurity.com"]
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
body.links | array_any | excludes:body.links | |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | google.com, sublimesecurity.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"google.com" field:"sender.email.domain.root_domain" value:"sublimesecurity.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
beta.ocr(file.message_screenshot()).text | regex_match |
| field:"beta.ocr(file.message_screenshot()).text" kind:regex_match value:"google careers" |
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
sender.email.domain.root_domain | eq |
| field:"sender.email.domain.root_domain" kind:eq value:"salesforce.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Google Meet with malicious link
#Detects messages with 'Join with Google Meet' display text that redirects to domains other than meet.google.com.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and any(body.current_thread.links,
.display_text in (
"Join with Google Meet",
"Reply or Join with Google Meet"
)
and not strings.contains(.href_url.domain.domain, "meet.google.com")
)
and (
// finding the logo tag in the html
any(html.xpath(body.html, '//img[@alt="[Optional Logo]"]').nodes,
.raw is not null
)
or any(html.xpath(body.html, '//img[@alt="Google Meet"]').nodes,
.raw is not null
)
// OR find the green button
or any(html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes,
.display_text == "Join with Google Meet"
)
)
// finding the "Guests"/"Join by phone" tables NOT being present in the message is a good way to filter out the legit messages.
and length(html.xpath(body.html,
'//table/tbody/tr/td/h2[contains(@style, "color:rgb(60,64,67)")]'
).nodes
) == 0
// we're filtering out some more "generic" table heading for google meets with this one
and not any(distinct(map(html.xpath(body.html, '//table//h2').nodes,
.inner_text
)
),
. in ("Meeting link", "Join by phone", "Guests")
)
Detection logic
Scope: inbound message.
Detects messages with 'Join with Google Meet' display text that redirects to domains other than meet.google.com.
- inbound message
any of
body.current_thread.linkswhere all hold:- .display_text in ('Join with Google Meet', 'Reply or Join with Google Meet')
not:
- .href_url.domain.domain contains 'meet.google.com'
any of:
any of
html.xpath(body.html, '//img[@alt="[Optional Logo]"]').nodeswhere:- .raw is set
any of
html.xpath(body.html, '//img[@alt="Google Meet"]').nodeswhere:- .raw is set
any of
html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodeswhere:- .display_text is 'Join with Google Meet'
- length(html.xpath(body.html, '//table/tbody/tr/td/h2[contains(@style, "color:rgb(60,64,67)")]').nodes) is 0
not:
any of
distinct(...)where:- . in ('Meeting link', 'Join by phone', 'Guests')
Inspects: body.current_thread.links, body.current_thread.links[].display_text, body.current_thread.links[].href_url.domain.domain, body.html, type.inbound. Sensors: html.xpath, strings.contains.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
body.current_thread.links[].display_text | member | Join with Google Meet |
body.current_thread.links[].display_text | member | Reply or Join with Google Meet |
html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes[].display_text | equals | Join with Google Meet |
Stages and Predicates
Stage 1: mql_rule
and
any(body.current_thread.links)
and
not
body.current_thread.links.href_url.domain.domain contains "meet.google.com"
body.current_thread.links.display_text in ["Join with Google Meet", "Reply or Join with Google Meet"]
not
any(distinct(...))
distinct(...) in ["Guests", "Join by phone", "Meeting link"]
or
any(html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes)
html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes.display_text eq "Join with Google Meet"
any(html.xpath(body.html, '//img[@alt="Google Meet"]').nodes)
html.xpath(body.html, '//img[@alt="Google Meet"]').nodes.raw is_not_null
any(html.xpath(body.html, '//img[@alt="[Optional Logo]"]').nodes)
html.xpath(body.html, '//img[@alt="[Optional Logo]"]').nodes.raw is_not_null
html.xpath(body.html, '//table/tbody/tr/td/h2[contains(@style, "color:rgb(60,64,67)")]').nodes length_compare "0"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
distinct(...) | array_any | excludes:distinct(...) |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Greenvelope
#Detects messages impersonating Greenvelope invitations not originating from legitimate Greenvelope domain.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Looking for greenvelope phrasing or indicators in HTML
and (
strings.icontains(body.html.inner_text, "Powered by greenvelope")
// Look for alt text in HTML for standardized greenvelope formatting if string is not avail.
or strings.icontains(body.html.raw, 'alt="Greenvelope"')
or strings.icontains(body.html.raw,
'https://www.greenvelope.com/viewer/envelope.ashx'
)
or strings.icontains(body.current_thread.text, '© 2025 Greenvelope, LLC')
or strings.icontains(body.current_thread.text,
'8 The Green #8901, Dover, DE 19901'
)
)
// no links going to greenvlope cards/"admin" links
and length(filter(body.links,
.href_url.domain.root_domain == "greenvelope.com"
and (
// card links
strings.istarts_with(.href_url.path, '/card/')
// user links are links for the person that created the card
or strings.istarts_with(.href_url.path, '/user/')
)
)
) == 0
// Legitimate sender will be from greenvelope, negating known non-associated domains.
and not (
(
sender.email.domain.root_domain in (
"greenvelope.com",
'greenvelope-email.com'
)
and headers.auth_summary.spf.pass
)
or headers.return_path.domain.root_domain in (
"greenvelope.com",
'greenvelope-email.com'
)
)
// avoid fwd/replies
and not (
subject.is_forward
or subject.is_reply
or length(headers.references) != 0
or headers.in_reply_to is not null
or length(body.previous_threads) > 0
)
// Capping length to limit FP's
and length(body.current_thread.text) < 1500
Detection logic
Scope: inbound message.
Detects messages impersonating Greenvelope invitations not originating from legitimate Greenvelope domain.
- inbound message
any of:
- body.html.inner_text contains 'Powered by greenvelope'
- body.html.raw contains 'alt="Greenvelope"'
- body.html.raw contains 'https://www.greenvelope.com/viewer/envelope.ashx'
- body.current_thread.text contains '© 2025 Greenvelope, LLC'
- body.current_thread.text contains '8 The Green #8901, Dover, DE 19901'
- length(filter(body.links, .href_url.domain.root_domain == 'greenvelope.com' and strings.istarts_with(.href_url.path, '/card/') or strings.istarts_with(.href_url.path, '/user/'))) is 0
none of:
all of:
- sender.email.domain.root_domain in ('greenvelope.com', 'greenvelope-email.com')
- headers.auth_summary.spf.pass
- headers.return_path.domain.root_domain in ('greenvelope.com', 'greenvelope-email.com')
none of:
- subject.is_forward
- subject.is_reply
- length(headers.references) is not 0
- headers.in_reply_to is set
- length(body.previous_threads) > 0
- length(body.current_thread.text) < 1500
Inspects: body.current_thread.text, body.html.inner_text, body.html.raw, body.links, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.previous_threads, headers.auth_summary.spf.pass, headers.in_reply_to, headers.references, headers.return_path.domain.root_domain, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: strings.icontains, strings.istarts_with.
Indicators matched (8)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | Powered by greenvelope |
strings.icontains | substring | alt="Greenvelope" |
strings.icontains | substring | https://www.greenvelope.com/viewer/envelope.ashx |
strings.icontains | substring | © 2025 Greenvelope, LLC |
strings.icontains | substring | 8 The Green #8901, Dover, DE 19901 |
body.links[].href_url.domain.root_domain | equals | greenvelope.com |
strings.istarts_with | prefix | /card/ |
strings.istarts_with | prefix | /user/ |
Stages and Predicates
Stage 1: mql_rule
and
not
or
and
headers.auth_summary.spf.pass eq "true"
sender.email.domain.root_domain in ["greenvelope-email.com", "greenvelope.com"]
headers.return_path.domain.root_domain in ["greenvelope-email.com", "greenvelope.com"]
not
or
body.previous_threads length_compare "0"
headers.in_reply_to is_not_null
headers.references length_compare "0"
subject.is_forward eq "true"
subject.is_reply eq "true"
or
body.current_thread.text contains "8 The Green #8901, Dover, DE 19901"
body.current_thread.text contains "© 2025 Greenvelope, LLC"
body.html.inner_text contains "Powered by greenvelope"
body.html.raw contains "alt=\"Greenvelope\""
body.html.raw contains "https://www.greenvelope.com/viewer/envelope.ashx"
body.current_thread.text length_compare "1500"
filter(body.links, .href_url.domain.root_domain == 'greenvelope.com' and strings.istarts_with(.href_url.path, '/card/') or strings.istarts_with(.href_url.path, '/user/')) length_compare "0"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.html.inner_text | contains |
| field:"body.html.inner_text" kind:contains value:"Powered by greenvelope" |
body.html.raw | contains |
| field:"body.html.raw" kind:contains |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Hulu
#Impersonation of Hulu.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, Spam |
| Tactics and techniques | Free email provider, Impersonation: Brand, Lookalike domain, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
regex.icontains(sender.display_name, '\bhulu\b')
or (
strings.ilevenshtein(sender.display_name, 'hulu') <= 1
and not (
// lulu.com is a self publisher
sender.display_name =~ "lulu"
and sender.email.domain.root_domain == "lulu.com"
)
and not (
// hudu.com is an IT documentation management platform
sender.display_name =~ "hudu"
and sender.email.domain.root_domain == "hudu.com"
)
)
or strings.ilike(sender.email.domain.domain, '*hulu*')
or (
(
length(recipients.to) == 0
or (
all(recipients.to, .email.domain.valid == false)
and all(recipients.cc, .email.domain.valid == false)
)
)
and any(ml.logo_detect(file.message_screenshot()).brands,
.name == "Hulu" and .confidence in ("medium", "high")
)
)
)
and (
sender.email.domain.root_domain not in (
'hulu.com',
'hulumail.com',
'hulu.jp',
'hulu-japan.jp'
)
or (
sender.email.domain.root_domain in (
'hulu.com',
'hulumail.com',
'hulu.jp',
'hulu-japan.jp'
)
and not headers.auth_summary.dmarc.pass
)
)
and not profile.by_sender().solicited
Detection logic
Scope: inbound message.
Impersonation of Hulu.
- inbound message
any of:
- sender.display_name matches '\\bhulu\\b'
all of:
- sender.display_name is similar to 'hulu'
not:
all of:
- sender.display_name is 'lulu'
- sender.email.domain.root_domain is 'lulu.com'
not:
all of:
- sender.display_name is 'hudu'
- sender.email.domain.root_domain is 'hudu.com'
- sender.email.domain.domain matches '*hulu*'
all of:
any of:
- length(recipients.to) is 0
all of:
all of
recipients.towhere:- .email.domain.valid is False
all of
recipients.ccwhere:- .email.domain.valid is False
any of
ml.logo_detect(file.message_screenshot()).brandswhere all hold:- .name is 'Hulu'
- .confidence in ('medium', 'high')
any of:
- sender.email.domain.root_domain not in ('hulu.com', 'hulumail.com', 'hulu.jp', 'hulu-japan.jp')
all of:
- sender.email.domain.root_domain in ('hulu.com', 'hulumail.com', 'hulu.jp', 'hulu-japan.jp')
not:
- headers.auth_summary.dmarc.pass
not:
- profile.by_sender().solicited
Inspects: headers.auth_summary.dmarc.pass, recipients.cc, recipients.cc[].email.domain.valid, recipients.to, recipients.to[].email.domain.valid, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: file.message_screenshot, ml.logo_detect, profile.by_sender, regex.icontains, strings.ilevenshtein, strings.ilike.
Indicators matched (10)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | \bhulu\b |
strings.ilevenshtein | fuzzy | hulu |
strings.ilike | substring | *hulu* |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | Hulu |
ml.logo_detect(file.message_screenshot()).brands[].confidence | member | medium |
ml.logo_detect(file.message_screenshot()).brands[].confidence | member | high |
sender.email.domain.root_domain | member | hulu.com |
sender.email.domain.root_domain | member | hulumail.com |
sender.email.domain.root_domain | member | hulu.jp |
sender.email.domain.root_domain | member | hulu-japan.jp |
Stages and Predicates
Stage 1: mql_rule
and
or
and
any(ml.logo_detect(file.message_screenshot()).brands)
and
ml.logo_detect(file.message_screenshot()).brands.confidence in ["high", "medium"]
ml.logo_detect(file.message_screenshot()).brands.name eq "Hulu"
or
and
macro "all(recipients.cc)"
macro "all(recipients.to)"
recipients.to length_compare "0"
and
not
and
sender.display_name eq "hudu"
sender.email.domain.root_domain eq "hudu.com"
not
and
sender.display_name eq "lulu"
sender.email.domain.root_domain eq "lulu.com"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"hulu\") <= 1"
sender.display_name regex_match "\\bhulu\\b"
sender.email.domain.domain match "hulu"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["hulu-japan.jp", "hulu.com", "hulu.jp", "hulumail.com"]
not
sender.email.domain.root_domain in ["hulu-japan.jp", "hulu.com", "hulu.jp", "hulumail.com"]
not
profile.by_sender func_call "profile.by_sender().solicited"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match value:"\bhulu\b" |
sender.email.domain.domain | wildcard |
| field:"sender.email.domain.domain" kind:wildcard value:"*hulu*" |
sender.email.domain.root_domain | in |
| field:"sender.email.domain.root_domain" kind:in |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Interac
#Impersonation of the Canadian interbanking network Interac. Seen in the wild impersonating carbon tax rebates and tax return refunds.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Impersonation: Brand, Lookalike domain, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
strings.ilike(sender.display_name, '*interac e-transfer*')
or strings.ilike(sender.display_name, "*interac e?trasfer*")
or strings.ilike(subject.subject, '*interac e-transfer*')
or strings.ilevenshtein(sender.display_name, 'interac e-transfer') <= 2
)
and sender.email.domain.root_domain not in ('interac.ca')
and 1 of (
any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "org" and strings.icontains(.text, "interac")
),
any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "financial"
),
)
and not profile.by_sender().solicited
// 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
)
Detection logic
Scope: inbound message.
Impersonation of the Canadian interbanking network Interac. Seen in the wild impersonating carbon tax rebates and tax return refunds.
- inbound message
any of:
- sender.display_name matches '*interac e-transfer*'
- sender.display_name matches '*interac e?trasfer*'
- subject.subject matches '*interac e-transfer*'
- sender.display_name is similar to 'interac e-transfer'
- sender.email.domain.root_domain not in ('interac.ca')
at least 1 of:
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name is 'org'
- .text contains 'interac'
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere:- .name is 'financial'
not:
- profile.by_sender().solicited
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
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender, strings.icontains, strings.ilevenshtein, strings.ilike. Reference lists: $high_trust_sender_root_domains.
Indicators matched (6)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *interac e-transfer* |
strings.ilike | substring | *interac e?trasfer* |
strings.ilevenshtein | fuzzy | interac e-transfer |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | org |
strings.icontains | substring | interac |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | financial |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name eq "org"
ml.nlu_classifier(body.current_thread.text).entities.text contains "interac"
any(ml.nlu_classifier(body.current_thread.text).entities)
ml.nlu_classifier(body.current_thread.text).entities.name eq "financial"
not
profile.by_sender func_call "profile.by_sender().solicited"
or
sender.display_name match "interac e-transfer"
sender.display_name match "interac e?trasfer"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"interac e-transfer\") <= 2"
subject.subject match "interac e-transfer"
not
sender.email.domain.root_domain eq "interac.ca"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.email.domain.root_domain | eq | interac.ca | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"interac.ca" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.display_name | wildcard |
| field:"sender.display_name" kind:wildcard |
subject.subject | wildcard |
| field:"subject.subject" kind:wildcard value:"*interac e-transfer*" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Internal Revenue Service
#Detects messages from senders posing as the Internal Revenue Service by checking display name similarity and content indicators from body text and screenshots. Excludes legitimate IRS domains and authenticated senders.
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 |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
// display name contains IRS
(
strings.ilike(strings.replace_confusables(sender.display_name),
'*internal revenue service*'
)
or strings.like(strings.replace_confusables(sender.display_name), 'IRS*')
or regex.icontains(strings.replace_confusables(sender.display_name),
'\birs.gov'
)
or regex.icontains(strings.replace_confusables(sender.display_name),
'internal.{0,5}revenue.{0,5}service'
)
)
// levenshtein distance similar to IRS
or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
'internal revenue service'
) <= 1
or (
strings.like(strings.replace_confusables(subject.base), '*IRS*')
and any(ml.nlu_classifier(body.current_thread.text).topics,
.name == "Government Services" and .confidence != "low"
)
)
or 2 of (
strings.icontains(body.current_thread.text, "Internal Revenue Service"),
strings.icontains(body.current_thread.text, "4228 Park Ave S"),
strings.icontains(body.current_thread.text, "1111 Constitution Ave"),
strings.icontains(body.current_thread.text, "New York, New York 10003"),
strings.icontains(body.current_thread.text, "Washington, DC 20224")
)
or regex.icontains(body.current_thread.text,
'©\s*20[0-9]{2}\s*\s*Internal Revenue Service'
)
)
and (
(
any(ml.nlu_classifier(body.current_thread.text).topics,
.name in ("Security and Authentication", "Financial Communications")
and .confidence == "high"
)
and not any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Advertising and Promotions",
"Newsletters and Digests",
"Political Mail",
"Events and Webinars"
)
and .confidence != "low"
)
)
or (
// OCR length is more than 2x the current_thread length
// indicating that the body is mostly an image
(
(length(beta.ocr(file.message_screenshot()).text) + 0.0) / (
length(body.current_thread.text) + 0.0
)
) > 2
and length(body.previous_threads) == 0
and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in ("Security and Authentication", "Financial Communications")
and .confidence == "high"
)
and not any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in (
"Advertising and Promotions",
"Newsletters and Digests",
"Political Mail",
"Events and Webinars"
)
and .confidence != "low"
)
)
or 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 not (
(
length(body.current_thread.text) > 2500
or any(headers.hops,
any(.fields,
.name == 'List-Unsubscribe-Post'
and .value == 'List-Unsubscribe=One-Click'
)
)
)
and any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "benign" and .confidence == "high"
)
)
// and the sender is not in org_domains or from .gov domains and passes auth
and not (
sender.email.domain.root_domain in $org_domains
or (
(
sender.email.domain.root_domain in ("govdelivery.com", "ms-cpa.org")
or sender.email.domain.tld == "gov"
)
and headers.auth_summary.dmarc.pass
)
)
// and the sender is not from high trust sender root domains
and not (
sender.email.domain.root_domain in $high_trust_sender_root_domains
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
Detects messages from senders posing as the Internal Revenue Service by checking display name similarity and content indicators from body text and screenshots. Excludes legitimate IRS domains and authenticated senders.
- inbound message
any of:
strings.replace_confusables(sender.display_name) matches any of 4 patterns
*internal revenue service*IRS*\birs.govinternal.{0,5}revenue.{0,5}service
- strings.replace_confusables(sender.display_name) is similar to 'internal revenue service'
all of:
- strings.replace_confusables(subject.base) matches '*IRS*'
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name is 'Government Services'
- .confidence is not 'low'
at least 2 of 5: body.current_thread.text contains any of 5 patterns
Internal Revenue Service4228 Park Ave S1111 Constitution AveNew York, New York 10003Washington, DC 20224
- body.current_thread.text matches '©\\s*20[0-9]{2}\\s*\\s*Internal Revenue Service'
any of:
all of:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Security and Authentication', 'Financial Communications')
- .confidence is 'high'
not:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Advertising and Promotions', 'Newsletters and Digests', 'Political Mail', 'Events and Webinars')
- .confidence is not 'low'
all of:
- length(beta.ocr(file.message_screenshot()).text) + 0.0 / length(body.current_thread.text) + 0.0 > 2
- length(body.previous_threads) is 0
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Security and Authentication', 'Financial Communications')
- .confidence is 'high'
not:
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Advertising and Promotions', 'Newsletters and Digests', 'Political Mail', 'Events and Webinars')
- .confidence is not 'low'
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'
not:
all of:
any of:
- length(body.current_thread.text) > 2500
any of
headers.hopswhere:any of
.fieldswhere all hold:- .name is 'List-Unsubscribe-Post'
- .value is 'List-Unsubscribe=One-Click'
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name is 'benign'
- .confidence is 'high'
none of:
- sender.email.domain.root_domain in $org_domains
all of:
any of:
- sender.email.domain.root_domain in ('govdelivery.com', 'ms-cpa.org')
- sender.email.domain.tld is 'gov'
- headers.auth_summary.dmarc.pass
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass)
Inspects: body.current_thread.text, body.previous_threads, headers.auth_summary.dmarc.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, sender.display_name, sender.email.domain.root_domain, sender.email.domain.tld, subject.base, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.nlu_classifier, regex.icontains, strings.icontains, strings.ilevenshtein, strings.ilike, strings.like, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (23)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *internal revenue service* |
strings.like | substring | IRS* |
regex.icontains | regex | \birs.gov |
regex.icontains | regex | internal.{0,5}revenue.{0,5}service |
strings.ilevenshtein | fuzzy | internal revenue service |
strings.like | substring | *IRS* |
ml.nlu_classifier(body.current_thread.text).topics[].name | equals | Government Services |
strings.icontains | substring | Internal Revenue Service |
strings.icontains | substring | 4228 Park Ave S |
strings.icontains | substring | 1111 Constitution Ave |
strings.icontains | substring | New York, New York 10003 |
strings.icontains | substring | Washington, DC 20224 |
11 more
regex.icontains | regex | ©\s*20[0-9]{2}\s*\s*Internal Revenue Service |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Financial Communications |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | equals | high |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Financial Communications |
ml.nlu_classifier(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 |
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 |
Stages and Predicates
Stage 1: mql_rule
and
not
and
or
any(headers.hops)
any(headers.hops.fields)
and
headers.hops.fields[].name eq "List-Unsubscribe-Post"
headers.hops.fields[].value eq "List-Unsubscribe=One-Click"
body.current_thread.text length_compare "2500"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "benign"
or
and
not
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence ne "low"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Advertising and Promotions", "Events and Webinars", "Newsletters and Digests", "Political Mail"]
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence eq "high"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Financial Communications", "Security and Authentication"]
body.previous_threads length_compare "0"
macro "((length(beta.ocr(file.message_screenshot()).text) + 0.0) / (length(body.current_thread.text) + 0.0)) > 2"
and
not
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).topics.name in ["Advertising and Promotions", "Events and Webinars", "Newsletters and Digests", "Political Mail"]
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).topics.name in ["Financial Communications", "Security and Authentication"]
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
or
and
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).topics.name eq "Government Services"
strings.replace_confusables(subject.base) match "IRS"
body.current_thread.text contains "1111 Constitution Ave"
body.current_thread.text contains "4228 Park Ave S"
body.current_thread.text contains "Internal Revenue Service"
body.current_thread.text contains "New York, New York 10003"
body.current_thread.text contains "Washington, DC 20224"
body.current_thread.text regex_match "©\\s*20[0-9]{2}\\s*\\s*Internal Revenue Service"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"internal revenue service\") <= 1"
strings.replace_confusables(sender.display_name) match "internal revenue service"
strings.replace_confusables(sender.display_name) regex_match "\\birs.gov"
strings.replace_confusables(sender.display_name) regex_match "internal.{0,5}revenue.{0,5}service"
strings.replace_confusables(sender.display_name) starts_with "IRS"
not
or
and
or
sender.email.domain.root_domain in ["govdelivery.com", "ms-cpa.org"]
sender.email.domain.tld eq "gov"
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in org_domains"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.hops | array_any | excludes:headers.hops | |
body.current_thread.text | length_compare | 2500 | excludes:body.current_thread.text field:"body.current_thread.text" value:"2500" |
ml.nlu_classifier(body.current_thread.text).intents | array_any | excludes:ml.nlu_classifier(body.current_thread.text).intents | |
sender.email.domain.root_domain | in | govdelivery.com, ms-cpa.org | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"govdelivery.com" field:"sender.email.domain.root_domain" value:"ms-cpa.org" |
sender.email.domain.tld | eq | gov | excludes:sender.email.domain.tld field:"sender.email.domain.tld" value:"gov" |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match value:"©\s*20[0-9]{2}\s*\s*Internal Revenue Service" |
strings.replace_confusables(sender.display_name) | regex_match |
| field:"strings.replace_confusables(sender.display_name)" kind:regex_match |
strings.replace_confusables(sender.display_name) | wildcard |
| field:"strings.replace_confusables(sender.display_name)" kind:wildcard |
strings.replace_confusables(subject.base) | wildcard |
| field:"strings.replace_confusables(subject.base)" kind:wildcard value:"*IRS*" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: KnowBe4
#Impersonation of KnowBe4.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, Spam |
| Tactics and techniques | Free email provider, Impersonation: Brand, Lookalike domain, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
sender.display_name =~ 'KnowBe4'
or strings.ilevenshtein(sender.display_name, 'KnowBe4') <= 1
or strings.icontains(sender.email.domain.domain, '*KnowBe4*')
)
and (
sender.email.domain.root_domain not in ('knowbe4.com')
or (
sender.email.domain.root_domain in ('knowbe4.com')
and not headers.auth_summary.dmarc.pass
)
)
// 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
)
Detection logic
Scope: inbound message.
Impersonation of KnowBe4.
- inbound message
any of:
- sender.display_name is 'KnowBe4'
- sender.display_name is similar to 'KnowBe4'
- sender.email.domain.domain contains '*KnowBe4*'
any of:
- sender.email.domain.root_domain not in ('knowbe4.com')
all of:
- sender.email.domain.root_domain in ('knowbe4.com')
not:
- headers.auth_summary.dmarc.pass
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
Inspects: headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: strings.icontains, strings.ilevenshtein. Reference lists: $high_trust_sender_root_domains.
Indicators matched (4)
| Field | Match | Value |
|---|---|---|
sender.display_name | equals | KnowBe4 |
strings.ilevenshtein | fuzzy | KnowBe4 |
strings.icontains | substring | *KnowBe4* |
sender.email.domain.root_domain | member | knowbe4.com |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain eq "knowbe4.com"
not
sender.email.domain.root_domain eq "knowbe4.com"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
sender.display_name eq "KnowBe4"
sender.email.domain.domain contains "*KnowBe4*"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"KnowBe4\") <= 1"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
Brand impersonation: Mailchimp
#Detects messages from senders impersonating Mailchimp through display name spoofing or brand logo usage, combined with security-themed content and suspicious authentication patterns.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
// display name contains Mailchimp
(
strings.ilike(strings.replace_confusables(sender.display_name),
'*mailchimp*'
)
// levenshtein distance similar to Mailchimp
or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
'mailchimp'
) <= 1
or any(ml.logo_detect(file.message_screenshot()).brands,
.name == "MailChimp" and .confidence == "high"
)
)
)
and (
any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications"
)
and .confidence in ("medium", "high")
)
or (
beta.ocr(file.message_screenshot()).text != ""
and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications"
)
and .confidence in ("medium", "high")
)
)
or 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 Mailchimp domains and passes auth
and not (
sender.email.domain.root_domain in $org_domains
or (
sender.email.domain.root_domain in ("intuit.com", "mailchimp.com")
and headers.auth_summary.dmarc.pass
)
)
and not strings.ends_with(headers.message_id, ".mailchimp.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 messages from senders impersonating Mailchimp through display name spoofing or brand logo usage, combined with security-themed content and suspicious authentication patterns.
- inbound message
any of:
- strings.replace_confusables(sender.display_name) matches '*mailchimp*'
- strings.replace_confusables(sender.display_name) is similar to 'mailchimp'
any of
ml.logo_detect(file.message_screenshot()).brandswhere all hold:- .name is 'MailChimp'
- .confidence is 'high'
any of:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
- .confidence in ('medium', 'high')
all of:
- beta.ocr(file.message_screenshot()).text is not ''
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
- .confidence in ('medium', 'high')
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 ('intuit.com', 'mailchimp.com')
- headers.auth_summary.dmarc.pass
not:
- headers.message_id ends with '.mailchimp.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, headers.message_id, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, strings.ends_with, strings.ilevenshtein, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (18)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *mailchimp* |
strings.ilevenshtein | fuzzy | mailchimp |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | MailChimp |
ml.logo_detect(file.message_screenshot()).brands[].confidence | equals | high |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Secure Message |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Reminders and Notifications |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | medium |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | high |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Secure Message |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Reminders and Notifications |
6 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | medium |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | high |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | equals | high |
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 |
Stages and Predicates
Stage 1: mql_rule
and
or
and
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(body.current_thread.text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
not
or
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["intuit.com", "mailchimp.com"]
macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
any(ml.logo_detect(file.message_screenshot()).brands)
and
ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
ml.logo_detect(file.message_screenshot()).brands.name eq "MailChimp"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"mailchimp\") <= 1"
strings.replace_confusables(sender.display_name) match "mailchimp"
not
headers.message_id ends_with ".mailchimp.com>"
not
profile.by_sender func_call "profile.by_sender().solicited"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | intuit.com, mailchimp.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"intuit.com" field:"sender.email.domain.root_domain" value:"mailchimp.com" |
headers.message_id | ends_with | .mailchimp.com> | excludes:headers.message_id field:"headers.message_id" value:".mailchimp.com>" |
Indicators
These rows show field, operator, and value matches.
Brand impersonation: Marriott with gift language
#Detects messages impersonating Marriott brand that contain gift-related language such as 'appreciation gift', 'thank you gift', or 'something special' from senders not associated with legitimate Marriott domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
strings.icontains(subject.base, "marriott")
or strings.icontains(sender.display_name, "marriott")
or strings.ilevenshtein(sender.display_name, 'marriott') <= 2
)
and any([body.current_thread.text, subject.base],
regex.icontains(.,
'(?:appreciation|thank)(?:\s|-)?(you)?\s+gift',
'something special',
'special.{0,10}thank(?:\s|-)you'
)
)
and not (
sender.email.domain.root_domain in~ (
"marriott.com",
"res-marriott.com",
"email-marriott.com",
"feedback-marriott.com",
"marriotthotels.se",
"bookonline.com"
)
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
Detects messages impersonating Marriott brand that contain gift-related language such as 'appreciation gift', 'thank you gift', or 'something special' from senders not associated with legitimate Marriott domains.
- inbound message
any of:
- subject.base contains 'marriott'
- sender.display_name contains 'marriott'
- sender.display_name is similar to 'marriott'
any of
[body.current_thread.text, subject.base]where:. matches any of 3 patterns
(?:appreciation|thank)(?:\s|-)?(you)?\s+giftsomething specialspecial.{0,10}thank(?:\s|-)you
not:
all of:
- sender.email.domain.root_domain in ('marriott.com', 'res-marriott.com', 'email-marriott.com', 'feedback-marriott.com', 'marriotthotels.se', 'bookonline.com')
- coalesce(headers.auth_summary.dmarc.pass)
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, subject.base, type.inbound. Sensors: regex.icontains, strings.icontains, strings.ilevenshtein.
Indicators matched (5)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | marriott |
strings.ilevenshtein | fuzzy | marriott |
regex.icontains | regex | (?:appreciation|thank)(?:\s|-)?(you)?\s+gift |
regex.icontains | regex | something special |
regex.icontains | regex | special.{0,10}thank(?:\s|-)you |
Stages and Predicates
Stage 1: mql_rule
and
any([body.current_thread.text, subject.base])
or
[body.current_thread.text, subject.base] regex_match "(?:appreciation|thank)(?:\\s|-)?(you)?\\s+gift"
[body.current_thread.text, subject.base] regex_match "something special"
[body.current_thread.text, subject.base] regex_match "special.{0,10}thank(?:\\s|-)you"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
sender.email.domain.root_domain in ["bookonline.com", "email-marriott.com", "feedback-marriott.com", "marriott.com", "marriotthotels.se", "res-marriott.com"]
or
sender.display_name contains "marriott"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"marriott\") <= 2"
subject.base contains "marriott"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.email.domain.root_domain | in | bookonline.com, email-marriott.com, feedback-marriott.com, marriott.com, marriotthotels.se, res-marriott.com | excludes:sender.email.domain.root_domain |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.display_name | contains |
| field:"sender.display_name" kind:contains value:"marriott" |
subject.base | contains |
| field:"subject.base" kind:contains value:"marriott" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: McAfee
#Detects messages impersonating McAfee through display name, subject line, body content, or NLU entity detection when the sender is not from verified McAfee domains or other high-trust domains with valid DMARC authentication.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, BEC/Fraud, Callback Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
regex.icontains(body.current_thread.text,
'McAfee.{0,30}(?:Defense|Protection)'
)
or regex.icontains(subject.base, 'McAfee.{0,30}(?:Defense|Protection)')
or (
strings.icontains(sender.email.local_part, "mcafee")
and regex.icontains(subject.subject, 'billing|account|payment|unpaid')
)
or regex.icontains(sender.display_name,
'^[\s[:punct:]]*mc\s*a+f+ee+(?:$|[^,])'
)
or (
any(ml.nlu_classifier(body.current_thread.text).entities,
.name in ("org", "sender") and strings.icontains(.text, 'mcafee')
)
and length(filter(ml.nlu_classifier(body.current_thread.text).entities,
.name == "urgency"
)
) >= 2
)
)
and not any(ml.nlu_classifier(body.current_thread.text).topics,
.name in ("Newsletters and Digests", "Advertising and Promotions")
and .confidence != "low"
)
and not (
sender.email.domain.root_domain in ('mcafee.com', 'mcafeesecure.com')
and coalesce(headers.auth_summary.dmarc.pass, false)
)
and not (
sender.email.domain.root_domain in $high_trust_sender_root_domains
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
Detects messages impersonating McAfee through display name, subject line, body content, or NLU entity detection when the sender is not from verified McAfee domains or other high-trust domains with valid DMARC authentication.
- inbound message
any of:
- body.current_thread.text matches 'McAfee.{0,30}(?:Defense|Protection)'
- subject.base matches 'McAfee.{0,30}(?:Defense|Protection)'
all of:
- sender.email.local_part contains 'mcafee'
- subject.subject matches 'billing|account|payment|unpaid'
- sender.display_name matches '^[\\s[:punct:]]*mc\\s*a+f+ee+(?:$|[^,])'
all of:
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name in ('org', 'sender')
- .text contains 'mcafee'
- length(filter(ml.nlu_classifier(body.current_thread.text).entities, .name == 'urgency')) ≥ 2
not:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Newsletters and Digests', 'Advertising and Promotions')
- .confidence is not 'low'
not:
all of:
- sender.email.domain.root_domain in ('mcafee.com', 'mcafeesecure.com')
- coalesce(headers.auth_summary.dmarc.pass)
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass)
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, sender.email.local_part, subject.base, subject.subject, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains. Reference lists: $high_trust_sender_root_domains.
Indicators matched (7)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | McAfee.{0,30}(?:Defense|Protection) |
strings.icontains | substring | mcafee |
regex.icontains | regex | billing|account|payment|unpaid |
regex.icontains | regex | ^[\s[:punct:]]*mc\s*a+f+ee+(?:$|[^,]) |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | org |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | sender |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | urgency |
Stages and Predicates
Stage 1: mql_rule
and
or
and
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name in ["org", "sender"]
ml.nlu_classifier(body.current_thread.text).entities.text contains "mcafee"
filter(ml.nlu_classifier(body.current_thread.text).entities, .name == 'urgency') length_compare "2"
and
sender.email.local_part contains "mcafee"
subject.subject regex_match "billing|account|payment|unpaid"
body.current_thread.text regex_match "McAfee.{0,30}(?:Defense|Protection)"
sender.display_name regex_match "^[\\s[:punct:]]*mc\\s*a+f+ee+(?:$|[^,])"
subject.base regex_match "McAfee.{0,30}(?:Defense|Protection)"
not
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).topics.name in ["Advertising and Promotions", "Newsletters and Digests"]
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
sender.email.domain.root_domain in ["mcafee.com", "mcafeesecure.com"]
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
ml.nlu_classifier(body.current_thread.text).topics | array_any | excludes:ml.nlu_classifier(body.current_thread.text).topics | |
sender.email.domain.root_domain | in | mcafee.com, mcafeesecure.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"mcafee.com" field:"sender.email.domain.root_domain" value:"mcafeesecure.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match value:"McAfee.{0,30}(?:Defense|Protection)" |
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match value:"^[\s[:punct:]]*mc\s*a+f+ee+(?:$|[^,])" |
sender.email.local_part | contains |
| field:"sender.email.local_part" kind:contains value:"mcafee" |
subject.base | regex_match |
| field:"subject.base" kind:regex_match value:"McAfee.{0,30}(?:Defense|Protection)" |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
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 |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
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 (9)
| 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 |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name in ["callback_scam", "cred_theft", "steal_pii"]
any(ml.logo_detect(file.message_screenshot()).brands)
ml.logo_detect(file.message_screenshot()).brands.name eq "MetaMask"
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
not
sender.email.domain.root_domain eq "metamask.io"
or
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"metamask\") <= 2"
strings.replace_confusables(sender.display_name) contains "METAMASK"
strings.replace_confusables(sender.display_name) regex_match "\\bmetamask\\.io\\b"
strings.replace_confusables(sender.display_name) regex_match "\\bmetamask\\b"
body.links length_compare "0"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.email.domain.root_domain | eq | metamask.io | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"metamask.io" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
strings.replace_confusables(sender.display_name) | contains |
| field:"strings.replace_confusables(sender.display_name)" kind:contains value:"METAMASK" |
strings.replace_confusables(sender.display_name) | regex_match |
| field:"strings.replace_confusables(sender.display_name)" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Microsoft Planner with suspicious link
#Impersonation of Microsoft Planner, a component of the Microsoft 365 software suite.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Evasion, Image as content, Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// suspicious link
and any(body.links,
(
.href_url.domain.root_domain not in $tranco_1m
or .href_url.domain.domain in $free_file_hosts
or .href_url.domain.root_domain in $free_file_hosts
or .href_url.domain.root_domain in $free_subdomain_hosts
or .href_url.domain.domain in $url_shorteners
or .href_url.domain.domain in $social_landing_hosts
or .href_url.domain.root_domain in $social_landing_hosts
// mass mailer link, masks the actual URL
or .href_url.domain.root_domain in (
"hubspotlinks.com",
"mandrillapp.com",
"sendgrid.net",
"rs6.net"
)
// Google AMP redirect
or (
.href_url.domain.sld == "google"
and strings.starts_with(.href_url.path, "/amp/")
)
// Recipient email address in link
or any(recipients.to,
strings.icontains(..href_url.url, .email.email)
and .email.domain.valid
)
or .href_url.domain.root_domain == "beehiiv.com"
)
// exclude sources of potential FPs
and (
.href_url.domain.root_domain not in (
"svc.ms",
"sharepoint.com",
"1drv.ms",
"microsoft.com",
"aka.ms",
"msftauthimages.net",
"mimecastprotect.com",
"office.com",
"microsoftproject.com"
)
or any(body.links, .href_url.domain.domain in $free_file_hosts)
)
and .href_url.domain.root_domain not in $org_domains
and .href_url.domain.valid
and regex.icontains(.display_text,
"(?:go.?to|view|show|display|access|open.?in|review.?on) (teams?|planner|group|task|intranet|discussions?)"
)
)
// not a reply
and (length(headers.references) == 0 or headers.in_reply_to is null)
// Planner logo
// LogoDetect coming soon
and (
all(attachments,
.file_type in $file_types_images
and
// small, relatively square image
//
// 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
//
(
beta.parse_exif(.).image_height / beta.parse_exif(.).image_width
) > 0.9
and (beta.parse_exif(.).image_height + beta.parse_exif(.).image_width) < 500
)
)
// suspicious content
and (
2 of (
strings.ilike(body.current_thread.text, "*assigned*new team*"),
strings.ilike(body.current_thread.text, "*Microsoft Office 365*"),
strings.ilike(body.current_thread.text, "*internal planner*"),
strings.ilike(body.current_thread.text, "*internal task*"),
any(recipients.to,
strings.icontains(body.current_thread.text, .email.domain.sld)
)
)
or (
any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "cred_theft" and .confidence in~ ("medium", "high")
)
)
// multiple links, but all the same root domain
or (
length(distinct(body.links, .href_url.domain.root_domain)) == 1
and 2 < length(body.links) < 10
and all(body.links,
.href_url.domain.root_domain != sender.email.domain.root_domain
)
)
)
// skip senders
and not (
headers.auth_summary.dmarc.pass
and sender.email.domain.root_domain in (
"bing.com",
"microsoft.com",
"microsoftonline.com",
"microsoftproject.com",
"microsoftstoreemail.com",
"microsoftsupport.com",
"microsoft365.com",
"office.com",
"office365.com",
"onedrive.com",
"sharepointonline.com",
"yammer.com",
"outlign.co"
)
)
// 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().solicited
or (
profile.by_sender().any_messages_malicious_or_spam
and not profile.by_sender().any_messages_benign
)
)
and not profile.by_sender().any_messages_benign
// exclude marketing jargon from ms partners
and not regex.icontains(body.current_thread.text,
'(schedul(e|ing)|set up).{0,20}(call|meeting|demo|zoom|conversation|time|tool|discussion)|book.{0,10}(meeting|demo|call|slot|time)|connect.{0,12}(with me|phone|email)|my.{0,10}(calendar|cal)|reserve.{0,10}s[pl]ot|break the ice|want to know more?|miss your chance|if you no longer wish|if you no longer want|if you wish to opt out|low-code (development|approach|solution|journey|platform)|invite.{0,30}(webinar|presentation)'
)
Detection logic
Scope: inbound message.
Impersonation of Microsoft Planner, a component of the Microsoft 365 software suite.
- inbound message
any of
body.linkswhere all hold:any of:
- .href_url.domain.root_domain not in $tranco_1m
- .href_url.domain.domain in $free_file_hosts
- .href_url.domain.root_domain in $free_file_hosts
- .href_url.domain.root_domain in $free_subdomain_hosts
- .href_url.domain.domain in $url_shorteners
- .href_url.domain.domain in $social_landing_hosts
- .href_url.domain.root_domain in $social_landing_hosts
- .href_url.domain.root_domain in ('hubspotlinks.com', 'mandrillapp.com', 'sendgrid.net', 'rs6.net')
all of:
- .href_url.domain.sld is 'google'
- .href_url.path starts with '/amp/'
any of
recipients.towhere all hold:- strings.icontains(.href_url.url)
- .email.domain.valid
- .href_url.domain.root_domain is 'beehiiv.com'
any of:
- .href_url.domain.root_domain not in ('svc.ms', 'sharepoint.com', '1drv.ms', 'microsoft.com', 'aka.ms', 'msftauthimages.net', 'mimecastprotect.com', 'office.com', 'microsoftproject.com')
any of
body.linkswhere:- .href_url.domain.domain in $free_file_hosts
- .href_url.domain.root_domain not in $org_domains
- .href_url.domain.valid
- .display_text matches '(?:go.?to|view|show|display|access|open.?in|review.?on) (teams?|planner|group|task|intranet|discussions?)'
any of:
- length(headers.references) is 0
- headers.in_reply_to is missing
all of
attachmentswhere all hold:- .file_type in $file_types_images
- beta.parse_exif(.).image_height / beta.parse_exif(.).image_width > 0.9
- beta.parse_exif(.).image_height + beta.parse_exif(.).image_width < 500
any of:
at least 2 of:
- body.current_thread.text matches '*assigned*new team*'
- body.current_thread.text matches '*Microsoft Office 365*'
- body.current_thread.text matches '*internal planner*'
- body.current_thread.text matches '*internal task*'
any of
recipients.towhere:- strings.icontains(body.current_thread.text)
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name is 'cred_theft'
- .confidence in ('medium', 'high')
all of:
- length(distinct(body.links, .href_url.domain.root_domain)) is 1
all of:
- length(body.links) > 2
- length(body.links) < 10
all of
body.linkswhere:- .href_url.domain.root_domain is not sender.email.domain.root_domain
not:
all of:
- headers.auth_summary.dmarc.pass
- sender.email.domain.root_domain in ('bing.com', 'microsoft.com', 'microsoftonline.com', 'microsoftproject.com', 'microsoftstoreemail.com', 'microsoftsupport.com', 'microsoft365.com', 'office.com', 'office365.com', 'onedrive.com', 'sharepointonline.com', 'yammer.com', 'outlign.co')
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
any of:
not:
- profile.by_sender().solicited
all of:
- profile.by_sender().any_messages_malicious_or_spam
not:
- profile.by_sender().any_messages_benign
not:
- profile.by_sender().any_messages_benign
not:
- body.current_thread.text matches '(schedul(e|ing)|set up).{0,20}(call|meeting|demo|zoom|conversation|time|tool|discussion)|book.{0,10}(meeting|demo|call|slot|time)|connect.{0,12}(with me|phone|email)|my.{0,10}(calendar|cal)|reserve.{0,10}s[pl]ot|break the ice|want to know more?|miss your chance|if you no longer wish|if you no longer want|if you wish to opt out|low-code (development|approach|solution|journey|platform)|invite.{0,30}(webinar|presentation)'
Inspects: attachments[].file_type, 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.domain.sld, body.links[].href_url.domain.valid, body.links[].href_url.path, body.links[].href_url.url, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, recipients.to, recipients.to[].email.domain.sld, recipients.to[].email.domain.valid, recipients.to[].email.email, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender, regex.icontains, strings.icontains, strings.ilike, strings.starts_with. Reference lists: $file_types_images, $free_file_hosts, $free_subdomain_hosts, $high_trust_sender_root_domains, $org_domains, $social_landing_hosts, $tranco_1m, $url_shorteners.
Indicators matched (15)
| Field | Match | Value |
|---|---|---|
body.links[].href_url.domain.root_domain | member | hubspotlinks.com |
body.links[].href_url.domain.root_domain | member | mandrillapp.com |
body.links[].href_url.domain.root_domain | member | sendgrid.net |
body.links[].href_url.domain.root_domain | member | rs6.net |
body.links[].href_url.domain.sld | equals | google |
strings.starts_with | prefix | /amp/ |
body.links[].href_url.domain.root_domain | equals | beehiiv.com |
regex.icontains | regex | (?:go.?to|view|show|display|access|open.?in|review.?on) (teams?|planner|group|task|intranet|discussions?) |
strings.ilike | substring | *assigned*new team* |
strings.ilike | substring | *Microsoft Office 365* |
strings.ilike | substring | *internal planner* |
strings.ilike | substring | *internal task* |
3 more
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | member | medium |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | member | high |
Stages and Predicates
Stage 1: mql_rule
and
any(body.links)
and
or
any(recipients.to)
and
recipients.to.email.domain.valid eq "true"
strings.icontains func_call "strings.icontains(body.links[].href_url.url)"
and
body.links.href_url.domain.sld eq "google"
body.links.href_url.path starts_with "/amp/"
body.links.href_url.domain.root_domain eq "beehiiv.com"
body.links.href_url.domain.root_domain in ["hubspotlinks.com", "mandrillapp.com", "rs6.net", "sendgrid.net"]
macro "body.links[].href_url.domain.domain in free_file_hosts"
macro "body.links[].href_url.domain.domain in social_landing_hosts"
macro "body.links[].href_url.domain.domain in url_shorteners"
macro "body.links[].href_url.domain.root_domain in free_file_hosts"
macro "body.links[].href_url.domain.root_domain in free_subdomain_hosts"
macro "body.links[].href_url.domain.root_domain in social_landing_hosts"
macro "body.links[].href_url.domain.root_domain not in tranco_1m"
or
not
body.links.href_url.domain.root_domain in ["1drv.ms", "aka.ms", "microsoft.com", "microsoftproject.com", "mimecastprotect.com", "msftauthimages.net", "office.com", "sharepoint.com", "svc.ms"]
any(body.links)
macro "body.links[].href_url.domain.domain in free_file_hosts"
body.links.display_text regex_match "(?:go.?to|view|show|display|access|open.?in|review.?on) (teams?|planner|group|task|intranet|discussions?)"
body.links.href_url.domain.valid eq "true"
macro "body.links[].href_url.domain.root_domain not in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence in ["high", "medium"]
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
and
body.links length_compare "10"
body.links length_compare "2"
distinct(body.links, .href_url.domain.root_domain) length_compare "1"
macro "all(body.links)"
any(recipients.to)
strings.icontains func_call "strings.icontains(body.current_thread.text)"
body.current_thread.text match "Microsoft Office 365"
body.current_thread.text match "internal planner"
body.current_thread.text match "internal task"
body.current_thread.text wildcard "*assigned*new team*"
or
and
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
profile.by_sender func_call "profile.by_sender().any_messages_malicious_or_spam"
not
profile.by_sender func_call "profile.by_sender().solicited"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["bing.com", "microsoft.com", "microsoft365.com", "microsoftonline.com", "microsoftproject.com", "microsoftstoreemail.com", "microsoftsupport.com", "office.com", "office365.com", "onedrive.com", "outlign.co", "sharepointonline.com", "yammer.com"]
not
body.current_thread.text regex_match "(schedul(e|ing)|set up).{0,20}(call|meeting|demo|zoom|conversation|time|tool|discussion)|book.{0,10}(meeting|demo|call|slot|time)|connect.{0,12}(with me|phone|email)|my.{0,10}(calendar|cal)|reserve.{0,10}s[pl]ot|break the ice|want to know more?|miss your chance|if you no longer wish|if you no longer want|if you wish to opt out|low-code (development|approach|solution|journey|platform)|invite.{0,30}(webinar|presentation)"
or
headers.in_reply_to is_null
headers.references length_compare "0"
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
type.inbound eq "true"
macro "all(attachments)"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | bing.com, microsoft.com, microsoft365.com, microsoftonline.com, microsoftproject.com, microsoftstoreemail.com, microsoftsupport.com, office.com, office365.com, onedrive.com, outlign.co, sharepointonline.com, yammer.com | excludes:sender.email.domain.root_domain |
body.current_thread.text | regex_match | (schedul(e|ing)|set up).{0,20}(call|meeting|demo|zoom|conversation|time|tool|discussion), book.{0,10}(meeting|demo|call|slot|time), connect.{0,12}(with me|phone|email), my.{0,10}(calendar|cal), reserve.{0,10}s[pl]ot, break the ice, want to know more?, miss your chance, if you no longer wish, if you no longer want, if you wish to opt out, low-code (development|approach|solution|journey|platform), invite.{0,30}(webinar|presentation) | excludes:body.current_thread.text |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | wildcard |
| field:"body.current_thread.text" kind:wildcard |
headers.in_reply_to | is_null | field:"headers.in_reply_to" kind:is_null | |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Morgan Stanley
#Detects messages impersonating Morgan Stanley that contain indicators of credential theft or callback scams, including references to secure email systems, client service centers, financial advisors, and registration processes. The rule identifies spoofed communications by checking for Morgan Stanley branding elements while excluding legitimate domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
strings.ilike(strings.replace_confusables(sender.display_name),
'*morgan stanley*',
'*morganstanley*'
)
or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
'morgan stanley'
) <= 2
or any(ml.nlu_classifier(body.current_thread.text).entities,
.name in ("org", "sender")
and strings.icontains(.text, 'Morgan Stanley')
)
or strings.icontains(body.current_thread.text,
'secure.emailhelp@morganstanley.com'
)
)
and strings.icontains(body.current_thread.text, "Morgan Stanley")
and 3 of (
strings.icontains(body.current_thread.text, "Client Service Center"),
regex.icontains(body.current_thread.text,
'Financial Advis?or\s*[|/]\s*(?:Portfolio\s+)?Manager'
),
regex.icontains(body.current_thread.text, 'Secure (?:E-)?Mail'),
strings.icontains(body.current_thread.text, "Click here to view"),
strings.icontains(body.current_thread.text, "encrypted messages"),
strings.icontains(body.current_thread.text, "1-800-780-0256"),
strings.icontains(body.current_thread.text,
"secure.emailhelp@morganstanley.com"
),
regex.icontains(body.current_thread.text,
'Morgan Stanley\s+(?:Smith Barney|Wealth Management|\w+\s+Team)'
),
strings.icontains(body.current_thread.text, "one-time registration"),
strings.icontains(body.current_thread.text, "see payment activity"),
regex.icontains(body.current_thread.text,
'link will expire on \d{4}-\d{2}-\d{2}'
),
any(ml.nlu_classifier(body.current_thread.text).intents,
.name in ("cred_theft", "callback_scam") and .confidence == "high"
)
)
and not (
sender.email.domain.root_domain in ("docusign.net", "morganstanley.com", )
and coalesce(headers.auth_summary.dmarc.pass, false)
)
and not (
any(headers.hops,
any(.fields,
.name == "X-ProofpointSecure"
and strings.icontains(.value, "Encrypted")
)
)
and any(headers.domains, .root_domain == "pphosted.com")
)
Detection logic
Scope: inbound message.
Detects messages impersonating Morgan Stanley that contain indicators of credential theft or callback scams, including references to secure email systems, client service centers, financial advisors, and registration processes. The rule identifies spoofed communications by checking for Morgan Stanley branding elements while excluding legitimate domains.
- inbound message
any of:
strings.replace_confusables(sender.display_name) matches any of 2 patterns
*morgan stanley**morganstanley*
- strings.replace_confusables(sender.display_name) is similar to 'morgan stanley'
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name in ('org', 'sender')
- .text contains 'Morgan Stanley'
- body.current_thread.text contains 'secure.emailhelp@morganstanley.com'
- body.current_thread.text contains 'Morgan Stanley'
at least 3 of:
- body.current_thread.text contains 'Client Service Center'
- body.current_thread.text matches 'Financial Advis?or\\s*[|/]\\s*(?:Portfolio\\s+)?Manager'
- body.current_thread.text matches 'Secure (?:E-)?Mail'
- body.current_thread.text contains 'Click here to view'
- body.current_thread.text contains 'encrypted messages'
- body.current_thread.text contains '1-800-780-0256'
- body.current_thread.text contains 'secure.emailhelp@morganstanley.com'
- body.current_thread.text matches 'Morgan Stanley\\s+(?:Smith Barney|Wealth Management|\\w+\\s+Team)'
- body.current_thread.text contains 'one-time registration'
- body.current_thread.text contains 'see payment activity'
- body.current_thread.text matches 'link will expire on \\d{4}-\\d{2}-\\d{2}'
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name in ('cred_theft', 'callback_scam')
- .confidence is 'high'
not:
all of:
- sender.email.domain.root_domain in ('docusign.net', 'morganstanley.com')
- coalesce(headers.auth_summary.dmarc.pass)
not:
all of:
any of
headers.hopswhere:any of
.fieldswhere all hold:- .name is 'X-ProofpointSecure'
- .value contains 'Encrypted'
any of
headers.domainswhere:- .root_domain is 'pphosted.com'
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.domains, headers.domains[].root_domain, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains, strings.ilevenshtein, strings.ilike, strings.replace_confusables.
Indicators matched (20)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *morgan stanley* |
strings.ilike | substring | *morganstanley* |
strings.ilevenshtein | fuzzy | morgan stanley |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | org |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | sender |
strings.icontains | substring | Morgan Stanley |
strings.icontains | substring | secure.emailhelp@morganstanley.com |
strings.icontains | substring | Client Service Center |
regex.icontains | regex | Financial Advis?or\s*[|/]\s*(?:Portfolio\s+)?Manager |
regex.icontains | regex | Secure (?:E-)?Mail |
strings.icontains | substring | Click here to view |
strings.icontains | substring | encrypted messages |
8 more
strings.icontains | substring | 1-800-780-0256 |
regex.icontains | regex | Morgan Stanley\s+(?:Smith Barney|Wealth Management|\w+\s+Team) |
strings.icontains | substring | one-time registration |
strings.icontains | substring | see payment activity |
regex.icontains | regex | link will expire on \d{4}-\d{2}-\d{2} |
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[].confidence | equals | high |
Stages and Predicates
Stage 1: mql_rule
and
not
and
any(headers.hops)
any(headers.hops.fields)
and
headers.hops.fields[].name eq "X-ProofpointSecure"
headers.hops.fields[].value contains "Encrypted"
any(headers.domains)
headers.domains.root_domain eq "pphosted.com"
or
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name in ["org", "sender"]
ml.nlu_classifier(body.current_thread.text).entities.text contains "Morgan Stanley"
body.current_thread.text contains "secure.emailhelp@morganstanley.com"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"morgan stanley\") <= 2"
strings.replace_confusables(sender.display_name) match "morgan stanley"
strings.replace_confusables(sender.display_name) match "morganstanley"
or
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name in ["callback_scam", "cred_theft"]
body.current_thread.text contains "1-800-780-0256"
body.current_thread.text contains "Click here to view"
body.current_thread.text contains "Client Service Center"
body.current_thread.text contains "encrypted messages"
body.current_thread.text contains "one-time registration"
body.current_thread.text contains "secure.emailhelp@morganstanley.com"
body.current_thread.text contains "see payment activity"
body.current_thread.text regex_match "Financial Advis?or\\s*[|/]\\s*(?:Portfolio\\s+)?Manager"
body.current_thread.text regex_match "Morgan Stanley\\s+(?:Smith Barney|Wealth Management|\\w+\\s+Team)"
body.current_thread.text regex_match "Secure (?:E-)?Mail"
body.current_thread.text regex_match "link will expire on \\d{4}-\\d{2}-\\d{2}"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
sender.email.domain.root_domain in ["docusign.net", "morganstanley.com"]
body.current_thread.text contains "Morgan Stanley"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.hops | array_any | excludes:headers.hops | |
headers.domains | array_any | excludes:headers.domains | |
sender.email.domain.root_domain | in | docusign.net, morganstanley.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"docusign.net" field:"sender.email.domain.root_domain" value:"morganstanley.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
strings.replace_confusables(sender.display_name) | wildcard |
| field:"strings.replace_confusables(sender.display_name)" kind:wildcard |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand Impersonation: OpenAI with ChatGPT Ads lure
#Detects messages impersonating OpenAI or ChatGPT, that contain specific references to ChatGPT Ads. Observed harvesting advertisting account credentials.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
// sender or subject contains openai or chatgpt
regex.icontains(sender.display_name, '\bchat\s*gpt\b')
or regex.icontains(sender.display_name, '\bopen\s*a[li]\b')
or regex.icontains(subject.subject, '\bchat\s*gpt\b')
or regex.icontains(subject.subject, '\bopen\s*a[li]\b')
or regex.icontains(body.current_thread.text,
'(?:regarding\s*your\s*Open\s*A[lI]\s*account|Open\s*A[lI]\s*\.\s*All\s*rights\s*reserved|the\s*open\s*ai\s*team)'
)
// display name references OpenAI CEO Sam Altman
or strings.icontains(sender.display_name, "Sam Altman")
// OpenAI mailing address
or regex.icontains(body.current_thread.text,
'3180 18(?:th)? St(?:reet)?,? San Francisco,? (?:CA|California)'
)
)
and 2 of (
regex.icontains(body.current_thread.text, 'ChatGPT.{0,15}Ads'),
strings.icontains(body.current_thread.text, "ad account"),
strings.icontains(body.current_thread.text, "connect account"),
strings.icontains(body.current_thread.text, "ad campaign"),
strings.icontains(body.current_thread.text, "invitation"),
)
// suspicious sender domain
and (
regex.icontains(sender.email.domain.domain, '(?:open.?ai|chat.?gpt)')
or network.whois(sender.email.domain).days_old < 365
)
// negate highly trusted sender domains unless they fail DMARC authentication
and not (
sender.email.domain.root_domain in $high_trust_sender_root_domains
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
Detects messages impersonating OpenAI or ChatGPT, that contain specific references to ChatGPT Ads. Observed harvesting advertisting account credentials.
- inbound message
any of:
- sender.display_name matches '\\bchat\\s*gpt\\b'
- sender.display_name matches '\\bopen\\s*a[li]\\b'
- subject.subject matches '\\bchat\\s*gpt\\b'
- subject.subject matches '\\bopen\\s*a[li]\\b'
- body.current_thread.text matches '(?:regarding\\s*your\\s*Open\\s*A[lI]\\s*account|Open\\s*A[lI]\\s*\\.\\s*All\\s*rights\\s*reserved|the\\s*open\\s*ai\\s*team)'
- sender.display_name contains 'Sam Altman'
- body.current_thread.text matches '3180 18(?:th)? St(?:reet)?,? San Francisco,? (?:CA|California)'
at least 2 of:
- body.current_thread.text matches 'ChatGPT.{0,15}Ads'
- body.current_thread.text contains 'ad account'
- body.current_thread.text contains 'connect account'
- body.current_thread.text contains 'ad campaign'
- body.current_thread.text contains 'invitation'
any of:
- sender.email.domain.domain matches '(?:open.?ai|chat.?gpt)'
- network.whois(sender.email.domain).days_old < 365
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass)
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain, sender.email.domain.domain, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: network.whois, regex.icontains, strings.icontains. Reference lists: $high_trust_sender_root_domains.
Indicators matched (11)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | \bchat\s*gpt\b |
regex.icontains | regex | \bopen\s*a[li]\b |
regex.icontains | regex | (?:regarding\s*your\s*Open\s*A[lI]\s*account|Open\s*A[lI]\s*\.\s*All\s*rights\s*reserved|the\s*open\s*ai\s*team) |
strings.icontains | substring | Sam Altman |
regex.icontains | regex | 3180 18(?:th)? St(?:reet)?,? San Francisco,? (?:CA|California) |
regex.icontains | regex | ChatGPT.{0,15}Ads |
strings.icontains | substring | ad account |
strings.icontains | substring | connect account |
strings.icontains | substring | ad campaign |
strings.icontains | substring | invitation |
regex.icontains | regex | (?:open.?ai|chat.?gpt) |
Stages and Predicates
Stage 1: mql_rule
and
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
or
body.current_thread.text contains "ad account"
body.current_thread.text contains "ad campaign"
body.current_thread.text contains "connect account"
body.current_thread.text contains "invitation"
body.current_thread.text regex_match "ChatGPT.{0,15}Ads"
or
body.current_thread.text regex_match "(?:regarding\\s*your\\s*Open\\s*A[lI]\\s*account|Open\\s*A[lI]\\s*\\.\\s*All\\s*rights\\s*reserved|the\\s*open\\s*ai\\s*team)"
body.current_thread.text regex_match "3180 18(?:th)? St(?:reet)?,? San Francisco,? (?:CA|California)"
sender.display_name contains "Sam Altman"
sender.display_name regex_match "\\bchat\\s*gpt\\b"
sender.display_name regex_match "\\bopen\\s*a[li]\\b"
subject.subject regex_match "\\bchat\\s*gpt\\b"
subject.subject regex_match "\\bopen\\s*a[li]\\b"
or
network.whois func_call "network.whois(sender.email.domain).days_old < 365"
sender.email.domain.domain regex_match "(?:open.?ai|chat.?gpt)"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
sender.display_name | contains |
| field:"sender.display_name" kind:contains value:"Sam Altman" |
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match |
sender.email.domain.domain | regex_match |
| field:"sender.email.domain.domain" kind:regex_match value:"(?:open.?ai|chat.?gpt)" |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Paperless Post
#Detects messages containing multiple images hosted on ppassets.com (Paperless Post's asset domain) but with fewer than 3 legitimate Paperless Post links, while excluding authentic forwards/replies and messages from verified Paperless Post domains with valid DMARC authentication.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, Malware/Ransomware |
| Tactics and techniques | Impersonation: Brand |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and strings.contains(body.html.raw, 'ppassets.com')
and length(filter(html.xpath(body.html, '//img/@src').nodes,
// calling parse_url allows url decoding to help us
strings.parse_url(.raw).domain.root_domain == 'ppassets.com'
)
) >= 2
and (
length(filter(body.links,
.href_url.domain.domain == "links.paperlesspost.com"
or (
.href_url.domain.root_domain == "paperlesspost.com"
and strings.istarts_with(.href_url.path, '/go/')
)
)
) < 2
or any(body.links,
regex.icontains(.display_text, '(?:view the card|view and reply)')
and .href_url.domain.root_domain != "paperlesspost.com"
)
)
and not (
(subject.is_forward or subject.is_reply)
and (
(length(headers.references) != 0 or headers.in_reply_to is not null)
or length(body.previous_threads) > 0
)
)
and not (
sender.email.domain.root_domain == "paperlesspost.com"
and headers.auth_summary.dmarc.pass
)
Detection logic
Scope: inbound message.
Detects messages containing multiple images hosted on ppassets.com (Paperless Post's asset domain) but with fewer than 3 legitimate Paperless Post links, while excluding authentic forwards/replies and messages from verified Paperless Post domains with valid DMARC authentication.
- inbound message
- body.html.raw contains 'ppassets.com'
- length(filter(html.xpath(body.html, '//img/@src').nodes, strings.parse_url(.raw).domain.root_domain == 'ppassets.com')) ≥ 2
any of:
- length(filter(body.links, .href_url.domain.domain == 'links.paperlesspost.com' or .href_url.domain.root_domain == 'paperlesspost.com' and strings.istarts_with(.href_url.path, '/go/'))) < 2
any of
body.linkswhere all hold:- .display_text matches '(?:view the card|view and reply)'
- .href_url.domain.root_domain is not 'paperlesspost.com'
not:
all of:
any of:
- subject.is_forward
- subject.is_reply
any of:
any of:
- length(headers.references) is not 0
- headers.in_reply_to is set
- length(body.previous_threads) > 0
not:
all of:
- sender.email.domain.root_domain is 'paperlesspost.com'
- headers.auth_summary.dmarc.pass
Inspects: body.html, body.html.raw, body.links, body.links[].display_text, body.links[].href_url.domain.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.previous_threads, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: html.xpath, regex.icontains, strings.contains, strings.istarts_with, strings.parse_url.
Indicators matched (5)
| Field | Match | Value |
|---|---|---|
strings.contains | substring | ppassets.com |
body.links[].href_url.domain.domain | equals | links.paperlesspost.com |
body.links[].href_url.domain.root_domain | equals | paperlesspost.com |
strings.istarts_with | prefix | /go/ |
regex.icontains | regex | (?:view the card|view and reply) |
Stages and Predicates
Stage 1: mql_rule
and
or
any(body.links)
and
body.links.display_text regex_match "(?:view the card|view and reply)"
body.links.href_url.domain.root_domain ne "paperlesspost.com"
filter(body.links, .href_url.domain.domain == 'links.paperlesspost.com' or .href_url.domain.root_domain == 'paperlesspost.com' and strings.istarts_with(.href_url.path, '/go/')) length_compare "2"
not
and
or
body.previous_threads length_compare "0"
headers.in_reply_to is_not_null
headers.references length_compare "0"
or
subject.is_forward eq "true"
subject.is_reply eq "true"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain eq "paperlesspost.com"
body.html.raw contains "ppassets.com"
filter(html.xpath(body.html, '//img/@src').nodes, strings.parse_url(.raw).domain.root_domain == 'ppassets.com') length_compare "2"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
body.previous_threads | length_compare | 0 | excludes:body.previous_threads field:"body.previous_threads" value:"0" |
headers.in_reply_to | is_not_null | excludes:headers.in_reply_to | |
headers.references | length_compare | 0 | excludes:headers.references field:"headers.references" value:"0" |
subject.is_forward | eq | true | excludes:subject.is_forward field:"subject.is_forward" value:"true" |
subject.is_reply | eq | true | excludes:subject.is_reply field:"subject.is_reply" value:"true" |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | eq | paperlesspost.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"paperlesspost.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.html.raw | contains |
| field:"body.html.raw" kind:contains value:"ppassets.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand Impersonation: Procore
#Detects messages containing Procore branding language that do not originate from legitimate Procore domains. This has been observed in phishing campaigns.
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 |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
strings.ilike(body.current_thread.text, "*powered by procore*")
or 2 of (
strings.icontains(body.current_thread.text, 'Procore'),
strings.icontains(body.current_thread.text, '6309 Carpinteria Ave'),
strings.icontains(body.current_thread.text, 'Carpinteria, CA 93013')
)
or (
strings.iends_with(sender.display_name, 'via Procore')
and any(body.current_thread.links,
.href_url.domain.root_domain in $free_subdomain_hosts
)
)
)
and not (
sender.email.domain.root_domain in ("procore.com", "procoretech.com")
and coalesce(headers.auth_summary.dmarc.pass, false)
)
// negating legit replies/forwards
and not (
(
strings.istarts_with(subject.subject, "RE:")
or strings.istarts_with(subject.subject, "FW:")
or strings.istarts_with(subject.subject, "FWD:")
or regex.imatch(subject.subject,
'(\[[^\]]+\]\s?){0,3}(re|fwd?|automat.*)\s?:.*'
)
or strings.istarts_with(subject.subject, "Réponse automatique")
)
and (length(headers.references) > 0 and headers.in_reply_to is not null)
)
// negate bounce backs
and not (
strings.like(sender.email.local_part,
"*postmaster*",
"*mailer-daemon*",
"*administrator*"
)
and any(attachments,
.content_type in (
"message/rfc822",
"message/delivery-status",
"text/calendar"
)
)
)
Detection logic
Scope: inbound message.
Detects messages containing Procore branding language that do not originate from legitimate Procore domains. This has been observed in phishing campaigns.
- inbound message
any of:
- body.current_thread.text matches '*powered by procore*'
at least 2 of:
- body.current_thread.text contains 'Procore'
- body.current_thread.text contains '6309 Carpinteria Ave'
- body.current_thread.text contains 'Carpinteria, CA 93013'
all of:
- sender.display_name ends with 'via Procore'
any of
body.current_thread.linkswhere:- .href_url.domain.root_domain in $free_subdomain_hosts
not:
all of:
- sender.email.domain.root_domain in ('procore.com', 'procoretech.com')
- coalesce(headers.auth_summary.dmarc.pass)
not:
all of:
any of:
- subject.subject starts with 'RE:'
- subject.subject starts with 'FW:'
- subject.subject starts with 'FWD:'
- subject.subject matches '(\\[[^\\]]+\\]\\s?){0,3}(re|fwd?|automat.*)\\s?:.*'
- subject.subject starts with 'Réponse automatique'
all of:
- length(headers.references) > 0
- headers.in_reply_to is set
not:
all of:
sender.email.local_part matches any of 3 patterns
*postmaster**mailer-daemon**administrator*
any of
attachmentswhere:- .content_type in ('message/rfc822', 'message/delivery-status', 'text/calendar')
Inspects: attachments[].content_type, body.current_thread.links, body.current_thread.links[].href_url.domain.root_domain, body.current_thread.text, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.display_name, sender.email.domain.root_domain, sender.email.local_part, subject.subject, type.inbound. Sensors: regex.imatch, strings.icontains, strings.iends_with, strings.ilike, strings.istarts_with, strings.like. Reference lists: $free_subdomain_hosts.
Indicators matched (5)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *powered by procore* |
strings.icontains | substring | Procore |
strings.icontains | substring | 6309 Carpinteria Ave |
strings.icontains | substring | Carpinteria, CA 93013 |
strings.iends_with | suffix | via Procore |
Stages and Predicates
Stage 1: mql_rule
and
not
and
any(attachments)
attachments.content_type in ["message/delivery-status", "message/rfc822", "text/calendar"]
or
sender.email.local_part match "administrator"
sender.email.local_part match "mailer-daemon"
sender.email.local_part match "postmaster"
not
and
or
subject.subject regex_match "(\\[[^\\]]+\\]\\s?){0,3}(re|fwd?|automat.*)\\s?:.*"
subject.subject starts_with "FW:"
subject.subject starts_with "FWD:"
subject.subject starts_with "RE:"
subject.subject starts_with "Réponse automatique"
headers.in_reply_to is_not_null
headers.references length_compare "0"
or
and
any(body.current_thread.links)
macro "body.current_thread.links[].href_url.domain.root_domain in free_subdomain_hosts"
sender.display_name ends_with "via Procore"
body.current_thread.text contains "6309 Carpinteria Ave"
body.current_thread.text contains "Carpinteria, CA 93013"
body.current_thread.text contains "Procore"
body.current_thread.text match "powered by procore"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
sender.email.domain.root_domain in ["procore.com", "procoretech.com"]
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | wildcard |
| field:"body.current_thread.text" kind:wildcard value:"*powered by procore*" |
sender.display_name | ends_with |
| field:"sender.display_name" kind:ends_with value:"via Procore" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Proofpoint secure messaging without legitimate indicators
#Detects messages impersonating Proofpoint secure messaging services that contain Proofpoint branding text but lack legitimate Proofpoint secure sharing URIs or authentic attachment indicators, suggesting fraudulent use of the brand.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
// matching proofpoint secure messaging
(
strings.contains(body.current_thread.text,
"Secured by Proofpoint Encryption,"
)
and not strings.iends_with(body.current_thread.text,
"Secured by Proofpoint Encryption, Copyright © 2009-2016 Proofpoint, Inc. All rights reserved."
)
)
or regex.icontains(body.current_thread.text,
('Copyright © 2009-202\d Proofpoint, Inc.')
)
or strings.icontains(body.html.raw, '<h1>Proofpoint |')
// body.html contains a suspicious title impersonating proofpoint
or (
any(html.xpath(body.html, '//title').nodes,
strings.icontains(.raw, "secure access")
and strings.icontains(.raw, 'Proofpoint')
)
)
// no links but has attachments which impersonate proofpoint
or any(attachments,
strings.icontains(file.parse_text(.).text, '<h1>Proofpoint |')
or any(html.xpath(file.parse_html(.), '//title').nodes,
strings.icontains(.raw, "secure access")
and strings.icontains(.raw, 'Proofpoint')
)
)
)
and (
// contains a link
length(body.current_thread.links) >= 1
// or an attachment (legit attachments negated in stanza below)
or length(attachments) > 0
)
// pfpt secure share uri
and not (
any(body.links,
// negate the actual dest of the legit "click here" link
.href_url.path == "/formpostdir/securereader"
// negate where the link domain is mimecast and check LA for the pfpt URI
or (
.href_url.domain.root_domain == "mimecastprotect.com"
and (
ml.link_analysis(., mode="aggressive").effective_url.path == "/formpostdir/securereader"
or any(ml.link_analysis(., mode="aggressive").redirect_history,
.path == "/formpostdir/securereader"
)
)
)
or (
.href_url.domain.root_domain == "mimecastprotect.com"
and .display_text =~ "Click here"
and strings.parse_domain(.href_url.query_params_decoded["domain"][0]).root_domain == sender.email.domain.root_domain
)
)
)
// negate actual SecureMessageAtt.html links that ave been quarantined by mimecast
and not any(attachments,
// pfpt attachment file
.file_name == "SecureMessageAtt.html"
// mimecast quarantine details
or (
.content_type == "message/rfc822"
and length(file.parse_eml(.).body.links) == 1
and any(file.parse_eml(.).body.links,
.display_text == "download it"
and .href_url.domain.root_domain == "mimecast.com"
)
and strings.ends_with(file.parse_eml(.).headers.message_id,
"@localhost>"
)
)
)
Detection logic
Scope: inbound message.
Detects messages impersonating Proofpoint secure messaging services that contain Proofpoint branding text but lack legitimate Proofpoint secure sharing URIs or authentic attachment indicators, suggesting fraudulent use of the brand.
- inbound message
any of:
all of:
- body.current_thread.text contains 'Secured by Proofpoint Encryption,'
not:
- body.current_thread.text ends with 'Secured by Proofpoint Encryption, Copyright © 2009-2016 Proofpoint, Inc. All rights reserved.'
- body.current_thread.text matches 'Copyright © 2009-202\\d Proofpoint, Inc.'
- body.html.raw contains '<h1>Proofpoint |'
any of
html.xpath(body.html, '//title').nodeswhere all hold:- .raw contains 'secure access'
- .raw contains 'Proofpoint'
any of
attachmentswhere any holds:- file.parse_text(.).text contains '<h1>Proofpoint |'
any of
html.xpath(file.parse_html(.), '//title').nodeswhere all hold:- .raw contains 'secure access'
- .raw contains 'Proofpoint'
any of:
- length(body.current_thread.links) ≥ 1
- length(attachments) > 0
not:
any of
body.linkswhere any holds:- .href_url.path is '/formpostdir/securereader'
all of:
- .href_url.domain.root_domain is 'mimecastprotect.com'
any of:
- ml.link_analysis(.).effective_url.path is '/formpostdir/securereader'
any of
ml.link_analysis(., mode='aggressive').redirect_historywhere:- .path is '/formpostdir/securereader'
all of:
- .href_url.domain.root_domain is 'mimecastprotect.com'
- .display_text is 'Click here'
- strings.parse_domain(.href_url.query_params_decoded['domain'][0]).root_domain is sender.email.domain.root_domain
not:
any of
attachmentswhere any holds:- .file_name is 'SecureMessageAtt.html'
all of:
- .content_type is 'message/rfc822'
- length(file.parse_eml(.).body.links) is 1
any of
file.parse_eml(.).body.linkswhere all hold:- .display_text is 'download it'
- .href_url.domain.root_domain is 'mimecast.com'
- file.parse_eml(.).headers.message_id ends with '@localhost>'
Inspects: attachments[].content_type, attachments[].file_name, body.current_thread.links, body.current_thread.text, body.html, body.html.raw, body.links, body.links[].display_text, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.links[].href_url.query_params_decoded['domain'][0], sender.email.domain.root_domain, type.inbound. Sensors: file.parse_eml, file.parse_html, file.parse_text, html.xpath, ml.link_analysis, regex.icontains, strings.contains, strings.ends_with, strings.icontains, strings.iends_with, strings.parse_domain.
Indicators matched (5)
| Field | Match | Value |
|---|---|---|
strings.contains | substring | Secured by Proofpoint Encryption, |
regex.icontains | regex | Copyright © 2009-202\d Proofpoint, Inc. |
strings.icontains | substring | <h1>Proofpoint | |
strings.icontains | substring | secure access |
strings.icontains | substring | Proofpoint |
Stages and Predicates
Stage 1: mql_rule
and
not
any(attachments)
or
and
any(file.parse_eml(attachments).body.links)
and
file.parse_eml(attachments[]).body.links[].display_text eq "download it"
file.parse_eml(attachments[]).body.links[].href_url.domain.root_domain eq "mimecast.com"
attachments.content_type eq "message/rfc822"
file.parse_eml(attachments[]).body.links length_compare "1"
file.parse_eml(attachments[]).headers.message_id ends_with "@localhost>"
attachments.file_name eq "SecureMessageAtt.html"
not
any(body.links)
or
and
or
any(ml.link_analysis(body.links, mode='aggressive').redirect_history)
ml.link_analysis(body.links, mode='aggressive').redirect_history.path eq "/formpostdir/securereader"
ml.link_analysis func_call "ml.link_analysis(body.links[]).effective_url.path == /formpostdir/securereader"
body.links.href_url.domain.root_domain eq "mimecastprotect.com"
and
body.links.display_text eq "Click here"
body.links.href_url.domain.root_domain eq "mimecastprotect.com"
strings.parse_domain func_call "strings.parse_domain(body.links[].href_url.query_params_decoded['domain'][0]).root_domain == sender.email.domain.root_domain"
body.links.href_url.path eq "/formpostdir/securereader"
or
any(attachments)
or
any(html.xpath(file.parse_html(attachments), '//title').nodes)
and
html.xpath(file.parse_html(attachments[]), '//title').nodes[].raw contains "Proofpoint"
html.xpath(file.parse_html(attachments[]), '//title').nodes[].raw contains "secure access"
file.parse_text(attachments[]).text contains "<h1>Proofpoint |"
and
not
body.current_thread.text ends_with "Secured by Proofpoint Encryption, Copyright © 2009-2016 Proofpoint, Inc. All rights reserved."
body.current_thread.text contains "Secured by Proofpoint Encryption,"
any(html.xpath(body.html, '//title').nodes)
and
html.xpath(body.html, '//title').nodes.raw contains "Proofpoint"
html.xpath(body.html, '//title').nodes.raw contains "secure access"
body.current_thread.text regex_match "Copyright © 2009-202\\d Proofpoint, Inc."
body.html.raw contains "<h1>Proofpoint |"
or
attachments length_compare "0"
body.current_thread.links length_compare "1"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
attachments | array_any | excludes:attachments | |
body.links | array_any | excludes:body.links |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains value:"Secured by Proofpoint Encryption," |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match value:"Copyright © 2009-202\d Proofpoint, Inc." |
body.html.raw | contains |
| field:"body.html.raw" kind:contains value:"<h1>Proofpoint |" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Punchbowl
#Detects messages impersonating Punchbowl invitations not originating from legitimate Punchbowl domain.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Looking for Punchbowl phrasing in all body threads
and (
strings.icontains(body.current_thread.text, "punchbowl")
// Look for alt text in HTML for standardized Punchbowl formatting if string is not avail.
or strings.icontains(body.html.raw, 'alt="Punchbowl"')
// image sourced from punchbowl
or any(html.xpath(body.html, '//img/@src').nodes,
strings.parse_url(.raw).domain.domain == "static.punchbowl.com"
and strings.icontains(strings.parse_url(.raw).path,
'/invitation',
'/invite'
)
)
)
// Phrasing is typically "You're invited"
and (
strings.icontains(body.current_thread.text, "you're invited")
//
// 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
//
or (
regex.icontains(beta.ocr(file.message_screenshot()).text,
"you're invited",
"open me",
"manage invitation"
)
and regex.icontains(body.current_thread.text,
'don.t want .{1,40}\?',
'(?:view|open|click|access).{1,10}(?:computer|(?:lap|desk)top)' // instruction to open link on a computer
)
)
or any([
html.xpath(body.html,
'//a//img[contains(@src, "btn_open_invitation")]'
).nodes,
html.xpath(body.html,
'//a//img[contains(@src, "btn_open_save_the_date")]'
).nodes,
],
any(.,
regex.icontains(.inner_text,
'(?:open|save).{0,10}(?:invitation|the date)'
)
)
)
)
// Legitimate sender will be from punchbowl, negating known non-associated domains.
and not sender.email.domain.root_domain in ("punchbowl.com", "punchbowl.news")
// Capping length to limit FP's
and length(body.current_thread.text) < 1500
Detection logic
Scope: inbound message.
Detects messages impersonating Punchbowl invitations not originating from legitimate Punchbowl domain.
- inbound message
any of:
- body.current_thread.text contains 'punchbowl'
- body.html.raw contains 'alt="Punchbowl"'
any of
html.xpath(body.html, '//img/@src').nodeswhere all hold:- strings.parse_url(.raw).domain.domain is 'static.punchbowl.com'
strings.parse_url(.raw).path contains any of 2 patterns
/invitation/invite
any of:
- body.current_thread.text contains "you're invited"
all of:
beta.ocr(file.message_screenshot()).text matches any of 3 patterns
you're invitedopen memanage invitation
body.current_thread.text matches any of 2 patterns
don.t want .{1,40}\?(?:view|open|click|access).{1,10}(?:computer|(?:lap|desk)top)
any of
[html.xpath(body.html, '//a//img[contains(@src, "btn_open_invitation")]').nodes, html.xpath(body.html, '//a//img[contains(@src, "btn_open_save_the_date")]').nodes]where:any of
.where:- .inner_text matches '(?:open|save).{0,10}(?:invitation|the date)'
not:
- sender.email.domain.root_domain in ('punchbowl.com', 'punchbowl.news')
- length(body.current_thread.text) < 1500
Inspects: body.current_thread.text, body.html, body.html.raw, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, html.xpath, regex.icontains, strings.icontains, strings.parse_url.
Indicators matched (11)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | punchbowl |
strings.icontains | substring | alt="Punchbowl" |
strings.icontains | substring | /invitation |
strings.icontains | substring | /invite |
strings.icontains | substring | you're invited |
regex.icontains | regex | you're invited |
regex.icontains | regex | open me |
regex.icontains | regex | manage invitation |
regex.icontains | regex | don.t want .{1,40}\? |
regex.icontains | regex | (?:view|open|click|access).{1,10}(?:computer|(?:lap|desk)top) |
regex.icontains | regex | (?:open|save).{0,10}(?:invitation|the date) |
Stages and Predicates
Stage 1: mql_rule
and
or
any(html.xpath(body.html, '//img/@src').nodes)
and
or
strings.parse_url(html.xpath(body.html, '//img/@src').nodes[].raw).path contains "/invitation"
strings.parse_url(html.xpath(body.html, '//img/@src').nodes[].raw).path contains "/invite"
strings.parse_url func_call "strings.parse_url(html.xpath(body.html, '//img/@src').nodes[].raw).domain.domain == static.punchbowl.com"
body.current_thread.text contains "punchbowl"
body.html.raw contains "alt=\"Punchbowl\""
or
any([html.xpath(body.html, '//a//img[contains(@src, "btn_open_invitation")]').nodes, html.xpath(body.html, '//a//img[contains(@src, "btn_open_save_the_date")]').nodes])
any([html.xpath(body.html, '//a//img[contains(@src, "btn_open_invitation")]').nodes, html.xpath(body.html, '//a//img[contains(@src, "btn_open_save_the_date")]').nodes])
[html.xpath(body.html, '//a//img[contains(@src, "btn_open_invitation")]').nodes, html.xpath(body.html, '//a//img[contains(@src, "btn_open_save_the_date")]').nodes].inner_text regex_match "(?:open|save).{0,10}(?:invitation|the date)"
and
or
beta.ocr(file.message_screenshot()).text regex_match "manage invitation"
beta.ocr(file.message_screenshot()).text regex_match "open me"
beta.ocr(file.message_screenshot()).text regex_match "you're invited"
or
body.current_thread.text regex_match "(?:view|open|click|access).{1,10}(?:computer|(?:lap|desk)top)"
body.current_thread.text regex_match "don.t want .{1,40}\\?"
body.current_thread.text contains "you're invited"
not
sender.email.domain.root_domain in ["punchbowl.com", "punchbowl.news"]
body.current_thread.text length_compare "1500"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.email.domain.root_domain | in | punchbowl.com, punchbowl.news | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"punchbowl.com" field:"sender.email.domain.root_domain" value:"punchbowl.news" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
beta.ocr(file.message_screenshot()).text | regex_match |
| field:"beta.ocr(file.message_screenshot()).text" kind:regex_match |
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
body.html.raw | contains |
| field:"body.html.raw" kind:contains |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Robert Half
#Detects messages impersonating Robert Half, a staffing and recruiting company, by analyzing sender display names, logo detection in message screenshots, and specific company address references in the message body. The rule flags messages from senders not authenticated from legitimate Robert Half domains.
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 |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
strings.icontains(sender.display_name, "Robert Half")
or (
any(ml.logo_detect(file.message_screenshot()).brands,
.name == "Robert Half"
)
and strings.icontains(sender.display_name, "Robert Half")
)
or 2 of (
strings.icontains(body.current_thread.text, 'Robert Half'),
strings.icontains(body.current_thread.text, '2884 Sand Hill Road'),
strings.icontains(body.current_thread.text, 'Menlo Park, CA 94025')
)
)
// not a forward or reply
and (headers.in_reply_to is null or length(headers.references) == 0)
and not any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Newsletters and Digests",
"Voicemail Call and Missed Call Notifications",
"Advertising and Promotions"
)
and .confidence != "low"
)
// and the sender is not in org_domains or from Robert Half domains and passes auth
and not (
sender.email.domain.root_domain in $org_domains
or (
sender.email.domain.root_domain in (
"roberthalf.com",
"roberthalf.be",
"service-now.com",
"protiviti.com",
"atlassian.net",
"workday.com",
"myworkday.com"
)
and headers.auth_summary.dmarc.pass
)
)
Detection logic
Scope: inbound message.
Detects messages impersonating Robert Half, a staffing and recruiting company, by analyzing sender display names, logo detection in message screenshots, and specific company address references in the message body. The rule flags messages from senders not authenticated from legitimate Robert Half domains.
- inbound message
any of:
- sender.display_name contains 'Robert Half'
all of:
any of
ml.logo_detect(file.message_screenshot()).brandswhere:- .name is 'Robert Half'
- sender.display_name contains 'Robert Half'
at least 2 of:
- body.current_thread.text contains 'Robert Half'
- body.current_thread.text contains '2884 Sand Hill Road'
- body.current_thread.text contains 'Menlo Park, CA 94025'
any of:
- headers.in_reply_to is missing
- length(headers.references) is 0
not:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Newsletters and Digests', 'Voicemail Call and Missed Call Notifications', 'Advertising and Promotions')
- .confidence is not 'low'
none of:
- sender.email.domain.root_domain in $org_domains
all of:
- sender.email.domain.root_domain in ('roberthalf.com', 'roberthalf.be', 'service-now.com', 'protiviti.com', 'atlassian.net', 'workday.com', 'myworkday.com')
- headers.auth_summary.dmarc.pass
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: file.message_screenshot, ml.logo_detect, ml.nlu_classifier, strings.icontains. Reference lists: $org_domains.
Indicators matched (4)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | Robert Half |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | Robert Half |
strings.icontains | substring | 2884 Sand Hill Road |
strings.icontains | substring | Menlo Park, CA 94025 |
Stages and Predicates
Stage 1: mql_rule
and
not
or
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["atlassian.net", "myworkday.com", "protiviti.com", "roberthalf.be", "roberthalf.com", "service-now.com", "workday.com"]
macro "sender.email.domain.root_domain in org_domains"
or
and
any(ml.logo_detect(file.message_screenshot()).brands)
ml.logo_detect(file.message_screenshot()).brands.name eq "Robert Half"
sender.display_name contains "Robert Half"
body.current_thread.text contains "2884 Sand Hill Road"
body.current_thread.text contains "Menlo Park, CA 94025"
body.current_thread.text contains "Robert Half"
sender.display_name contains "Robert Half"
not
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).topics.name in ["Advertising and Promotions", "Newsletters and Digests", "Voicemail Call and Missed Call Notifications"]
or
headers.in_reply_to is_null
headers.references length_compare "0"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | atlassian.net, myworkday.com, protiviti.com, roberthalf.be, roberthalf.com, service-now.com, workday.com | excludes:sender.email.domain.root_domain |
ml.nlu_classifier(body.current_thread.text).topics | array_any | excludes:ml.nlu_classifier(body.current_thread.text).topics |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
headers.in_reply_to | is_null | field:"headers.in_reply_to" kind:is_null | |
sender.display_name | contains |
| field:"sender.display_name" kind:contains value:"Robert Half" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Robinhood
#Detects messages impersonating Robinhood by analyzing sender display name, domain, body content including specific address references, and social media links, while excluding legitimate Robinhood communications with proper DMARC authentication.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
(
any(ml.nlu_classifier(body.current_thread.text).entities,
.name in ("org", "sender") and strings.icontains(.text, 'Robinhood')
)
and (
any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "callback_scam" and .confidence != "low"
)
)
)
or strings.icontains(body.current_thread.text, 'The Robinhood Team')
or strings.icontains(body.current_thread.text, 'robinhood automated message')
or regex.icontains(body.current_thread.text, '©\s*20[0-9]{2}\s*\s*Robinhood')
or regex.icontains(body.current_thread.text,
'(?:\+?\d{0,2}[\s\-\.]*)?(?:\(?888\)?)[\s\-\.]*344[\s\-\.]*3957'
)
or regex.icontains(body.current_thread.text,
'brokerage clearing (?:service|company|business)'
)
or regex.icontains(body.html.raw, 'new passkey was recently added')
or 2 of (
strings.icontains(body.current_thread.text, "Robinhood"),
regex.icontains(body.current_thread.text, '42 Willow (?:Road|St)'),
strings.icontains(body.current_thread.text, "Menlo Park, CA 97095")
)
or (
strings.icontains(sender.display_name, 'Robinhood')
and (
3 of (
regex.icontains(body.current_thread.text, 'Location:?'),
regex.icontains(body.current_thread.text, 'Time:'),
regex.icontains(body.current_thread.text, 'Device:?'),
regex.icontains(body.current_thread.text, 'IP Address:?'),
regex.icontains(body.current_thread.text, 'Date:'),
regex.icontains(body.current_thread.text, 'Region:?'),
regex.icontains(body.current_thread.text, 'App:?'),
regex.icontains(body.current_thread.text, 'Email ID:?')
)
or strings.icontains(body.current_thread.text, "new passkey added")
or strings.icontains(body.current_thread.text,
"Security support phone number"
)
)
)
or (
length(filter(body.links,
strings.icontains(.href_url.url,
'https://www.facebook.com/robinhood'
)
or strings.icontains(.href_url.url,
'https://twitter.com/robinhoodapp'
)
or strings.icontains(.href_url.url,
'https://www.youtube.com/@RobinhoodApp'
)
or strings.icontains(.href_url.url,
'https://www.instagram.com/robinhood'
)
)
) >= 2
)
)
// negate legitimate replies and forwards
and (
(
(length(headers.references) > 0 or headers.in_reply_to is null)
and not (subject.is_reply or subject.is_forward)
)
or length(headers.references) == 0
)
// negate newsletters and webinars
and not any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Newsletters and Digests",
"Health and Wellness",
"Events and Webinars"
)
and .confidence == "high"
)
and not any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "benign" and .confidence == "high"
)
and not (
sender.email.domain.root_domain in (
"robinhood.com",
"robinhood.org",
"duck.com", // unrelated domain
"robinhoodauctions.com", // unrelated domain
"bitstamp.net", // robinhood acquisition
"sinch.com" // unrelated domain
)
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
Detects messages impersonating Robinhood by analyzing sender display name, domain, body content including specific address references, and social media links, while excluding legitimate Robinhood communications with proper DMARC authentication.
- inbound message
any of:
all of:
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name in ('org', 'sender')
- .text contains 'Robinhood'
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name is 'callback_scam'
- .confidence is not 'low'
- body.current_thread.text contains 'The Robinhood Team'
- body.current_thread.text contains 'robinhood automated message'
- body.current_thread.text matches '©\\s*20[0-9]{2}\\s*\\s*Robinhood'
- body.current_thread.text matches '(?:\\+?\\d{0,2}[\\s\\-\\.]*)?(?:\\(?888\\)?)[\\s\\-\\.]*344[\\s\\-\\.]*3957'
- body.current_thread.text matches 'brokerage clearing (?:service|company|business)'
- body.html.raw matches 'new passkey was recently added'
at least 2 of:
- body.current_thread.text contains 'Robinhood'
- body.current_thread.text matches '42 Willow (?:Road|St)'
- body.current_thread.text contains 'Menlo Park, CA 97095'
all of:
- sender.display_name contains 'Robinhood'
any of:
at least 3 of 8: body.current_thread.text matches any of 8 patterns
Location:?Time:Device:?IP Address:?Date:Region:?App:?Email ID:?
- body.current_thread.text contains 'new passkey added'
- body.current_thread.text contains 'Security support phone number'
- length(filter(body.links, strings.icontains(.href_url.url, 'https://www.facebook.com/robinhood') or strings.icontains(.href_url.url, 'https://twitter.com/robinhoodapp') or strings.icontains(.href_url.url, 'https://www.youtube.com/@RobinhoodApp') or strings.icontains(.href_url.url, 'https://www.instagram.com/robinhood'))) ≥ 2
any of:
all of:
any of:
- length(headers.references) > 0
- headers.in_reply_to is missing
none of:
- subject.is_reply
- subject.is_forward
- length(headers.references) is 0
not:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Newsletters and Digests', 'Health and Wellness', 'Events and Webinars')
- .confidence is 'high'
not:
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name is 'benign'
- .confidence is 'high'
not:
all of:
- sender.email.domain.root_domain in ('robinhood.com', 'robinhood.org', 'duck.com', 'robinhoodauctions.com', 'bitstamp.net', 'sinch.com')
- coalesce(headers.auth_summary.dmarc.pass)
Inspects: body.current_thread.text, body.html.raw, body.links, body.links[].href_url.url, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.display_name, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains.
Indicators matched (26)
| Field | Match | Value |
|---|---|---|
ml.nlu_classifier(body.current_thread.text).entities[].name | member | org |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | sender |
strings.icontains | substring | Robinhood |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | callback_scam |
strings.icontains | substring | The Robinhood Team |
strings.icontains | substring | robinhood automated message |
regex.icontains | regex | ©\s*20[0-9]{2}\s*\s*Robinhood |
regex.icontains | regex | (?:\+?\d{0,2}[\s\-\.]*)?(?:\(?888\)?)[\s\-\.]*344[\s\-\.]*3957 |
regex.icontains | regex | brokerage clearing (?:service|company|business) |
regex.icontains | regex | new passkey was recently added |
regex.icontains | regex | 42 Willow (?:Road|St) |
strings.icontains | substring | Menlo Park, CA 97095 |
14 more
regex.icontains | regex | Location:? |
regex.icontains | regex | Time: |
regex.icontains | regex | Device:? |
regex.icontains | regex | IP Address:? |
regex.icontains | regex | Date: |
regex.icontains | regex | Region:? |
regex.icontains | regex | App:? |
regex.icontains | regex | Email ID:? |
strings.icontains | substring | new passkey added |
strings.icontains | substring | Security support phone number |
strings.icontains | substring | https://www.facebook.com/robinhood |
strings.icontains | substring | https://twitter.com/robinhoodapp |
strings.icontains | substring | https://www.youtube.com/@RobinhoodApp |
strings.icontains | substring | https://www.instagram.com/robinhood |
Stages and Predicates
Stage 1: mql_rule
and
or
and
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name in ["org", "sender"]
ml.nlu_classifier(body.current_thread.text).entities.text contains "Robinhood"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).intents.name eq "callback_scam"
and
or
body.current_thread.text contains "Security support phone number"
body.current_thread.text contains "new passkey added"
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Location:?"
body.current_thread.text regex_match "Region:?"
body.current_thread.text regex_match "Time:"
sender.display_name contains "Robinhood"
body.current_thread.text contains "Menlo Park, CA 97095"
body.current_thread.text contains "Robinhood"
body.current_thread.text contains "The Robinhood Team"
body.current_thread.text contains "robinhood automated message"
body.current_thread.text regex_match "(?:\\+?\\d{0,2}[\\s\\-\\.]*)?(?:\\(?888\\)?)[\\s\\-\\.]*344[\\s\\-\\.]*3957"
body.current_thread.text regex_match "42 Willow (?:Road|St)"
body.current_thread.text regex_match "brokerage clearing (?:service|company|business)"
body.current_thread.text regex_match "©\\s*20[0-9]{2}\\s*\\s*Robinhood"
body.html.raw regex_match "new passkey was recently added"
filter(body.links, strings.icontains(.href_url.url, 'https://www.facebook.com/robinhood') or strings.icontains(.href_url.url, 'https://twitter.com/robinhoodapp') or strings.icontains(.href_url.url, 'https://www.youtube.com/@RobinhoodApp') or strings.icontains(.href_url.url, 'https://www.instagram.com/robinhood')) length_compare "2"
or
and
not
or
subject.is_forward eq "true"
subject.is_reply eq "true"
or
headers.in_reply_to is_null
headers.references length_compare "0"
headers.references length_compare "0"
not
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "benign"
not
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).topics.name in ["Events and Webinars", "Health and Wellness", "Newsletters and Digests"]
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
sender.email.domain.root_domain in ["bitstamp.net", "duck.com", "robinhood.com", "robinhood.org", "robinhoodauctions.com", "sinch.com"]
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
ml.nlu_classifier(body.current_thread.text).intents | array_any | excludes:ml.nlu_classifier(body.current_thread.text).intents | |
ml.nlu_classifier(body.current_thread.text).topics | array_any | excludes:ml.nlu_classifier(body.current_thread.text).topics | |
sender.email.domain.root_domain | in | bitstamp.net, duck.com, robinhood.com, robinhood.org, robinhoodauctions.com, sinch.com | excludes:sender.email.domain.root_domain |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
body.html.raw | regex_match |
| field:"body.html.raw" kind:regex_match value:"new passkey was recently added" |
headers.in_reply_to | is_null | field:"headers.in_reply_to" kind:is_null | |
sender.display_name | contains |
| field:"sender.display_name" kind:contains value:"Robinhood" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: SendGrid
#Detects inbound messages that impersonate Twilio/SendGrid through display name or domain manipulation, combined with security or authentication-themed content, while failing authentication checks and originating from untrusted sources.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Credential Phishing, Spam |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
(
// SendGrid impersonation patterns
strings.ilike(strings.replace_confusables(sender.display_name),
'*sendgrid*'
)
or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
'sendgrid'
) <= 1
or regex.icontains(sender.display_name,
's[\x{2063}\x{200B}]+e[\x{2063}\x{200B}]+n[\x{2063}\x{200B}]+d[\x{2063}\x{200B}]+g[\x{2063}\x{200B}]+r[\x{2063}\x{200B}]+i[\x{2063}\x{200B}]+d'
)
or (
strings.ilike(strings.replace_confusables(sender.email.local_part),
'*sendgrid*'
)
and (
sender.display_name is null
or strings.ilike(strings.replace_confusables(subject.base),
'*sendgrid*'
)
)
)
or any(ml.logo_detect(file.message_screenshot()).brands,
.name == "SendGrid" and .confidence == "high"
)
)
or (
// Twilio impersonation patterns
strings.ilike(strings.replace_confusables(sender.display_name), '*twilio*')
or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
'twilio'
) <= 1
or (
strings.ilike(strings.replace_confusables(sender.email.local_part),
'*twilio*'
)
and (
sender.display_name is null
or strings.ilike(strings.replace_confusables(subject.base), '*twilio*')
)
)
)
or strings.icontains(body.current_thread.text, "the sendgrid team")
or 2 of (
regex.icontains(body.current_thread.text, '(?:Twilio|SendGrid)'),
strings.icontains(body.current_thread.text, '1801 California St'),
strings.icontains(body.current_thread.text, 'Denver, CO 80202')
)
// SendGrid content from non-SendGrid marketing platforms
or (
sender.email.domain.root_domain in (
"selfcast.com",
"mailchimp.com",
"constantcontact.com",
"hubspot.com",
"klaviyo.com",
"mailgun.com"
)
and (
(
(
strings.icontains(body.current_thread.text, "sendgrid")
or strings.icontains(subject.base, "sendgrid")
)
and 3 of (
strings.icontains(body.current_thread.text, "webhook"),
strings.icontains(body.current_thread.text, "endpoint"),
strings.icontains(body.current_thread.text, "api"),
strings.icontains(body.current_thread.text, "delivery"),
strings.icontains(body.current_thread.text, "event notification")
)
)
and (
// Look for SendGrid-related content with non-SendGrid tracking links
any(body.links,
strings.icontains(.href_url.url, "selfcast.com")
or (
.display_url.url is not null
and strings.icontains(.display_url.url, "sendgrid.com")
)
)
)
)
)
)
and (
// Content analysis using ML/NLU
any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications",
"Software and App Updates",
"Customer Service and Support"
)
and .confidence in ("medium", "high")
)
or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications",
"Software and App Updates",
"Customer Service and Support"
)
and .confidence in ("medium", "high")
)
or 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"
)
// any capacity or limits mentioned
or any([subject.base, body.current_thread.text],
(strings.icontains(., "capacity") or strings.icontains(., "limit"))
and regex.icontains(., '\breach(?:\b|ed)')
)
)
// and the sender is not in org_domains or from sendgrid domains and passes auth
and not (
sender.email.domain.valid
and (
sender.email.domain.root_domain in $org_domains
or (
sender.email.domain.root_domain in (
"sendgrid.com",
"sendgrid.net",
"twilio.com",
"swoogo.com", // events planning software used by Twillio
"sendsafely.com", // secure delivery used by Twillio
"evolve.com", // same address as Twillio
"sendgridsolutions.com"
)
)
)
and headers.auth_summary.dmarc.pass
)
// negate highly trusted sender domains unless they fail DMARC authentication
and not (
sender.email.domain.root_domain in $high_trust_sender_root_domains
and coalesce(headers.auth_summary.dmarc.pass, false)
)
and not profile.by_sender().solicited
Detection logic
Scope: inbound message.
Detects inbound messages that impersonate Twilio/SendGrid through display name or domain manipulation, combined with security or authentication-themed content, while failing authentication checks and originating from untrusted sources.
- inbound message
any of:
any of:
- strings.replace_confusables(sender.display_name) matches '*sendgrid*'
- strings.replace_confusables(sender.display_name) is similar to 'sendgrid'
- sender.display_name matches 's[\\x{2063}\\x{200B}]+e[\\x{2063}\\x{200B}]+n[\\x{2063}\\x{200B}]+d[\\x{2063}\\x{200B}]+g[\\x{2063}\\x{200B}]+r[\\x{2063}\\x{200B}]+i[\\x{2063}\\x{200B}]+d'
all of:
- strings.replace_confusables(sender.email.local_part) matches '*sendgrid*'
any of:
- sender.display_name is missing
- strings.replace_confusables(subject.base) matches '*sendgrid*'
any of
ml.logo_detect(file.message_screenshot()).brandswhere all hold:- .name is 'SendGrid'
- .confidence is 'high'
any of:
- strings.replace_confusables(sender.display_name) matches '*twilio*'
- strings.replace_confusables(sender.display_name) is similar to 'twilio'
all of:
- strings.replace_confusables(sender.email.local_part) matches '*twilio*'
any of:
- sender.display_name is missing
- strings.replace_confusables(subject.base) matches '*twilio*'
- body.current_thread.text contains 'the sendgrid team'
at least 2 of:
- body.current_thread.text matches '(?:Twilio|SendGrid)'
- body.current_thread.text contains '1801 California St'
- body.current_thread.text contains 'Denver, CO 80202'
all of:
- sender.email.domain.root_domain in ('selfcast.com', 'mailchimp.com', 'constantcontact.com', 'hubspot.com', 'klaviyo.com', 'mailgun.com')
all of:
all of:
any of:
- body.current_thread.text contains 'sendgrid'
- subject.base contains 'sendgrid'
at least 3 of 5: body.current_thread.text contains any of 5 patterns
webhookendpointapideliveryevent notification
any of
body.linkswhere any holds:- .href_url.url contains 'selfcast.com'
all of:
- .display_url.url is set
- .display_url.url contains 'sendgrid.com'
any of:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications', 'Software and App Updates', 'Customer Service and Support')
- .confidence in ('medium', 'high')
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications', 'Software and App Updates', 'Customer Service and Support')
- .confidence in ('medium', 'high')
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'
any of
[subject.base, body.current_thread.text]where all hold:any of:
- . contains 'capacity'
- . contains 'limit'
- . matches '\\breach(?:\\b|ed)'
not:
all of:
- sender.email.domain.valid
any of:
- sender.email.domain.root_domain in $org_domains
- sender.email.domain.root_domain in ('sendgrid.com', 'sendgrid.net', 'twilio.com', 'swoogo.com', 'sendsafely.com', 'evolve.com', 'sendgridsolutions.com')
- headers.auth_summary.dmarc.pass
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass)
not:
- profile.by_sender().solicited
Inspects: body.current_thread.text, body.links, body.links[].display_url.url, body.links[].href_url.url, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, sender.email.domain.valid, sender.email.local_part, subject.base, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, regex.icontains, strings.icontains, strings.ilevenshtein, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (46)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *sendgrid* |
strings.ilevenshtein | fuzzy | sendgrid |
regex.icontains | regex | s[\x{2063}\x{200B}]+e[\x{2063}\x{200B}]+n[\x{2063}\x{200B}]+d[\x{2063}\x{200B}]+g[\x{2063}\x{200B}]+r[\x{2063}\x{200B}]+i[\x{2063}\x{200B}]+d |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | SendGrid |
ml.logo_detect(file.message_screenshot()).brands[].confidence | equals | high |
strings.ilike | substring | *twilio* |
strings.ilevenshtein | fuzzy | twilio |
strings.icontains | substring | the sendgrid team |
regex.icontains | regex | (?:Twilio|SendGrid) |
strings.icontains | substring | 1801 California St |
strings.icontains | substring | Denver, CO 80202 |
sender.email.domain.root_domain | member | selfcast.com |
34 more
sender.email.domain.root_domain | member | mailchimp.com |
sender.email.domain.root_domain | member | constantcontact.com |
sender.email.domain.root_domain | member | hubspot.com |
sender.email.domain.root_domain | member | klaviyo.com |
sender.email.domain.root_domain | member | mailgun.com |
strings.icontains | substring | sendgrid |
strings.icontains | substring | webhook |
strings.icontains | substring | endpoint |
strings.icontains | substring | api |
strings.icontains | substring | delivery |
strings.icontains | substring | event notification |
strings.icontains | substring | selfcast.com |
strings.icontains | substring | sendgrid.com |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Secure Message |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Reminders and Notifications |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Software and App Updates |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Customer Service and Support |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | medium |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | high |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Secure Message |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Reminders and Notifications |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Software and App Updates |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Customer Service and Support |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | medium |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | high |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | equals | high |
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 |
strings.icontains | substring | capacity |
strings.icontains | substring | limit |
regex.icontains | regex | \breach(?:\b|ed) |
Stages and Predicates
Stage 1: mql_rule
and
or
and
any(body.links)
or
and
body.links.display_url.url contains "sendgrid.com"
body.links.display_url.url is_not_null
body.links.href_url.url contains "selfcast.com"
or
body.current_thread.text contains "api"
body.current_thread.text contains "delivery"
body.current_thread.text contains "endpoint"
body.current_thread.text contains "event notification"
body.current_thread.text contains "webhook"
or
body.current_thread.text contains "sendgrid"
subject.base contains "sendgrid"
sender.email.domain.root_domain in ["constantcontact.com", "hubspot.com", "klaviyo.com", "mailchimp.com", "mailgun.com", "selfcast.com"]
any(ml.logo_detect(file.message_screenshot()).brands)
and
ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
ml.logo_detect(file.message_screenshot()).brands.name eq "SendGrid"
and
or
sender.display_name is_null
strings.replace_confusables(subject.base) match "sendgrid"
strings.replace_confusables(sender.email.local_part) match "sendgrid"
and
or
sender.display_name is_null
strings.replace_confusables(subject.base) match "twilio"
strings.replace_confusables(sender.email.local_part) match "twilio"
body.current_thread.text contains "1801 California St"
body.current_thread.text contains "Denver, CO 80202"
body.current_thread.text contains "the sendgrid team"
body.current_thread.text regex_match "(?:Twilio|SendGrid)"
sender.display_name regex_match "s[\\x{2063}\\x{200B}]+e[\\x{2063}\\x{200B}]+n[\\x{2063}\\x{200B}]+d[\\x{2063}\\x{200B}]+g[\\x{2063}\\x{200B}]+r[\\x{2063}\\x{200B}]+i[\\x{2063}\\x{200B}]+d"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"sendgrid\") <= 1"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"twilio\") <= 1"
strings.replace_confusables(sender.display_name) match "sendgrid"
strings.replace_confusables(sender.display_name) match "twilio"
or
any([subject.base, body.current_thread.text])
and
or
[subject.base, body.current_thread.text] contains "capacity"
[subject.base, body.current_thread.text] contains "limit"
[subject.base, body.current_thread.text] regex_match "\\breach(?:\\b|ed)"
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Customer Service and Support", "Reminders and Notifications", "Secure Message", "Security and Authentication", "Software and App Updates"]
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(body.current_thread.text).topics.name in ["Customer Service and Support", "Reminders and Notifications", "Secure Message", "Security and Authentication", "Software and App Updates"]
not
and
or
sender.email.domain.root_domain in ["evolve.com", "sendgrid.com", "sendgrid.net", "sendgridsolutions.com", "sendsafely.com", "swoogo.com", "twilio.com"]
macro "sender.email.domain.root_domain in org_domains"
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.valid eq "true"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
not
profile.by_sender func_call "profile.by_sender().solicited"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.email.domain.root_domain | in | evolve.com, sendgrid.com, sendgrid.net, sendgridsolutions.com, sendsafely.com, swoogo.com, twilio.com | excludes:sender.email.domain.root_domain |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.valid | eq | true | excludes:sender.email.domain.valid field:"sender.email.domain.valid" value:"true" |
Indicators
These rows show field, operator, and value matches.
Brand Impersonation: Shein
#Detects suspicious Shein-branded communications using display name impersonation, logo detection, and deceptive content analysis. Includes checks for security/authentication topics, secure messages, notifications, and promotional content like fake surveys or giveaways. Excludes legitimate Shein domains with proper authentication and known trusted senders.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, Spam |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
// display name contains Shein
(
(
regex.icontains(strings.replace_confusables(sender.display_name),
'\bsh[ie]{2}n\b'
)
and not strings.icontains(sender.display_name, "sheen")
)
or (
length(ml.logo_detect(file.message_screenshot()).brands) == 1
and all(ml.logo_detect(file.message_screenshot()).brands,
.name == "Shein" and .confidence == "high"
)
)
)
)
and (
(
length(ml.nlu_classifier(body.current_thread.text).topics) > 0
and all(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications",
"Advertising and Promotions" // fake surveys/giveaways have been observed
)
and .confidence in ("medium", "high")
)
)
or (
beta.ocr(file.message_screenshot()).text != ""
and length(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics
) > 0
and all(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications",
"Advertising and Promotions" // fake surveys/giveaways have been observed
)
and .confidence in ("medium", "high")
)
)
or 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 Shein domains and passes auth
and not (
sender.email.domain.root_domain in $org_domains
or (
length(attachments) == 1
// this is Shein's return label generator
and all(attachments,
.file_type == "pdf"
and strings.icontains(beta.parse_exif(.).creator, "MondialRelay")
)
)
or (
sender.email.domain.root_domain in (
"shein.com",
"shein.com.mx",
"sheinemail.com",
"shein.co.uk",
"sheingroup.com",
"sheinnotice.com",
"cash.app",
"capitaloneshopping.com"
)
and (
headers.auth_summary.dmarc.pass
// for when DMARC fails, but it's still a legit Shein newsletter
or (
length(body.links) > 10
and ratio(body.links,
.href_url.domain.root_domain in (
"shein.com",
"sheinemail.com",
"shein.co.uk",
"sheingroup.com",
"sheinnotice.com",
"cash.app",
"capitaloneshopping.com"
)
) > 0.6
)
)
)
// parse out original sender domain from Apple Private Relay info
or (
sender.email.domain.domain in ("privaterelay.appleid.com", "icloud.com")
and strings.ilike(sender.email.local_part,
'*shein_com*',
'*sheinemail_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
or not headers.auth_summary.dmarc.pass
or not headers.auth_summary.spf.pass
)
Detection logic
Scope: inbound message.
Detects suspicious Shein-branded communications using display name impersonation, logo detection, and deceptive content analysis. Includes checks for security/authentication topics, secure messages, notifications, and promotional content like fake surveys or giveaways. Excludes legitimate Shein domains with proper authentication and known trusted senders.
- inbound message
any of:
all of:
- strings.replace_confusables(sender.display_name) matches '\\bsh[ie]{2}n\\b'
not:
- sender.display_name contains 'sheen'
all of:
- length(ml.logo_detect(file.message_screenshot()).brands) is 1
all of
ml.logo_detect(file.message_screenshot()).brandswhere all hold:- .name is 'Shein'
- .confidence is 'high'
any of:
all of:
- length(ml.nlu_classifier(body.current_thread.text).topics) > 0
all of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications', 'Advertising and Promotions')
- .confidence in ('medium', 'high')
all of:
- beta.ocr(file.message_screenshot()).text is not ''
- length(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics) > 0
all of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications', 'Advertising and Promotions')
- .confidence in ('medium', 'high')
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:
- length(attachments) is 1
all of
attachmentswhere all hold:- .file_type is 'pdf'
- beta.parse_exif(.).creator contains 'MondialRelay'
all of:
- sender.email.domain.root_domain in ('shein.com', 'shein.com.mx', 'sheinemail.com', 'shein.co.uk', 'sheingroup.com', 'sheinnotice.com', 'cash.app', 'capitaloneshopping.com')
any of:
- headers.auth_summary.dmarc.pass
all of:
- length(body.links) > 10
- ratio(body.links) > 0.6
all of:
- sender.email.domain.domain in ('privaterelay.appleid.com', 'icloud.com')
sender.email.local_part matches any of 2 patterns
*shein_com**sheinemail_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
any of:
not:
- profile.by_sender().solicited
not:
- headers.auth_summary.dmarc.pass
not:
- headers.auth_summary.spf.pass
Inspects: attachments[].file_type, body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, sender.email.local_part, type.inbound. Sensors: beta.ocr, beta.parse_exif, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, regex.icontains, strings.icontains, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (19)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | \bsh[ie]{2}n\b |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | Shein |
ml.logo_detect(file.message_screenshot()).brands[].confidence | equals | high |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Secure Message |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Reminders and Notifications |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Advertising and Promotions |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | medium |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | high |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Secure Message |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Reminders and Notifications |
7 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Advertising and Promotions |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | medium |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | high |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | equals | high |
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 |
Stages and Predicates
Stage 1: mql_rule
and
not
or
and
or
and
body.links length_compare "10"
ratio func_call "ratio(body.links) > 0.6"
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["capitaloneshopping.com", "cash.app", "shein.co.uk", "shein.com", "shein.com.mx", "sheinemail.com", "sheingroup.com", "sheinnotice.com"]
and
or
sender.email.local_part match "shein_com"
sender.email.local_part match "sheinemail_com"
sender.email.domain.domain in ["icloud.com", "privaterelay.appleid.com"]
and
attachments length_compare "1"
macro "all(attachments)"
macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
and
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics length_compare "0"
macro "all(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)"
and
ml.nlu_classifier(body.current_thread.text).topics length_compare "0"
macro "all(ml.nlu_classifier(body.current_thread.text).topics)"
or
and
not
sender.display_name contains "sheen"
strings.replace_confusables(sender.display_name) regex_match "\\bsh[ie]{2}n\\b"
and
ml.logo_detect(file.message_screenshot()).brands length_compare "1"
macro "all(ml.logo_detect(file.message_screenshot()).brands)"
or
not
headers.auth_summary.dmarc.pass eq "true"
not
headers.auth_summary.spf.pass eq "true"
not
profile.by_sender func_call "profile.by_sender().solicited"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
body.links | length_compare | 10 | excludes:body.links field:"body.links" value:"10" |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | capitaloneshopping.com, cash.app, shein.co.uk, shein.com, shein.com.mx, sheinemail.com, sheingroup.com, sheinnotice.com | excludes:sender.email.domain.root_domain |
sender.email.local_part | match | shein_com | excludes:sender.email.local_part field:"sender.email.local_part" value:"shein_com" |
sender.email.local_part | match | sheinemail_com | excludes:sender.email.local_part field:"sender.email.local_part" value:"sheinemail_com" |
sender.email.domain.domain | in | icloud.com, privaterelay.appleid.com | excludes:sender.email.domain.domain field:"sender.email.domain.domain" value:"icloud.com" field:"sender.email.domain.domain" value:"privaterelay.appleid.com" |
attachments | length_compare | 1 | excludes:attachments field:"attachments" value:"1" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
strings.replace_confusables(sender.display_name) | regex_match |
| field:"strings.replace_confusables(sender.display_name)" kind:regex_match value:"\bsh[ie]{2}n\b" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: SiriusXM
#Impersonation of the broadcasting corporation SiriusXM.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, Credential Phishing, Spam |
| Tactics and techniques | Free email provider, Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
regex.icontains(sender.display_name, 'sirius[._-]?xm')
or strings.ilevenshtein(sender.display_name, 'siriusxm') <= 1
or strings.ilike(sender.email.domain.domain, '*siriusxm*')
or (
strings.istarts_with(body.current_thread.text, 'sirius xm')
and regex.contains(body.current_thread.text,
'[\x{1F600}-\x{1F64F}]|[\x{1F300}-\x{1F5FF}]|[\x{1F680}-\x{1F6FF}]|[\x{1F1E0}-\x{1F1FF}]|[\x{2600}-\x{26FF}]|[\x{2700}-\x{27BF}]'
)
)
)
and (
sender.email.domain.root_domain not in (
'siriusxm.com',
'siriusxmmedia.com',
'siriusxm.ca',
'engagement360.net', // SiriusXM survey vendor
'sciquest.com' // SiriusXM Procurement
)
or (
sender.email.domain.root_domain in (
'siriusxm.com',
'siriusxmmedia.com',
'siriusxm.ca',
'engagement360.net', // SiriusXM survey vendor
'sciquest.com' // SiriusXM Procurement
)
and not headers.auth_summary.dmarc.pass
)
)
and not profile.by_sender().solicited
// negate highly trusted sender domains unless they fail DMARC authentication
and not (
sender.email.domain.root_domain in $high_trust_sender_root_domains
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
Impersonation of the broadcasting corporation SiriusXM.
- inbound message
any of:
- sender.display_name matches 'sirius[._-]?xm'
- sender.display_name is similar to 'siriusxm'
- sender.email.domain.domain matches '*siriusxm*'
all of:
- body.current_thread.text starts with 'sirius xm'
- body.current_thread.text matches '[\\x{1F600}-\\x{1F64F}]|[\\x{1F300}-\\x{1F5FF}]|[\\x{1F680}-\\x{1F6FF}]|[\\x{1F1E0}-\\x{1F1FF}]|[\\x{2600}-\\x{26FF}]|[\\x{2700}-\\x{27BF}]'
any of:
- sender.email.domain.root_domain not in ('siriusxm.com', 'siriusxmmedia.com', 'siriusxm.ca', 'engagement360.net', 'sciquest.com')
all of:
- sender.email.domain.root_domain in ('siriusxm.com', 'siriusxmmedia.com', 'siriusxm.ca', 'engagement360.net', 'sciquest.com')
not:
- headers.auth_summary.dmarc.pass
not:
- profile.by_sender().solicited
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass)
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: profile.by_sender, regex.contains, regex.icontains, strings.ilevenshtein, strings.ilike, strings.istarts_with. Reference lists: $high_trust_sender_root_domains.
Indicators matched (10)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | sirius[._-]?xm |
strings.ilevenshtein | fuzzy | siriusxm |
strings.ilike | substring | *siriusxm* |
strings.istarts_with | prefix | sirius xm |
regex.contains | regex | [\x{1F600}-\x{1F64F}]|[\x{1F300}-\x{1F5FF}]|[\x{1F680}-\x{1F6FF}]|[\x{1F1E0}-\x{1F1FF}]|[\x{2600}-\x{26FF}]|[\x{2700}-\x{27BF}] |
sender.email.domain.root_domain | member | siriusxm.com |
sender.email.domain.root_domain | member | siriusxmmedia.com |
sender.email.domain.root_domain | member | siriusxm.ca |
sender.email.domain.root_domain | member | engagement360.net |
sender.email.domain.root_domain | member | sciquest.com |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["engagement360.net", "sciquest.com", "siriusxm.ca", "siriusxm.com", "siriusxmmedia.com"]
not
sender.email.domain.root_domain in ["engagement360.net", "sciquest.com", "siriusxm.ca", "siriusxm.com", "siriusxmmedia.com"]
or
and
body.current_thread.text regex_match "[\\x{1F600}-\\x{1F64F}]|[\\x{1F300}-\\x{1F5FF}]|[\\x{1F680}-\\x{1F6FF}]|[\\x{1F1E0}-\\x{1F1FF}]|[\\x{2600}-\\x{26FF}]|[\\x{2700}-\\x{27BF}]"
body.current_thread.text starts_with "sirius xm"
sender.display_name regex_match "sirius[._-]?xm"
sender.email.domain.domain match "siriusxm"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"siriusxm\") <= 1"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
not
profile.by_sender func_call "profile.by_sender().solicited"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
body.current_thread.text | starts_with |
| field:"body.current_thread.text" kind:starts_with value:"sirius xm" |
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match value:"sirius[._-]?xm" |
sender.email.domain.domain | wildcard |
| field:"sender.email.domain.domain" kind:wildcard value:"*siriusxm*" |
sender.email.domain.root_domain | in |
| field:"sender.email.domain.root_domain" kind:in |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: SoFi
#Detects messages impersonating SoFi by analyzing sender display name, domain, body content including specific address references and phone numbers, while excluding legitimate SoFi communications with proper DMARC authentication.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// standard brand template
and (
// disclaimer
(
regex.icontains(body.current_thread.text,
'\bsofi (?:bank|invest|securities|team|tech|wealth)\b'
)
and regex.icontains(body.current_thread.text,
'©.20[0-9]{2}.(?:sofi|social finance)'
)
// phone numbers
and regex.icontains(body.current_thread.text,
'\(855\)[\s\-\.]456[\s\-\.]7634',
'\(844\)[\s\-\.]908[\s\-\.]7634'
)
)
// address
or (
regex.icontains(body.current_thread.text, '\bsofi\b')
and strings.icontains(body.current_thread.text, "2750 E Cottonwood Pkwy")
and strings.icontains(body.current_thread.text, "Salt Lake City, UT 84121")
)
// observed cred theft ttp
or (
regex.icontains(sender.display_name, '\bsofi\b')
and strings.icontains(body.current_thread.text,
"trade confirmation",
"self-directed investing account"
)
)
)
// negate legitimate replies
and not (
(length(headers.references) > 0 or headers.in_reply_to is not null)
and (subject.is_forward or subject.is_reply)
and length(body.previous_threads) >= 1
)
// topic negations
and not any(ml.nlu_classifier(body.current_thread.text).topics,
.name in ("Newsletters and Digests")
)
// negate sofi & related domains
and not (
sender.email.domain.root_domain in (
"sofi.com", // parent domain
"sofi.org", // observed sender domain
"samsung.com", // financial partnership
"investordelivery.com" // financials delivery platform
)
and coalesce(headers.auth_summary.dmarc.pass, false)
)
// negate high trust sender root domains unless they fail authentication
and not (
sender.email.domain.root_domain in $high_trust_sender_root_domains
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
Detects messages impersonating SoFi by analyzing sender display name, domain, body content including specific address references and phone numbers, while excluding legitimate SoFi communications with proper DMARC authentication.
- inbound message
any of:
all of:
- body.current_thread.text matches '\\bsofi (?:bank|invest|securities|team|tech|wealth)\\b'
- body.current_thread.text matches '©.20[0-9]{2}.(?:sofi|social finance)'
body.current_thread.text matches any of 2 patterns
\(855\)[\s\-\.]456[\s\-\.]7634\(844\)[\s\-\.]908[\s\-\.]7634
all of:
- body.current_thread.text matches '\\bsofi\\b'
- body.current_thread.text contains '2750 E Cottonwood Pkwy'
- body.current_thread.text contains 'Salt Lake City, UT 84121'
all of:
- sender.display_name matches '\\bsofi\\b'
body.current_thread.text contains any of 2 patterns
trade confirmationself-directed investing account
not:
all of:
any of:
- length(headers.references) > 0
- headers.in_reply_to is set
any of:
- subject.is_forward
- subject.is_reply
- length(body.previous_threads) ≥ 1
not:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere:- .name in ('Newsletters and Digests')
not:
all of:
- sender.email.domain.root_domain in ('sofi.com', 'sofi.org', 'samsung.com', 'investordelivery.com')
- coalesce(headers.auth_summary.dmarc.pass)
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass)
Inspects: body.current_thread.text, body.previous_threads, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.display_name, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains. Reference lists: $high_trust_sender_root_domains.
Indicators matched (9)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | \bsofi (?:bank|invest|securities|team|tech|wealth)\b |
regex.icontains | regex | ©.20[0-9]{2}.(?:sofi|social finance) |
regex.icontains | regex | \(855\)[\s\-\.]456[\s\-\.]7634 |
regex.icontains | regex | \(844\)[\s\-\.]908[\s\-\.]7634 |
regex.icontains | regex | \bsofi\b |
strings.icontains | substring | 2750 E Cottonwood Pkwy |
strings.icontains | substring | Salt Lake City, UT 84121 |
strings.icontains | substring | trade confirmation |
strings.icontains | substring | self-directed investing account |
Stages and Predicates
Stage 1: mql_rule
and
or
and
or
body.current_thread.text contains "self-directed investing account"
body.current_thread.text contains "trade confirmation"
sender.display_name regex_match "\\bsofi\\b"
and
or
body.current_thread.text regex_match "\\(844\\)[\\s\\-\\.]908[\\s\\-\\.]7634"
body.current_thread.text regex_match "\\(855\\)[\\s\\-\\.]456[\\s\\-\\.]7634"
body.current_thread.text regex_match "\\bsofi (?:bank|invest|securities|team|tech|wealth)\\b"
body.current_thread.text regex_match "©.20[0-9]{2}.(?:sofi|social finance)"
and
body.current_thread.text contains "2750 E Cottonwood Pkwy"
body.current_thread.text contains "Salt Lake City, UT 84121"
body.current_thread.text regex_match "\\bsofi\\b"
not
and
or
headers.in_reply_to is_not_null
headers.references length_compare "0"
or
subject.is_forward eq "true"
subject.is_reply eq "true"
body.previous_threads length_compare "1"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
sender.email.domain.root_domain in ["investordelivery.com", "samsung.com", "sofi.com", "sofi.org"]
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
not
any(ml.nlu_classifier(body.current_thread.text).topics)
ml.nlu_classifier(body.current_thread.text).topics.name eq "Newsletters and Digests"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.in_reply_to | is_not_null | excludes:headers.in_reply_to | |
headers.references | length_compare | 0 | excludes:headers.references field:"headers.references" value:"0" |
subject.is_forward | eq | true | excludes:subject.is_forward field:"subject.is_forward" value:"true" |
subject.is_reply | eq | true | excludes:subject.is_reply field:"subject.is_reply" value:"true" |
body.previous_threads | length_compare | 1 | excludes:body.previous_threads field:"body.previous_threads" value:"1" |
sender.email.domain.root_domain | in | investordelivery.com, samsung.com, sofi.com, sofi.org | excludes:sender.email.domain.root_domain |
ml.nlu_classifier(body.current_thread.text).topics | array_any | excludes:ml.nlu_classifier(body.current_thread.text).topics |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match value:"\bsofi\b" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Square
#Impersonation of Square, typically containing security-related language, secure message notifications, or credential theft indicators from unauthorized senders.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
// levenshtein distance similar to Square
(
strings.ilevenshtein(strings.replace_confusables(sender.display_name),
'square'
) <= 1
and sender.display_name not in ("SquareX")
)
or any(ml.logo_detect(file.message_screenshot()).brands,
.name == "Square" and .confidence == "high"
)
)
and (
(
any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications"
)
and .confidence in ("medium", "high")
)
and not any(ml.nlu_classifier(body.current_thread.text).topics,
.name in ("Newsletters and Digests", "Entertainment and Sports")
and .confidence in ("medium", "high")
)
)
or (
beta.ocr(file.message_screenshot()).text != ""
and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications"
)
and .confidence in ("medium", "high")
)
and not any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in ("Newsletters and Digests", "Entertainment and Sports")
and .confidence in ("medium", "high")
)
)
or 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 Square domains and passes auth
and not (
sender.email.domain.root_domain in $org_domains
or (
sender.email.domain.root_domain in (
"square.com",
"squareup.com",
"block.com"
)
and headers.auth_summary.dmarc.pass
)
)
// 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
or not headers.auth_summary.dmarc.pass
or not headers.auth_summary.spf.pass
)
Detection logic
Scope: inbound message.
Impersonation of Square, typically containing security-related language, secure message notifications, or credential theft indicators from unauthorized senders.
- inbound message
any of:
all of:
- strings.replace_confusables(sender.display_name) is similar to 'square'
- sender.display_name not in ('SquareX')
any of
ml.logo_detect(file.message_screenshot()).brandswhere all hold:- .name is 'Square'
- .confidence is 'high'
any of:
all of:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
- .confidence in ('medium', 'high')
not:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Newsletters and Digests', 'Entertainment and Sports')
- .confidence in ('medium', 'high')
all of:
- beta.ocr(file.message_screenshot()).text is not ''
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
- .confidence in ('medium', 'high')
not:
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Newsletters and Digests', 'Entertainment and Sports')
- .confidence in ('medium', 'high')
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 ('square.com', 'squareup.com', 'block.com')
- headers.auth_summary.dmarc.pass
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
any of:
not:
- profile.by_sender().solicited
not:
- headers.auth_summary.dmarc.pass
not:
- headers.auth_summary.spf.pass
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, strings.ilevenshtein, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (17)
| Field | Match | Value |
|---|---|---|
strings.ilevenshtein | fuzzy | square |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | Square |
ml.logo_detect(file.message_screenshot()).brands[].confidence | equals | high |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Secure Message |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Reminders and Notifications |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | medium |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | high |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Secure Message |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Reminders and Notifications |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | medium |
5 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | high |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | equals | high |
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 |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Entertainment and Sports", "Newsletters and Digests"]
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
and
not
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(body.current_thread.text).topics.name in ["Entertainment and Sports", "Newsletters and Digests"]
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(body.current_thread.text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
not
or
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["block.com", "square.com", "squareup.com"]
macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
any(ml.logo_detect(file.message_screenshot()).brands)
and
ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
ml.logo_detect(file.message_screenshot()).brands.name eq "Square"
and
not
sender.display_name eq "SquareX"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"square\") <= 1"
or
not
headers.auth_summary.dmarc.pass eq "true"
not
headers.auth_summary.spf.pass eq "true"
not
profile.by_sender func_call "profile.by_sender().solicited"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | block.com, square.com, squareup.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"block.com" field:"sender.email.domain.root_domain" value:"square.com" field:"sender.email.domain.root_domain" value:"squareup.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Squarespace
#Detects impersonation of Squarespace through sender display name or subject line similarity, where the sender is not from legitimate Squarespace domains or fails authentication checks.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
strings.icontains(strings.replace_confusables(sender.display_name),
"squarespace"
)
or strings.ilevenshtein(sender.display_name, "squarespace") < 2
or regex.icontains(sender.display_name,
's\x{206E}+q\x{206E}+u\x{206E}+a\x{206E}+r\x{206E}+e\x{206E}+s\x{206E}+p\x{206E}+a\x{206E}+c\x{206E}+e'
)
)
// and the sender is not in org_domains or from Squarespace domains and passes auth
and not (
sender.email.domain.root_domain in $org_domains
or (
sender.email.domain.root_domain in (
"squarespace.com",
"squarespace.info",
"shipstation.com"
)
and headers.auth_summary.dmarc.pass
)
)
// negate highly trusted sender domains unless they fail DMARC authentication
and not (
sender.email.domain.root_domain in $high_trust_sender_root_domains
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
Detects impersonation of Squarespace through sender display name or subject line similarity, where the sender is not from legitimate Squarespace domains or fails authentication checks.
- inbound message
any of:
- strings.replace_confusables(sender.display_name) contains 'squarespace'
- sender.display_name is similar to 'squarespace'
- sender.display_name matches 's\\x{206E}+q\\x{206E}+u\\x{206E}+a\\x{206E}+r\\x{206E}+e\\x{206E}+s\\x{206E}+p\\x{206E}+a\\x{206E}+c\\x{206E}+e'
none of:
- sender.email.domain.root_domain in $org_domains
all of:
- sender.email.domain.root_domain in ('squarespace.com', 'squarespace.info', 'shipstation.com')
- headers.auth_summary.dmarc.pass
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass)
Inspects: headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: regex.icontains, strings.icontains, strings.ilevenshtein, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | squarespace |
strings.ilevenshtein | fuzzy | squarespace |
regex.icontains | regex | s\x{206E}+q\x{206E}+u\x{206E}+a\x{206E}+r\x{206E}+e\x{206E}+s\x{206E}+p\x{206E}+a\x{206E}+c\x{206E}+e |
Stages and Predicates
Stage 1: mql_rule
and
not
or
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["shipstation.com", "squarespace.com", "squarespace.info"]
macro "sender.email.domain.root_domain in org_domains"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
or
sender.display_name regex_match "s\\x{206E}+q\\x{206E}+u\\x{206E}+a\\x{206E}+r\\x{206E}+e\\x{206E}+s\\x{206E}+p\\x{206E}+a\\x{206E}+c\\x{206E}+e"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"squarespace\") < 2"
strings.replace_confusables(sender.display_name) contains "squarespace"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | shipstation.com, squarespace.com, squarespace.info | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"shipstation.com" field:"sender.email.domain.root_domain" value:"squarespace.com" field:"sender.email.domain.root_domain" value:"squarespace.info" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match value:"s\x{206E}+q\x{206E}+u\x{206E}+a\x{206E}+r\x{206E}+e\x{206E}+s\x{206E}+p\x{206E}+a\x{206E}+c\x{206E}+e" |
strings.replace_confusables(sender.display_name) | contains |
| field:"strings.replace_confusables(sender.display_name)" kind:contains value:"squarespace" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: State Farm
#Detects messages impersonating State Farm insurance company through display name spoofing or similar variations, excluding legitimate communications from verified State Farm domains with proper DMARC authentication.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering, Spoofing |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
regex.icontains(sender.display_name, 'state\s?farm')
and not (
strings.icontains(sender.display_name, "state farm")
and (
strings.icontains(sender.display_name, "center")
or strings.icontains(sender.display_name, "arena")
or strings.icontains(sender.display_name, "stadium")
or strings.icontains(sender.display_name, "hall")
or strings.icontains(sender.display_name, "classic")
or strings.icontains(sender.display_name, "showdown")
or strings.icontains(sender.display_name, "perks at work")
)
)
)
// and the sender is not in org_domains or from State Farm domains
and not (
(
sender.email.domain.root_domain in $org_domains
or sender.email.domain.root_domain in $high_trust_sender_root_domains
or sender.email.domain.root_domain in (
"statefarm.com",
"statefarminsurance.com",
"statefarm.ca",
"statefarmbank.com",
"sfauthentication.com",
"statefarmarena.com",
"statefarmservice.com",
"statefarmisthere.com",
"digitalpayouts.com", // State Farm use this domain for claim payouts
"aravo.com", // risk management company State Farm uses
"statefarmclaims.com",
"statefarmfeedback.com", // legit survey
"statefarmsurveys.com", // legit survey
"nationalesurvey.com"
)
)
)
// negate highly trusted sender domains unless they fail DMARC authentication
and not (
sender.email.domain.root_domain in $high_trust_sender_root_domains
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
Detects messages impersonating State Farm insurance company through display name spoofing or similar variations, excluding legitimate communications from verified State Farm domains with proper DMARC authentication.
- inbound message
all of:
- sender.display_name matches 'state\\s?farm'
not:
all of:
- sender.display_name contains 'state farm'
sender.display_name contains any of 7 patterns
centerarenastadiumhallclassicshowdownperks at work
none of:
- sender.email.domain.root_domain in $org_domains
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- sender.email.domain.root_domain in ('statefarm.com', 'statefarminsurance.com', 'statefarm.ca', 'statefarmbank.com', 'sfauthentication.com', 'statefarmarena.com', 'statefarmservice.com', 'statefarmisthere.com', 'digitalpayouts.com', 'aravo.com', 'statefarmclaims.com', 'statefarmfeedback.com', 'statefarmsurveys.com', 'nationalesurvey.com')
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass)
Inspects: headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: regex.icontains, strings.icontains. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | state\s?farm |
Stages and Predicates
Stage 1: mql_rule
and
not
and
or
sender.display_name contains "arena"
sender.display_name contains "center"
sender.display_name contains "classic"
sender.display_name contains "hall"
sender.display_name contains "perks at work"
sender.display_name contains "showdown"
sender.display_name contains "stadium"
sender.display_name contains "state farm"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
not
or
sender.email.domain.root_domain in ["aravo.com", "digitalpayouts.com", "nationalesurvey.com", "sfauthentication.com", "statefarm.ca", "statefarm.com", "statefarmarena.com", "statefarmbank.com", "statefarmclaims.com", "statefarmfeedback.com", "statefarminsurance.com", "statefarmisthere.com", "statefarmservice.com", "statefarmsurveys.com"]
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain in org_domains"
sender.display_name regex_match "state\\s?farm"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.display_name | contains | arena | excludes:sender.display_name field:"sender.display_name" value:"arena" |
sender.display_name | contains | center | excludes:sender.display_name field:"sender.display_name" value:"center" |
sender.display_name | contains | classic | excludes:sender.display_name field:"sender.display_name" value:"classic" |
sender.display_name | contains | hall | excludes:sender.display_name field:"sender.display_name" value:"hall" |
sender.display_name | contains | perks at work | excludes:sender.display_name field:"sender.display_name" value:"perks at work" |
sender.display_name | contains | showdown | excludes:sender.display_name field:"sender.display_name" value:"showdown" |
sender.display_name | contains | stadium | excludes:sender.display_name field:"sender.display_name" value:"stadium" |
sender.display_name | contains | state farm | excludes:sender.display_name field:"sender.display_name" value:"state farm" |
sender.email.domain.root_domain | in | aravo.com, digitalpayouts.com, nationalesurvey.com, sfauthentication.com, statefarm.ca, statefarm.com, statefarmarena.com, statefarmbank.com, statefarmclaims.com, statefarmfeedback.com, statefarminsurance.com, statefarmisthere.com, statefarmservice.com, statefarmsurveys.com | excludes:sender.email.domain.root_domain |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match value:"state\s?farm" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Stripe notification
#Campaigns have been observed sending templated Stripe notification emails with the call-to-action button link replaced, clicking through to a malicious credential phishing page.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Evasion, Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
strings.ilike(sender.display_name, 'stripe*')
or strings.ilevenshtein(sender.display_name, 'stripe') <= 1
or strings.ilike(sender.email.domain.domain, '*stripe*')
)
and (
any(body.links,
(
.display_text in~ ("view in dashboard")
or (
network.whois(.href_url.domain).days_old < 30
and regex.icontains(.display_text, 'view|click|dashboard|portal')
)
)
and .href_url.domain.root_domain != "stripe.com"
)
// if it's a well done fake payment notification, the only 2 links that aren't from Stripe
// are the customer's email address and the CTA button (view in dashboard, click for more info, etc.)
or (
length(filter(body.links,
.href_url.domain.root_domain != 'stripe.com'
and .display_text is not null
)
) == 2
and length(body.links) > 2
)
)
and not (
sender.email.domain.root_domain in ("stripe.com", "pinstripes.com")
and headers.auth_summary.dmarc.pass
)
// 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 (
(
profile.by_sender().prevalence in ("new", "outlier")
and not profile.by_sender().solicited
)
or (
profile.by_sender().any_messages_malicious_or_spam
and not profile.by_sender().any_messages_benign
)
)
and not profile.by_sender().any_messages_benign
Detection logic
Scope: inbound message.
Campaigns have been observed sending templated Stripe notification emails with the call-to-action button link replaced, clicking through to a malicious credential phishing page.
- inbound message
any of:
- sender.display_name matches 'stripe*'
- sender.display_name is similar to 'stripe'
- sender.email.domain.domain matches '*stripe*'
any of:
any of
body.linkswhere all hold:any of:
- .display_text in ('view in dashboard')
all of:
- network.whois(.href_url.domain).days_old < 30
- .display_text matches 'view|click|dashboard|portal'
- .href_url.domain.root_domain is not 'stripe.com'
all of:
- length(filter(body.links, .href_url.domain.root_domain != 'stripe.com' and .display_text is not null)) is 2
- length(body.links) > 2
not:
all of:
- sender.email.domain.root_domain in ('stripe.com', 'pinstripes.com')
- headers.auth_summary.dmarc.pass
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
any of:
all of:
- profile.by_sender().prevalence in ('new', 'outlier')
not:
- profile.by_sender().solicited
all of:
- profile.by_sender().any_messages_malicious_or_spam
not:
- profile.by_sender().any_messages_benign
not:
- profile.by_sender().any_messages_benign
Inspects: body.links, body.links[].display_text, body.links[].href_url.domain, body.links[].href_url.domain.root_domain, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: network.whois, profile.by_sender, regex.icontains, strings.ilevenshtein, strings.ilike. Reference lists: $high_trust_sender_root_domains.
Indicators matched (5)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | stripe* |
strings.ilevenshtein | fuzzy | stripe |
strings.ilike | substring | *stripe* |
body.links[].display_text | member | view in dashboard |
regex.icontains | regex | view|click|dashboard|portal |
Stages and Predicates
Stage 1: mql_rule
and
or
any(body.links)
and
or
and
body.links.display_text regex_match "view|click|dashboard|portal"
network.whois func_call "network.whois(body.links[].href_url.domain).days_old < 30"
body.links.display_text eq "view in dashboard"
body.links.href_url.domain.root_domain ne "stripe.com"
and
body.links length_compare "2"
filter(body.links, .href_url.domain.root_domain != 'stripe.com' and .display_text is not null) length_compare "2"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
and
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
profile.by_sender func_call "profile.by_sender().any_messages_malicious_or_spam"
and
not
profile.by_sender func_call "profile.by_sender().solicited"
profile.by_sender func_call "profile.by_sender().prevalence in (new, outlier)"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["pinstripes.com", "stripe.com"]
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
or
sender.display_name starts_with "stripe"
sender.email.domain.domain match "stripe"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"stripe\") <= 1"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | pinstripes.com, stripe.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"pinstripes.com" field:"sender.email.domain.root_domain" value:"stripe.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.display_name | wildcard |
| field:"sender.display_name" kind:wildcard value:"stripe*" |
sender.email.domain.domain | wildcard |
| field:"sender.email.domain.domain" kind:wildcard value:"*stripe*" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Survey request with credential theft indicators
#Detects messages containing credential theft language disguised as survey requests from promotional content, targeting organizations from untrusted or spoofed high-trust domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Social engineering, Impersonation: Brand, Spoofing |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "cred_theft" and .confidence == "high"
)
or any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "org" and .text in ('AAA', 'Medicare Kit')
)
or any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "request"
and regex.icontains(.text, 'claim\s+your\s+(?:free|medical)?\s+kit')
)
or length(filter(ml.nlu_classifier(body.current_thread.text).entities,
.name == "financial"
and regex.icontains(.text, '\d{2}%\s*discount$')
)
) >= 2
)
and any(ml.nlu_classifier(body.current_thread.text).topics,
.name == "Advertising and Promotions" and .confidence != "low"
)
and any(ml.nlu_classifier(body.current_thread.text).entities,
.name in ("request", "org") and strings.icontains(.text, "survey")
)
// 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
)
Detection logic
Scope: inbound message.
Detects messages containing credential theft language disguised as survey requests from promotional content, targeting organizations from untrusted or spoofed high-trust domains.
- inbound message
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(body.current_thread.text).entitieswhere all hold:- .name is 'org'
- .text in ('AAA', 'Medicare Kit')
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name is 'request'
- .text matches 'claim\\s+your\\s+(?:free|medical)?\\s+kit'
- length(filter(ml.nlu_classifier(body.current_thread.text).entities, .name == 'financial' and regex.icontains(.text, '\\d{2}%\\s*discount$'))) ≥ 2
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name is 'Advertising and Promotions'
- .confidence is not 'low'
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name in ('request', 'org')
- .text contains 'survey'
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
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains. Reference lists: $high_trust_sender_root_domains.
Indicators matched (13)
| Field | Match | Value |
|---|---|---|
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | equals | high |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | org |
ml.nlu_classifier(body.current_thread.text).entities[].text | member | AAA |
ml.nlu_classifier(body.current_thread.text).entities[].text | member | Medicare Kit |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | request |
regex.icontains | regex | claim\s+your\s+(?:free|medical)?\s+kit |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | financial |
regex.icontains | regex | \d{2}%\s*discount$ |
ml.nlu_classifier(body.current_thread.text).topics[].name | equals | Advertising and Promotions |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | request |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | org |
1 more
strings.icontains | substring | survey |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name eq "org"
ml.nlu_classifier(body.current_thread.text).entities.text in ["AAA", "Medicare Kit"]
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name eq "request"
ml.nlu_classifier(body.current_thread.text).entities.text regex_match "claim\\s+your\\s+(?:free|medical)?\\s+kit"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
filter(ml.nlu_classifier(body.current_thread.text).entities, .name == 'financial' and regex.icontains(.text, '\\d{2}%\\s*discount$')) length_compare "2"
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name in ["org", "request"]
ml.nlu_classifier(body.current_thread.text).entities.text contains "survey"
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).topics.name eq "Advertising and Promotions"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: TikTok
#Detects messages impersonating TikTok through similar display names or logo detection, combined with security-themed content and authentication failures. Excludes legitimate TikTok communications and trusted senders.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
// TikTok Brand Detection
(
// display name contains tiktok
strings.ilike(strings.replace_confusables(sender.display_name), '*tiktok*')
// levenshtein distance similar to tiktok
or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
'tiktok'
) <= 1
or (
length(ml.logo_detect(file.message_screenshot()).brands) == 1
and any(ml.logo_detect(file.message_screenshot()).brands,
.name == "TikTok" and .confidence == "high"
)
)
// hyphenated sender domain contains tiktok
or strings.iends_with(sender.email.domain.root_domain, "-tiktok.com")
)
// OR TikTok verification language
or (
strings.icontains(body.current_thread.text, "tiktok")
and (
strings.icontains(body.current_thread.text, "verified badge")
or strings.icontains(body.current_thread.text, "verification criteria")
or strings.icontains(body.current_thread.text, "activate badge")
or strings.icontains(body.current_thread.text, "verification complete")
or strings.icontains(body.current_thread.text, "almost verified")
or strings.icontains(body.current_thread.text, "review complete")
or strings.icontains(body.current_thread.text, "verify profile")
)
)
)
and (
// ML Topic Analysis and Credential Theft Detection
any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications"
)
and .confidence in ("medium", "high")
)
or (
beta.ocr(file.message_screenshot()).text != ""
and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications"
)
and .confidence in ("medium", "high")
)
)
or 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"
)
)
// Not from legitimate TikTok or Google domains with DMARC pass
and not (
sender.email.domain.root_domain in $org_domains
or (
sender.email.domain.root_domain in (
"tiktok.com",
"tiktokglobalshop.com",
"tiktokusds.com",
"bytedance.com",
"tiktokacademy.com",
"webassessor.com" // used for this https://ads.tiktok.com/business/en-US/academy/tiktok-certification
)
and headers.auth_summary.dmarc.pass
)
)
// negate iCloud Private Message Relay
and not (
sender.email.domain.domain == "privaterelay.appleid.com"
or any(headers.hops, any(.fields, .name == "X-ICLOUD-HME"))
)
// 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().solicited
Detection logic
Scope: inbound message.
Detects messages impersonating TikTok through similar display names or logo detection, combined with security-themed content and authentication failures. Excludes legitimate TikTok communications and trusted senders.
- inbound message
any of:
any of:
- strings.replace_confusables(sender.display_name) matches '*tiktok*'
- strings.replace_confusables(sender.display_name) is similar to 'tiktok'
all of:
- length(ml.logo_detect(file.message_screenshot()).brands) is 1
any of
ml.logo_detect(file.message_screenshot()).brandswhere all hold:- .name is 'TikTok'
- .confidence is 'high'
- sender.email.domain.root_domain ends with '-tiktok.com'
all of:
- body.current_thread.text contains 'tiktok'
body.current_thread.text contains any of 7 patterns
verified badgeverification criteriaactivate badgeverification completealmost verifiedreview completeverify profile
any of:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
- .confidence in ('medium', 'high')
all of:
- beta.ocr(file.message_screenshot()).text is not ''
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
- .confidence in ('medium', 'high')
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 ('tiktok.com', 'tiktokglobalshop.com', 'tiktokusds.com', 'bytedance.com', 'tiktokacademy.com', 'webassessor.com')
- headers.auth_summary.dmarc.pass
none of:
- sender.email.domain.domain is 'privaterelay.appleid.com'
any of
headers.hopswhere:any of
.fieldswhere:- .name is 'X-ICLOUD-HME'
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, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, strings.icontains, strings.iends_with, strings.ilevenshtein, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (27)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *tiktok* |
strings.ilevenshtein | fuzzy | tiktok |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | TikTok |
ml.logo_detect(file.message_screenshot()).brands[].confidence | equals | high |
strings.iends_with | suffix | -tiktok.com |
strings.icontains | substring | tiktok |
strings.icontains | substring | verified badge |
strings.icontains | substring | verification criteria |
strings.icontains | substring | activate badge |
strings.icontains | substring | verification complete |
strings.icontains | substring | almost verified |
strings.icontains | substring | review complete |
15 more
strings.icontains | substring | verify profile |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Secure Message |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Reminders and Notifications |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | medium |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | high |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Secure Message |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Reminders and Notifications |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | medium |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | high |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | equals | high |
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 |
Stages and Predicates
Stage 1: mql_rule
and
not
or
any(headers.hops)
any(headers.hops.fields)
headers.hops.fields.name eq "X-ICLOUD-HME"
sender.email.domain.domain eq "privaterelay.appleid.com"
or
and
any(ml.logo_detect(file.message_screenshot()).brands)
and
ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
ml.logo_detect(file.message_screenshot()).brands.name eq "TikTok"
ml.logo_detect(file.message_screenshot()).brands length_compare "1"
and
or
body.current_thread.text contains "activate badge"
body.current_thread.text contains "almost verified"
body.current_thread.text contains "review complete"
body.current_thread.text contains "verification complete"
body.current_thread.text contains "verification criteria"
body.current_thread.text contains "verified badge"
body.current_thread.text contains "verify profile"
body.current_thread.text contains "tiktok"
sender.email.domain.root_domain ends_with "-tiktok.com"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"tiktok\") <= 1"
strings.replace_confusables(sender.display_name) match "tiktok"
or
and
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(body.current_thread.text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
not
or
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["bytedance.com", "tiktok.com", "tiktokacademy.com", "tiktokglobalshop.com", "tiktokusds.com", "webassessor.com"]
macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
not
profile.by_sender func_call "profile.by_sender().solicited"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.hops | array_any | excludes:headers.hops | |
sender.email.domain.domain | eq | privaterelay.appleid.com | excludes:sender.email.domain.domain field:"sender.email.domain.domain" value:"privaterelay.appleid.com" |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | bytedance.com, tiktok.com, tiktokacademy.com, tiktokglobalshop.com, tiktokusds.com, webassessor.com | excludes:sender.email.domain.root_domain |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
sender.email.domain.root_domain | ends_with |
| field:"sender.email.domain.root_domain" kind:ends_with value:"-tiktok.com" |
strings.replace_confusables(sender.display_name) | wildcard |
| field:"strings.replace_confusables(sender.display_name)" kind:wildcard value:"*tiktok*" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Toronto-Dominion Bank
#Impersonation of TD Bank or TD Canada Trust using display name spoofing or logo detection, combined with suspicious content related to security authentication or credential theft from unauthorized senders.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
// display name contains TD Bank
(
strings.ilike(strings.replace_confusables(sender.display_name), '*TD Bank*')
or strings.ilike(strings.replace_confusables(sender.display_name),
'*TD Canada Trust*'
)
// levenshtein distance similar to TD bank
or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
'TD Bank'
) <= 1
or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
'TD Canada Trust'
) <= 1
or any(ml.logo_detect(file.message_screenshot()).brands,
.name == "TD Bank" and .confidence == "high"
)
// TD Secure Email
or any([subject.base, sender.display_name], strings.ilike(., "*TD?Secure*"))
)
)
and (
(
any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications"
)
and .confidence in ("medium", "high")
)
and not any(ml.nlu_classifier(body.current_thread.text).topics,
.name in ("Newsletters and Digests", "Entertainment and Sports")
and .confidence in ("medium", "high")
)
)
or (
beta.ocr(file.message_screenshot()).text != ""
and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in (
"Security and Authentication",
"Secure Message",
"Reminders and Notifications"
)
and .confidence in ("medium", "high")
)
and not any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name in ("Newsletters and Digests", "Entertainment and Sports")
and .confidence in ("medium", "high")
)
)
or 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 TD domains and passes auth
and not (
sender.email.domain.root_domain in $org_domains
or (
sender.email.domain.root_domain in (
"td.com",
"tdbank.com",
"tdcanadatrust.com",
"tdameritrade.com",
"tdwaterhouse.ca",
"tdwaterhouse.com",
"tdassetmanagement.com",
"tdinsurance.com",
"tdautofinance.com",
"tdautofinance.ca",
"email-td.com",
"feedback-td.com",
"interac.ca"
)
and headers.auth_summary.dmarc.pass
)
)
// 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
or not headers.auth_summary.dmarc.pass
or not headers.auth_summary.spf.pass
)
Detection logic
Scope: inbound message.
Impersonation of TD Bank or TD Canada Trust using display name spoofing or logo detection, combined with suspicious content related to security authentication or credential theft from unauthorized senders.
- inbound message
any of:
- strings.replace_confusables(sender.display_name) matches '*TD Bank*'
- strings.replace_confusables(sender.display_name) matches '*TD Canada Trust*'
- strings.replace_confusables(sender.display_name) is similar to 'TD Bank'
- strings.replace_confusables(sender.display_name) is similar to 'TD Canada Trust'
any of
ml.logo_detect(file.message_screenshot()).brandswhere all hold:- .name is 'TD Bank'
- .confidence is 'high'
any of
[subject.base, sender.display_name]where:- . matches '*TD?Secure*'
any of:
all of:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
- .confidence in ('medium', 'high')
not:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Newsletters and Digests', 'Entertainment and Sports')
- .confidence in ('medium', 'high')
all of:
- beta.ocr(file.message_screenshot()).text is not ''
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
- .confidence in ('medium', 'high')
not:
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere all hold:- .name in ('Newsletters and Digests', 'Entertainment and Sports')
- .confidence in ('medium', 'high')
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 ('td.com', 'tdbank.com', 'tdcanadatrust.com', 'tdameritrade.com', 'tdwaterhouse.ca', 'tdwaterhouse.com', 'tdassetmanagement.com', 'tdinsurance.com', 'tdautofinance.com', 'tdautofinance.ca', 'email-td.com', 'feedback-td.com', 'interac.ca')
- headers.auth_summary.dmarc.pass
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
any of:
not:
- profile.by_sender().solicited
not:
- headers.auth_summary.dmarc.pass
not:
- headers.auth_summary.spf.pass
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, sender.display_name, sender.email.domain.root_domain, subject.base, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, strings.ilevenshtein, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (21)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *TD Bank* |
strings.ilike | substring | *TD Canada Trust* |
strings.ilevenshtein | fuzzy | TD Bank |
strings.ilevenshtein | fuzzy | TD Canada Trust |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | TD Bank |
ml.logo_detect(file.message_screenshot()).brands[].confidence | equals | high |
strings.ilike | substring | *TD?Secure* |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Secure Message |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Reminders and Notifications |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | medium |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | member | high |
9 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Security and Authentication |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Secure Message |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | member | Reminders and Notifications |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | medium |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidence | member | high |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | equals | high |
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 |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Entertainment and Sports", "Newsletters and Digests"]
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
and
not
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(body.current_thread.text).topics.name in ["Entertainment and Sports", "Newsletters and Digests"]
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
ml.nlu_classifier(body.current_thread.text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
not
or
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["email-td.com", "feedback-td.com", "interac.ca", "td.com", "tdameritrade.com", "tdassetmanagement.com", "tdautofinance.ca", "tdautofinance.com", "tdbank.com", "tdcanadatrust.com", "tdinsurance.com", "tdwaterhouse.ca", "tdwaterhouse.com"]
macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
any(ml.logo_detect(file.message_screenshot()).brands)
and
ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
ml.logo_detect(file.message_screenshot()).brands.name eq "TD Bank"
any([subject.base, sender.display_name])
[subject.base, sender.display_name] match "TD?Secure"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"TD Bank\") <= 1"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"TD Canada Trust\") <= 1"
strings.replace_confusables(sender.display_name) match "TD Bank"
strings.replace_confusables(sender.display_name) match "TD Canada Trust"
or
not
headers.auth_summary.dmarc.pass eq "true"
not
headers.auth_summary.spf.pass eq "true"
not
profile.by_sender func_call "profile.by_sender().solicited"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | email-td.com, feedback-td.com, interac.ca, td.com, tdameritrade.com, tdassetmanagement.com, tdautofinance.ca, tdautofinance.com, tdbank.com, tdcanadatrust.com, tdinsurance.com, tdwaterhouse.ca, tdwaterhouse.com | excludes:sender.email.domain.root_domain |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
strings.replace_confusables(sender.display_name) | wildcard |
| field:"strings.replace_confusables(sender.display_name)" kind:wildcard |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Trust Wallet
#Detects inbound messages containing links where the sender impersonates Trust Wallet through display name manipulation and suspicious language, while not being from legitimate Trust Wallet 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 |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(body.links) > 0
and (
regex.icontains(strings.replace_confusables(sender.display_name),
'\btrust wa[li1]{2}et\b'
)
or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
'trust wallet'
) <= 2
)
and (
any(ml.nlu_classifier(body.current_thread.text).intents,
.name in ("cred_theft", "callback_scam", "steal_pii", "extortion")
and .confidence in ("high")
)
)
and sender.email.domain.root_domain not in~ ('trustwallet.com')
// 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
)
Detection logic
Scope: inbound message.
Detects inbound messages containing links where the sender impersonates Trust Wallet through display name manipulation and suspicious language, while not being from legitimate Trust Wallet 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 '\\btrust wa[li1]{2}et\\b'
- strings.replace_confusables(sender.display_name) is similar to 'trust wallet'
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name in ('cred_theft', 'callback_scam', 'steal_pii', 'extortion')
- .confidence in ('high')
- sender.email.domain.root_domain not in ('trustwallet.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
Inspects: body.current_thread.text, body.links, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.ilevenshtein, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains.
Indicators matched (7)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | \btrust wa[li1]{2}et\b |
strings.ilevenshtein | fuzzy | trust wallet |
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[].name | member | extortion |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | member | high |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name in ["callback_scam", "cred_theft", "extortion", "steal_pii"]
not
sender.email.domain.root_domain eq "trustwallet.com"
or
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"trust wallet\") <= 2"
strings.replace_confusables(sender.display_name) regex_match "\\btrust wa[li1]{2}et\\b"
body.links length_compare "0"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.email.domain.root_domain | eq | trustwallet.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"trustwallet.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
strings.replace_confusables(sender.display_name) | regex_match |
| field:"strings.replace_confusables(sender.display_name)" kind:regex_match value:"\btrust wa[li1]{2}et\b" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: UK government Home Office
#Detects messages impersonating UK government agencies (Home Office, UK Visas and Immigration, gov.uk) that contain links not leading to legitimate gov.uk domains or show credential theft language, from senders not authenticated as official government domains.
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, Lookalike domain |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// UK government agencies in display name or subject with homograph protection
and (
any([
strings.replace_confusables(sender.display_name),
strings.replace_confusables(subject.subject)
],
strings.ilike(.,
"*sponsorship management system*",
"*Sponsor Management System*"
)
// exact match of high confidence
or . in~ ("Home Office", "uk home office", "UK Visas and Immigration")
)
// image is srced from the actual home office URL
or strings.icontains(body.html.raw,
'"https://www.points.homeoffice.gov.uk/gui-sms-jsf/images/'
)
// observed footers in messages
or 2 of (
strings.icontains(body.current_thread.text, '© Crown Copyright '),
strings.icontains(body.current_thread.text, '© 2025 Home Office'),
strings.icontains(body.current_thread.text, '© UK Visas and Immigration'),
regex.icontains(body.current_thread.text, ' [||–-—] Home Office'),
regex.icontains(body.current_thread.text,
' [|–-—] UK Visas and Immigration'
),
strings.icontains(body.current_thread.text,
'This is an automated message from UK Visas and Immigration.'
),
strings.icontains(body.current_thread.text,
'This is an automated notification from the Home Office'
),
regex.icontains(body.current_thread.text,
'You(?: are|''re) receiving this notification as a registered SMS user'
),
regex.icontains(body.current_thread.text,
'If you are not the designated.{0,50}SMS user'
),
)
)
// Not from legitimate UK government domains
and not (
sender.email.domain.tld == "gov.uk" and headers.auth_summary.dmarc.pass
)
//
and (
// there are links that do not link to "gov.uk"
not all(body.links, .href_url.domain.tld == "gov.uk")
// OR credential theft intent detected
or any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "cred_theft" and .confidence in ("medium", "high")
)
// link based indicators
or any(body.links,
// suspicious display text
(
.display_text in (
"Access SMS",
"Login to SMS",
"Log in to SMS",
"Access UKVI Account"
)
and .href_url.domain.tld != "gov.uk"
)
// there are mismatched links
or (
.display_url.domain.tld == "gov.uk"
and .href_url.domain.tld != "gov.uk"
and .mismatched
)
// the path refers to the uk stuff
or (
.href_url.domain.tld != "gov.uk"
and strings.icontains(.href_url.path, 'gov.uk')
)
)
)
// no previous threads
and not (length(headers.references) > 0 or length(body.previous_threads) > 0)
// negate a high amount of links or newsletters
and not (
length(body.links) > 20
or any(ml.nlu_classifier(body.html.display_text).topics,
.name == "Newsletters and Digests"
)
)
// High-trust domain exclusion
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
)
Detection logic
Scope: inbound message.
Detects messages impersonating UK government agencies (Home Office, UK Visas and Immigration, gov.uk) that contain links not leading to legitimate gov.uk domains or show credential theft language, from senders not authenticated as official government domains.
- inbound message
any of:
any of
[strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)]where any holds:. matches any of 2 patterns
*sponsorship management system**Sponsor Management System*
- . in ('Home Office', 'uk home office', 'UK Visas and Immigration')
- body.html.raw contains '"https://www.points.homeoffice.gov.uk/gui-sms-jsf/images/'
at least 2 of:
- body.current_thread.text contains '© Crown Copyright '
- body.current_thread.text contains '© 2025 Home Office'
- body.current_thread.text contains '© UK Visas and Immigration'
- body.current_thread.text matches ' [||–-—] Home Office'
- body.current_thread.text matches ' [|–-—] UK Visas and Immigration'
- body.current_thread.text contains 'This is an automated message from UK Visas and Immigration.'
- body.current_thread.text contains 'This is an automated notification from the Home Office'
- body.current_thread.text matches "You(?: are|'re) receiving this notification as a registered SMS user"
- body.current_thread.text matches 'If you are not the designated.{0,50}SMS user'
not:
all of:
- sender.email.domain.tld is 'gov.uk'
- headers.auth_summary.dmarc.pass
any of:
not:
all of
body.linkswhere:- .href_url.domain.tld is 'gov.uk'
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name is 'cred_theft'
- .confidence in ('medium', 'high')
any of
body.linkswhere any holds:all of:
- .display_text in ('Access SMS', 'Login to SMS', 'Log in to SMS', 'Access UKVI Account')
- .href_url.domain.tld is not 'gov.uk'
all of:
- .display_url.domain.tld is 'gov.uk'
- .href_url.domain.tld is not 'gov.uk'
- .mismatched
all of:
- .href_url.domain.tld is not 'gov.uk'
- .href_url.path contains 'gov.uk'
none of:
- length(headers.references) > 0
- length(body.previous_threads) > 0
none of:
- length(body.links) > 20
any of
ml.nlu_classifier(body.html.display_text).topicswhere:- .name is 'Newsletters and Digests'
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
Inspects: body.current_thread.text, body.html.display_text, body.html.raw, body.links, body.links[].display_text, body.links[].display_url.domain.tld, body.links[].href_url.domain.tld, body.links[].href_url.path, body.links[].mismatched, body.previous_threads, headers.auth_summary.dmarc.pass, headers.references, sender.display_name, sender.email.domain.root_domain, sender.email.domain.tld, subject.subject, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains.
Indicators matched (24)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *sponsorship management system* |
strings.ilike | substring | *Sponsor Management System* |
[strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)][] | member | Home Office |
[strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)][] | member | uk home office |
[strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)][] | member | UK Visas and Immigration |
strings.icontains | substring | "https://www.points.homeoffice.gov.uk/gui-sms-jsf/images/ |
strings.icontains | substring | © Crown Copyright |
strings.icontains | substring | © 2025 Home Office |
strings.icontains | substring | © UK Visas and Immigration |
regex.icontains | regex | [||–-—] Home Office |
regex.icontains | regex | [|–-—] UK Visas and Immigration |
strings.icontains | substring | This is an automated message from UK Visas and Immigration. |
12 more
strings.icontains | substring | This is an automated notification from the Home Office |
regex.icontains | regex | You(?: are|'re) receiving this notification as a registered SMS user |
regex.icontains | regex | If you are not the designated.{0,50}SMS user |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | member | medium |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | member | high |
body.links[].display_text | member | Access SMS |
body.links[].display_text | member | Login to SMS |
body.links[].display_text | member | Log in to SMS |
body.links[].display_text | member | Access UKVI Account |
body.links[].display_url.domain.tld | equals | gov.uk |
strings.icontains | substring | gov.uk |
Stages and Predicates
Stage 1: mql_rule
and
or
any(body.links)
or
and
body.links.display_text in ["Access SMS", "Access UKVI Account", "Log in to SMS", "Login to SMS"]
body.links.href_url.domain.tld ne "gov.uk"
and
body.links.display_url.domain.tld eq "gov.uk"
body.links.href_url.domain.tld ne "gov.uk"
body.links.mismatched eq "true"
and
body.links.href_url.domain.tld ne "gov.uk"
body.links.href_url.path contains "gov.uk"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence in ["high", "medium"]
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
not
macro "all(body.links)"
or
any([strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)])
or
[strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)] in ["Home Office", "UK Visas and Immigration", "uk home office"]
[strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)] match "Sponsor Management System"
[strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)] match "sponsorship management system"
body.current_thread.text contains "This is an automated message from UK Visas and Immigration."
body.current_thread.text contains "This is an automated notification from the Home Office"
body.current_thread.text contains "© 2025 Home Office"
body.current_thread.text contains "© Crown Copyright "
body.current_thread.text contains "© UK Visas and Immigration"
body.current_thread.text regex_match " [||–-—] Home Office"
body.current_thread.text regex_match " [|–-—] UK Visas and Immigration"
body.current_thread.text regex_match "If you are not the designated.{0,50}SMS user"
body.current_thread.text regex_match "You(?: are|'re) receiving this notification as a registered SMS user"
body.html.raw contains "\"https://www.points.homeoffice.gov.uk/gui-sms-jsf/images/"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
not
or
any(ml.nlu_classifier(body.html.display_text).topics)
ml.nlu_classifier(body.html.display_text).topics.name eq "Newsletters and Digests"
body.links length_compare "20"
not
or
body.previous_threads length_compare "0"
headers.references length_compare "0"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.tld eq "gov.uk"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
ml.nlu_classifier(body.html.display_text).topics | array_any | excludes:ml.nlu_classifier(body.html.display_text).topics | |
body.links | length_compare | 20 | excludes:body.links field:"body.links" value:"20" |
body.previous_threads | length_compare | 0 | excludes:body.previous_threads field:"body.previous_threads" value:"0" |
headers.references | length_compare | 0 | excludes:headers.references field:"headers.references" value:"0" |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.tld | eq | gov.uk | excludes:sender.email.domain.tld field:"sender.email.domain.tld" value:"gov.uk" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
body.html.raw | contains |
| field:"body.html.raw" kind:contains |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
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 |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
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 (14)
| 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 |
2 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 |
Stages and Predicates
Stage 1: mql_rule
and
or
any(beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics)
and
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics.confidence eq "high"
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics.name in ["Financial Communications", "Secure Message", "Security and Authentication"]
any(beta.ml_topic(body.current_thread.text).topics)
and
beta.ml_topic(body.current_thread.text).topics.confidence eq "high"
beta.ml_topic(body.current_thread.text).topics.name in ["Financial Communications", "Secure Message", "Security and Authentication"]
not
or
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["e-vanguard.com", "e-vanguardcharitable.org", "feedback-vanguard.com", "investordelivery.com", "m-vanguard.com", "retsupport.com", "vanguard.co.uk", "vanguard.com", "vanguard.com.au", "vanguard.com.hk", "vanguardcanada.ca", "vanguardcharitable.org", "vanguardinvestor.co.uk", "vanguardmexico.com", "vanguardretirement-mail.com", "vanguardretirement.com"]
and
sender.display_name eq "Vanguard Visa Law"
sender.email.domain.root_domain eq "docketwise.com"
macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
and
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
not
profile.by_sender func_call "profile.by_sender().solicited"
or
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"vanguard\") <= 1"
strings.replace_confusables(sender.display_name) match "vanguard"
strings.replace_confusables(sender.email.domain.domain) match "vanguard"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | e-vanguard.com, e-vanguardcharitable.org, feedback-vanguard.com, investordelivery.com, m-vanguard.com, retsupport.com, vanguard.co.uk, vanguard.com, vanguard.com.au, vanguard.com.hk, vanguardcanada.ca, vanguardcharitable.org, vanguardinvestor.co.uk, vanguardmexico.com, vanguardretirement-mail.com, vanguardretirement.com | excludes:sender.email.domain.root_domain |
sender.display_name | eq | Vanguard Visa Law | excludes:sender.display_name field:"sender.display_name" value:"Vanguard Visa Law" |
sender.email.domain.root_domain | eq | docketwise.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"docketwise.com" |
Indicators
These rows show field, operator, and value matches.
Brand impersonation: WeTransfer
#Detects messages claiming to be from WeTransfer that contain suspicious indicators, including misspelled domains, non-standard TLDs, suspicious file reference numbers, and French language variations. Excludes legitimate WeTransfer traffic with valid DMARC 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 |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and 2 of (
(
strings.ilike(sender.display_name, '*wetransfer*')
or strings.ilike(sender.display_name, '*we transfer*')
or strings.ilevenshtein(sender.display_name, "wetransfer") <= 1
),
// Check for misspelled wetransfer domains in sender email
regex.icontains(sender.email.email, 'nore?pl[a@]y@wetransfer'),
// Check for non-legitimate TLDs (.fr or others)
regex.icontains(sender.email.domain.root_domain, 'wetransfer\\.[a-z]{2,4}$'),
// Suspicious subject patterns
regex.icontains(subject.subject,
'(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer'
),
// Check for file reference numbers which are common in phishing
regex.icontains(subject.subject,
'WeTransfer \[(?:File No\.|)\s*:\s*[0-9-]+\s*\]'
),
// French language patterns
regex.icontains(subject.subject, 'vous a envoy[ée] .{1,30} par WeTransfer'),
regex.icontains(subject.subject, "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"),
regex.icontains(body.current_thread.text, 'transfert expirera'),
regex.icontains(body.current_thread.text,
"fichiers n'aient pas encore été téléchargés"
),
any(body.links,
strings.ilike(.display_text, '*wetransfer*')
and .href_url.domain.root_domain not in~ ('wetransfer.com', 'we.tl')
),
any(body.links,
(
.href_url.domain.root_domain in $free_file_hosts
and .href_url.domain.root_domain not in~ ('wetransfer.com', 'we.tl')
)
or network.whois(.href_url.domain).days_old < 30
or .href_url.domain.tld in $suspicious_tlds
)
)
and not (
sender.email.domain.root_domain in ("wetransfer.com", "we.tl")
and headers.auth_summary.dmarc.pass
)
// 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().solicited
or (
profile.by_sender().any_messages_malicious_or_spam
and not profile.by_sender().any_messages_benign
)
)
and not profile.by_sender().any_messages_benign
Detection logic
Scope: inbound message.
Detects messages claiming to be from WeTransfer that contain suspicious indicators, including misspelled domains, non-standard TLDs, suspicious file reference numbers, and French language variations. Excludes legitimate WeTransfer traffic with valid DMARC authentication.
- inbound message
at least 2 of:
any of:
- sender.display_name matches '*wetransfer*'
- sender.display_name matches '*we transfer*'
- sender.display_name is similar to 'wetransfer'
- sender.email.email matches 'nore?pl[a@]y@wetransfer'
- sender.email.domain.root_domain matches 'wetransfer\\\\.[a-z]{2,4}$'
- subject.subject matches '(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer'
- subject.subject matches 'WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]'
- subject.subject matches 'vous a envoy[ée] .{1,30} par WeTransfer'
- subject.subject matches 'T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER'
- body.current_thread.text matches 'transfert expirera'
- body.current_thread.text matches "fichiers n'aient pas encore été téléchargés"
any of
body.linkswhere all hold:- .display_text matches '*wetransfer*'
- .href_url.domain.root_domain not in ('wetransfer.com', 'we.tl')
any of
body.linkswhere any holds:all of:
- .href_url.domain.root_domain in $free_file_hosts
- .href_url.domain.root_domain not in ('wetransfer.com', 'we.tl')
- network.whois(.href_url.domain).days_old < 30
- .href_url.domain.tld in $suspicious_tlds
not:
all of:
- sender.email.domain.root_domain in ('wetransfer.com', 'we.tl')
- headers.auth_summary.dmarc.pass
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
any of:
not:
- profile.by_sender().solicited
all of:
- profile.by_sender().any_messages_malicious_or_spam
not:
- profile.by_sender().any_messages_benign
not:
- profile.by_sender().any_messages_benign
Inspects: body.current_thread.text, body.links, body.links[].display_text, body.links[].href_url.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.domain.tld, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, sender.email.email, subject.subject, type.inbound. Sensors: network.whois, profile.by_sender, regex.icontains, strings.ilevenshtein, strings.ilike. Reference lists: $free_file_hosts, $high_trust_sender_root_domains, $suspicious_tlds.
Indicators matched (11)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *wetransfer* |
strings.ilike | substring | *we transfer* |
strings.ilevenshtein | fuzzy | wetransfer |
regex.icontains | regex | nore?pl[a@]y@wetransfer |
regex.icontains | regex | wetransfer\\.[a-z]{2,4}$ |
regex.icontains | regex | (?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer |
regex.icontains | regex | WeTransfer \[(?:File No\.|)\s*:\s*[0-9-]+\s*\] |
regex.icontains | regex | vous a envoy[ée] .{1,30} par WeTransfer |
regex.icontains | regex | T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER |
regex.icontains | regex | transfert expirera |
regex.icontains | regex | fichiers n'aient pas encore été téléchargés |
Stages and Predicates
Stage 1: mql_rule
and
or
any(body.links)
or
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
macro "body.links[].href_url.domain.root_domain in free_file_hosts"
network.whois func_call "network.whois(body.links[].href_url.domain).days_old < 30"
macro "body.links[].href_url.domain.tld in suspicious_tlds"
any(body.links)
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.display_text match "wetransfer"
body.current_thread.text regex_match "fichiers n'aient pas encore été téléchargés"
body.current_thread.text regex_match "transfert expirera"
sender.display_name match "we transfer"
sender.display_name match "wetransfer"
sender.email.domain.root_domain regex_match "wetransfer\\\\.[a-z]{2,4}$"
sender.email.email regex_match "nore?pl[a@]y@wetransfer"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"wetransfer\") <= 1"
subject.subject regex_match "(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer"
subject.subject regex_match "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"
subject.subject regex_match "WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]"
subject.subject regex_match "vous a envoy[ée] .{1,30} par WeTransfer"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
and
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
profile.by_sender func_call "profile.by_sender().any_messages_malicious_or_spam"
not
profile.by_sender func_call "profile.by_sender().solicited"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["we.tl", "wetransfer.com"]
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | we.tl, wetransfer.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"we.tl" field:"sender.email.domain.root_domain" value:"wetransfer.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
sender.display_name | wildcard |
| field:"sender.display_name" kind:wildcard |
sender.email.domain.root_domain | regex_match |
| field:"sender.email.domain.root_domain" kind:regex_match value:"wetransfer\.[a-z]{2,4}$" |
sender.email.email | regex_match |
| field:"sender.email.email" kind:regex_match value:"nore?pl[a@]y@wetransfer" |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Xodo Sign
#Detects messages impersonating Xodo Sign with 'Processed by Xodo Sign' text from unauthorized senders that fail DMARC authentication.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and strings.icontains(body.current_thread.text, "processed by xodo sign")
and not (
sender.email.domain.root_domain == "eversign.com"
and headers.auth_summary.dmarc.pass
)
Detection logic
Scope: inbound message.
Detects messages impersonating Xodo Sign with 'Processed by Xodo Sign' text from unauthorized senders that fail DMARC authentication.
- inbound message
- body.current_thread.text contains 'processed by xodo sign'
not:
all of:
- sender.email.domain.root_domain is 'eversign.com'
- headers.auth_summary.dmarc.pass
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: strings.icontains.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | processed by xodo sign |
Stages and Predicates
Stage 1: mql_rule
and
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain eq "eversign.com"
body.current_thread.text contains "processed by xodo sign"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | eq | eversign.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"eversign.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains value:"processed by xodo sign" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Zoom
#Detects messages impersonating Zoom through social footers, webinar links, and suspicious domain pattern matching. The rule looks for specific combinations of social media links, redirects, and content analysis to identify inauthentic Zoom-branded messages not originating from legitimate Zoom domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering, Evasion |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
// the social links in the footer
3 of (
any(body.links, strings.icontains(.href_url.url, "twitter.com/zoom")),
any(body.links,
strings.icontains(.href_url.url,
"linkedin.com/company/zoom-video-communications"
)
),
any(body.links, strings.icontains(.href_url.url, "blog.zoom.us")),
strings.ilike(body.html.raw,
'*https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*'
),
strings.ilike(body.html.raw,
'*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*'
),
strings.ilike(body.html.raw,
'*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*'
)
)
or (
strings.ilike(body.html.raw,
'*https://st1.zoom.us/homepage/publish/_nuxt/social_icons_footer*.png*'
)
)
or (
length(beta.ml_topic(body.html.display_text).topics) == 1
and all(beta.ml_topic(body.html.display_text).topics,
.name in ("Events and Webinars", "Software and App Updates")
and .confidence != "low"
)
and any(ml.logo_detect(file.message_screenshot()).brands,
.name == "Zoom" and .confidence == "high"
)
and any(body.links,
any(ml.nlu_classifier(.display_text).intents,
.name == "cred_theft" and .confidence == "high"
)
)
)
or (
any(body.links,
// link claims to go to a Zoom domain, but does not
(
.display_url.domain.root_domain in ("zoom.us", "zoom.com")
or strings.icontains(.display_text, "zoom.us")
or strings.icontains(.display_text, "zoom.com")
)
and .href_url.domain.root_domain not in ("zoom.us", "zoom.com")
and (
.href_url.domain.tld in $suspicious_tlds
// country code second-level domain
or strings.istarts_with(.href_url.domain.tld, "com.")
or (
(
length(ml.link_analysis(.).files_downloaded) > 0
// Zoom logo on page
or ml.link_analysis(.).credphish.brand.name == "Zoom"
// blocked by a Cloudflare CAPTCHA
or strings.icontains(ml.link_analysis(.).final_dom.raw,
'https://challenges.cloudflare.com/turnstile/',
)
)
and ml.link_analysis(.).effective_url.domain.root_domain not in (
"zoom.us",
"zoom.com"
)
)
)
)
)
)
// negate auto-generated meeting summaries
and not (
strings.icontains(body.current_thread.text, "meeting summary")
and strings.icontains(body.current_thread.text,
"AI-generated content may be inaccurate or misleading."
)
)
and not (
(
strings.istarts_with(subject.subject, "RE:")
or strings.istarts_with(subject.subject, "R:")
or strings.istarts_with(subject.subject, "ODG:")
or strings.istarts_with(subject.subject, "答复:")
or strings.istarts_with(subject.subject, "AW:")
or strings.istarts_with(subject.subject, "TR:")
or strings.istarts_with(subject.subject, "FWD:")
or regex.imatch(subject.subject, '(\[[^\]]+\]\s?){0,3}(re|fwd?)\s?:')
or regex.imatch(subject.subject,
'^\[?(EXT|EXTERNAL)\]?[: ]\s*(RE|FWD?|FW|AW|TR|ODG|答复):.*'
)
)
and (length(headers.references) > 0 or headers.in_reply_to is not null)
)
// Not from a legitimate Zoom domain
and not (
sender.email.domain.root_domain in (
"zoom.us",
"zuora.com",
"zoomgov.com",
"zoom.com",
"zoom-x.de"
)
and headers.auth_summary.dmarc.pass
)
Detection logic
Scope: inbound message.
Detects messages impersonating Zoom through social footers, webinar links, and suspicious domain pattern matching. The rule looks for specific combinations of social media links, redirects, and content analysis to identify inauthentic Zoom-branded messages not originating from legitimate Zoom domains.
- inbound message
any of:
at least 3 of:
any of
body.linkswhere:- .href_url.url contains 'twitter.com/zoom'
any of
body.linkswhere:- .href_url.url contains 'linkedin.com/company/zoom-video-communications'
any of
body.linkswhere:- .href_url.url contains 'blog.zoom.us'
- body.html.raw matches '*https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*'
- body.html.raw matches '*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*'
- body.html.raw matches '*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*'
- body.html.raw matches '*https://st1.zoom.us/homepage/publish/_nuxt/social_icons_footer*.png*'
all of:
- length(beta.ml_topic(body.html.display_text).topics) is 1
all of
beta.ml_topic(body.html.display_text).topicswhere all hold:- .name in ('Events and Webinars', 'Software and App Updates')
- .confidence is not 'low'
any of
ml.logo_detect(file.message_screenshot()).brandswhere all hold:- .name is 'Zoom'
- .confidence is 'high'
any of
body.linkswhere:any of
ml.nlu_classifier(.display_text).intentswhere all hold:- .name is 'cred_theft'
- .confidence is 'high'
any of
body.linkswhere all hold:any of:
- .display_url.domain.root_domain in ('zoom.us', 'zoom.com')
- .display_text contains 'zoom.us'
- .display_text contains 'zoom.com'
- .href_url.domain.root_domain not in ('zoom.us', 'zoom.com')
any of:
- .href_url.domain.tld in $suspicious_tlds
- .href_url.domain.tld starts with 'com.'
all of:
any of:
- length(ml.link_analysis(.).files_downloaded) > 0
- ml.link_analysis(.).credphish.brand.name is 'Zoom'
- ml.link_analysis(.).final_dom.raw contains 'https://challenges.cloudflare.com/turnstile/'
- ml.link_analysis(.).effective_url.domain.root_domain not in ('zoom.us', 'zoom.com')
not:
all of:
- body.current_thread.text contains 'meeting summary'
- body.current_thread.text contains 'AI-generated content may be inaccurate or misleading.'
not:
all of:
any of:
- subject.subject starts with 'RE:'
- subject.subject starts with 'R:'
- subject.subject starts with 'ODG:'
- subject.subject starts with '答复:'
- subject.subject starts with 'AW:'
- subject.subject starts with 'TR:'
- subject.subject starts with 'FWD:'
- subject.subject matches '(\\[[^\\]]+\\]\\s?){0,3}(re|fwd?)\\s?:'
- subject.subject matches '^\\[?(EXT|EXTERNAL)\\]?[: ]\\s*(RE|FWD?|FW|AW|TR|ODG|答复):.*'
any of:
- length(headers.references) > 0
- headers.in_reply_to is set
not:
all of:
- sender.email.domain.root_domain in ('zoom.us', 'zuora.com', 'zoomgov.com', 'zoom.com', 'zoom-x.de')
- headers.auth_summary.dmarc.pass
Inspects: body.current_thread.text, body.html.display_text, body.html.raw, body.links, body.links[].display_text, body.links[].display_url.domain.root_domain, body.links[].href_url.domain.root_domain, body.links[].href_url.domain.tld, body.links[].href_url.url, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: beta.ml_topic, file.message_screenshot, ml.link_analysis, ml.logo_detect, ml.nlu_classifier, regex.imatch, strings.icontains, strings.ilike, strings.istarts_with. Reference lists: $suspicious_tlds.
Indicators matched (19)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | twitter.com/zoom |
strings.icontains | substring | linkedin.com/company/zoom-video-communications |
strings.icontains | substring | blog.zoom.us |
strings.ilike | substring | *https://go.pardot.com/l/84442/*/*/84442/*/twitter.png* |
strings.ilike | substring | *https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png* |
strings.ilike | substring | *https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png* |
strings.ilike | substring | *https://st1.zoom.us/homepage/publish/_nuxt/social_icons_footer*.png* |
beta.ml_topic(body.html.display_text).topics[].name | member | Events and Webinars |
beta.ml_topic(body.html.display_text).topics[].name | member | Software and App Updates |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | Zoom |
ml.logo_detect(file.message_screenshot()).brands[].confidence | equals | high |
ml.nlu_classifier(body.links[].display_text).intents[].name | equals | cred_theft |
7 more
ml.nlu_classifier(body.links[].display_text).intents[].confidence | equals | high |
body.links[].display_url.domain.root_domain | member | zoom.us |
body.links[].display_url.domain.root_domain | member | zoom.com |
strings.icontains | substring | zoom.us |
strings.icontains | substring | zoom.com |
strings.istarts_with | prefix | com. |
strings.icontains | substring | https://challenges.cloudflare.com/turnstile/ |
Stages and Predicates
Stage 1: mql_rule
and
or
any(body.links)
and
or
and
or
ml.link_analysis func_call "ml.link_analysis(body.links[]).credphish.brand.name == Zoom"
ml.link_analysis(body.links[]).files_downloaded length_compare "0"
ml.link_analysis(body.links[]).final_dom.raw contains "https://challenges.cloudflare.com/turnstile/"
ml.link_analysis func_call "ml.link_analysis(body.links[]).effective_url.domain.root_domain not in (zoom.us, zoom.com)"
body.links.href_url.domain.tld starts_with "com."
macro "body.links[].href_url.domain.tld in suspicious_tlds"
or
body.links.display_text contains "zoom.com"
body.links.display_text contains "zoom.us"
body.links.display_url.domain.root_domain in ["zoom.com", "zoom.us"]
not
body.links.href_url.domain.root_domain in ["zoom.com", "zoom.us"]
and
any(body.links)
any(ml.nlu_classifier(body.links.display_text).intents)
and
ml.nlu_classifier(body.links[].display_text).intents[].confidence eq "high"
ml.nlu_classifier(body.links[].display_text).intents[].name eq "cred_theft"
any(ml.logo_detect(file.message_screenshot()).brands)
and
ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
ml.logo_detect(file.message_screenshot()).brands.name eq "Zoom"
beta.ml_topic(body.html.display_text).topics length_compare "1"
macro "all(beta.ml_topic(body.html.display_text).topics)"
any(body.links)
body.links.href_url.url contains "blog.zoom.us"
any(body.links)
body.links.href_url.url contains "linkedin.com/company/zoom-video-communications"
any(body.links)
body.links.href_url.url contains "twitter.com/zoom"
body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*"
body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*"
body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*"
body.html.raw wildcard "*https://st1.zoom.us/homepage/publish/_nuxt/social_icons_footer*.png*"
not
and
or
headers.in_reply_to is_not_null
headers.references length_compare "0"
or
subject.subject regex_match "(\\[[^\\]]+\\]\\s?){0,3}(re|fwd?)\\s?:"
subject.subject regex_match "^\\[?(EXT|EXTERNAL)\\]?[: ]\\s*(RE|FWD?|FW|AW|TR|ODG|答复):.*"
subject.subject starts_with "AW:"
subject.subject starts_with "FWD:"
subject.subject starts_with "ODG:"
subject.subject starts_with "R:"
subject.subject starts_with "RE:"
subject.subject starts_with "TR:"
subject.subject starts_with "答复:"
not
and
body.current_thread.text contains "AI-generated content may be inaccurate or misleading."
body.current_thread.text contains "meeting summary"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["zoom-x.de", "zoom.com", "zoom.us", "zoomgov.com", "zuora.com"]
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.html.raw | wildcard |
| field:"body.html.raw" kind:wildcard |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Zoom via HTML styling
#Detects messages impersonating Zoom by identifying HTML table cells with specific blue styling (rgb(11,92,255)) containing Zoom branding in header elements.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and any(html.xpath(body.html, '//tr/td[contains(@style, "rgb(11,92,255)")]/h1').nodes,
strings.icontains(.display_text, "zoom")
)
Detection logic
Scope: inbound message.
Detects messages impersonating Zoom by identifying HTML table cells with specific blue styling (rgb(11,92,255)) containing Zoom branding in header elements.
- inbound message
any of
html.xpath(body.html, '//tr/td[contains(@style, "rgb(11,92,255)")]/h1').nodeswhere:- .display_text contains 'zoom'
Inspects: body.html, type.inbound. Sensors: html.xpath, strings.icontains.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | zoom |
Stages and Predicates
Stage 1: mql_rule
and
any(html.xpath(body.html, '//tr/td[contains(@style, "rgb(11,92,255)")]/h1').nodes)
html.xpath(body.html, '//tr/td[contains(@style, "rgb(11,92,255)")]/h1').nodes.display_text contains "zoom"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Zoom via lookalike domain
#Message contains a single link which attempts to spoof a 'zoom' link, sent from a free email provider to a single recipient.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Free email provider, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and any(body.current_thread.links,
not (
.href_url.domain.root_domain in (
"zoom.us",
"zoom.com",
"zoominternet.net",
"profitzoom.net",
"zoomtown.com"
)
or (
.display_url.domain.root_domain is not null
and .display_url.domain.root_domain in (
"zoom.us",
"zoom.com",
"zoominternet.net",
"profitzoom.net",
"zoomtown.com"
)
)
)
// zoom in the subdomain or sld
and (
strings.contains(.href_url.domain.sld, "zoom")
or strings.contains(.href_url.domain.subdomain, "zoom")
or strings.contains(.display_url.domain.sld, "zoom")
or strings.contains(.display_url.domain.subdomain, "zoom")
)
)
and length(distinct(body.current_thread.links, .href_url.url)) == 1
and sender.email.domain.root_domain in $free_email_providers
and length(recipients.to) == 1
and not subject.is_forward
Detection logic
Scope: inbound message.
Message contains a single link which attempts to spoof a 'zoom' link, sent from a free email provider to a single recipient.
- inbound message
any of
body.current_thread.linkswhere all hold:none of:
- .href_url.domain.root_domain in ('zoom.us', 'zoom.com', 'zoominternet.net', 'profitzoom.net', 'zoomtown.com')
all of:
- .display_url.domain.root_domain is set
- .display_url.domain.root_domain in ('zoom.us', 'zoom.com', 'zoominternet.net', 'profitzoom.net', 'zoomtown.com')
any of:
- .href_url.domain.sld contains 'zoom'
- .href_url.domain.subdomain contains 'zoom'
- .display_url.domain.sld contains 'zoom'
- .display_url.domain.subdomain contains 'zoom'
- length(distinct(body.current_thread.links, .href_url.url)) is 1
- sender.email.domain.root_domain in $free_email_providers
- length(recipients.to) is 1
not:
- subject.is_forward
Inspects: body.current_thread.links, body.current_thread.links[].display_url.domain.root_domain, body.current_thread.links[].display_url.domain.sld, body.current_thread.links[].display_url.domain.subdomain, body.current_thread.links[].href_url.domain.root_domain, body.current_thread.links[].href_url.domain.sld, body.current_thread.links[].href_url.domain.subdomain, body.current_thread.links[].href_url.url, recipients.to, sender.email.domain.root_domain, subject.is_forward, type.inbound. Sensors: strings.contains. Reference lists: $free_email_providers.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
strings.contains | substring | zoom |
Stages and Predicates
Stage 1: mql_rule
and
any(body.current_thread.links)
and
not
or
and
body.current_thread.links.display_url.domain.root_domain in ["profitzoom.net", "zoom.com", "zoom.us", "zoominternet.net", "zoomtown.com"]
body.current_thread.links.display_url.domain.root_domain is_not_null
body.current_thread.links.href_url.domain.root_domain in ["profitzoom.net", "zoom.com", "zoom.us", "zoominternet.net", "zoomtown.com"]
or
body.current_thread.links.display_url.domain.sld contains "zoom"
body.current_thread.links.display_url.domain.subdomain contains "zoom"
body.current_thread.links.href_url.domain.sld contains "zoom"
body.current_thread.links.href_url.domain.subdomain contains "zoom"
not
subject.is_forward eq "true"
distinct(body.current_thread.links, .href_url.url) length_compare "1"
recipients.to length_compare "1"
type.inbound eq "true"
macro "sender.email.domain.root_domain in free_email_providers"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
subject.is_forward | eq | true | excludes:subject.is_forward field:"subject.is_forward" value:"true" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: Zoom with deceptive link display
#Detects messages mentioning Zoom in the subject or body that contain links appearing to go to zoom.us but actually redirect to different domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, Malware/Ransomware |
| Tactics and techniques | Impersonation: Brand |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and sender.email.domain.root_domain in $free_email_providers
and any([subject.base, body.current_thread.text], strings.icontains(., "zoom"))
and any(filter(body.current_thread.links,
strings.icontains(.href_url.url, "zoom.us")
),
.href_url.domain.root_domain not in ("zoom.us", "zoom.com")
and .display_url.domain.root_domain not in ("zoom.us", "zoom.com")
)
Detection logic
Scope: inbound message.
Detects messages mentioning Zoom in the subject or body that contain links appearing to go to zoom.us but actually redirect to different domains.
- inbound message
- sender.email.domain.root_domain in $free_email_providers
any of
[subject.base, body.current_thread.text]where:- . contains 'zoom'
any of
filter(body.current_thread.links)where all hold:- .href_url.domain.root_domain not in ('zoom.us', 'zoom.com')
- .display_url.domain.root_domain not in ('zoom.us', 'zoom.com')
Inspects: body.current_thread.links, body.current_thread.links[].href_url.url, body.current_thread.text, sender.email.domain.root_domain, subject.base, type.inbound. Sensors: strings.icontains. Reference lists: $free_email_providers.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | zoom |
strings.icontains | substring | zoom.us |
Stages and Predicates
Stage 1: mql_rule
and
any(filter(body.current_thread.links))
and
not
filter(body.current_thread.links).display_url.domain.root_domain in ["zoom.com", "zoom.us"]
not
filter(body.current_thread.links).href_url.domain.root_domain in ["zoom.com", "zoom.us"]
any([subject.base, body.current_thread.text])
[subject.base, body.current_thread.text] contains "zoom"
type.inbound eq "true"
macro "sender.email.domain.root_domain in free_email_providers"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Callback scam: Impersonation via TimeTrade infrastructure
#Detects callback scam messages that abuse legitimate TimeTrade sending infrastructure to impersonate well-known brands like McAfee, Norton, Geek Squad, PayPal, eBay, Symantec, Best Buy, or LifeLock. The message contains purchase, payment, or subscription-related terms along with a phone number, soliciting victims to call for fraudulent support.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing |
| Tactics and techniques | Impersonation: Brand, Out of band pivot, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Legitimate TimeTrade sending infratructure
and sender.email.domain.root_domain == 'timetrade.com'
// Callback Phishing
and regex.icontains(body.current_thread.text,
(
"mcafee|n[o0]rt[o0]n|geek.{0,5}squad|paypal|ebay|symantec|best buy|lifel[o0]ck"
)
)
and 3 of (
strings.ilike(body.current_thread.text, '*purchase*'),
strings.ilike(body.current_thread.text, '*payment*'),
strings.ilike(body.current_thread.text, '*transaction*'),
strings.ilike(body.current_thread.text, '*subscription*'),
strings.ilike(body.current_thread.text, '*antivirus*'),
strings.ilike(body.current_thread.text, '*order*'),
strings.ilike(body.current_thread.text, '*support*'),
strings.ilike(body.current_thread.text, '*help line*'),
strings.ilike(body.current_thread.text, '*receipt*'),
strings.ilike(body.current_thread.text, '*invoice*'),
strings.ilike(body.current_thread.text, '*call*'),
strings.ilike(body.current_thread.text, '*cancel*'),
strings.ilike(body.current_thread.text, '*renew*'),
strings.ilike(body.current_thread.text, '*refund*')
)
// phone number regex
and any([body.current_thread.text, subject.subject],
regex.icontains(.,
'\+?([ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}',
'\+?([ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4}'
)
)
Detection logic
Scope: inbound message.
Detects callback scam messages that abuse legitimate TimeTrade sending infrastructure to impersonate well-known brands like McAfee, Norton, Geek Squad, PayPal, eBay, Symantec, Best Buy, or LifeLock. The message contains purchase, payment, or subscription-related terms along with a phone number, soliciting victims to call for fraudulent support.
- inbound message
- sender.email.domain.root_domain is 'timetrade.com'
- body.current_thread.text matches 'mcafee|n[o0]rt[o0]n|geek.{0,5}squad|paypal|ebay|symantec|best buy|lifel[o0]ck'
at least 3 of 14: body.current_thread.text matches any of 14 patterns
*purchase**payment**transaction**subscription**antivirus**order**support**help line**receipt**invoice**call**cancel**renew**refund*
any of
[body.current_thread.text, subject.subject]where:. matches any of 2 patterns
\+?([ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}\+?([ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4}
Inspects: body.current_thread.text, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: regex.icontains, strings.ilike.
Indicators matched (18)
| Field | Match | Value |
|---|---|---|
sender.email.domain.root_domain | equals | timetrade.com |
regex.icontains | regex | mcafee|n[o0]rt[o0]n|geek.{0,5}squad|paypal|ebay|symantec|best buy|lifel[o0]ck |
strings.ilike | substring | *purchase* |
strings.ilike | substring | *payment* |
strings.ilike | substring | *transaction* |
strings.ilike | substring | *subscription* |
strings.ilike | substring | *antivirus* |
strings.ilike | substring | *order* |
strings.ilike | substring | *support* |
strings.ilike | substring | *help line* |
strings.ilike | substring | *receipt* |
strings.ilike | substring | *invoice* |
6 more
strings.ilike | substring | *call* |
strings.ilike | substring | *cancel* |
strings.ilike | substring | *renew* |
strings.ilike | substring | *refund* |
regex.icontains | regex | \+?([ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4} |
regex.icontains | regex | \+?([ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4} |
Stages and Predicates
Stage 1: mql_rule
and
any([body.current_thread.text, subject.subject])
or
[body.current_thread.text, subject.subject] regex_match "\\+?([ilo0-9]{1,2})?\\s?\\(?\\d{3}\\)?[\\s\\.\\-⋅]{0,5}[ilo0-9]{3}[\\s\\.\\-⋅]{0,5}[ilo0-9]{4}"
[body.current_thread.text, subject.subject] regex_match "\\+?([ilo0-9]{1}.)?\\(?[ilo0-9]{3}?\\)?.[ilo0-9]{3}.?[ilo0-9]{4}"
or
body.current_thread.text match "antivirus"
body.current_thread.text match "call"
body.current_thread.text match "cancel"
body.current_thread.text match "help line"
body.current_thread.text match "invoice"
body.current_thread.text match "order"
body.current_thread.text match "payment"
body.current_thread.text match "purchase"
body.current_thread.text match "receipt"
body.current_thread.text match "refund"
body.current_thread.text match "renew"
body.current_thread.text match "subscription"
body.current_thread.text match "support"
body.current_thread.text match "transaction"
body.current_thread.text regex_match "mcafee|n[o0]rt[o0]n|geek.{0,5}squad|paypal|ebay|symantec|best buy|lifel[o0]ck"
sender.email.domain.root_domain eq "timetrade.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
body.current_thread.text | wildcard |
| field:"body.current_thread.text" kind:wildcard |
sender.email.domain.root_domain | eq |
| field:"sender.email.domain.root_domain" kind:eq value:"timetrade.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |