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]{0,}(-[A-Za-z0-9]{0,})?', // member number regex
'comp[Il]imentary item' // contains a suspicious captilization
)
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(ml.nlu_classifier(body.current_thread.text).entities, .name in ("request", "financial") and regex.icontains(.text, "(?: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 3 patterns
quick .{0,10}survey\bAAR-[A-Za-z0-9]{0,}(-[A-Za-z0-9]{0,})?comp[Il]imentary item
body.current_thread.text contains any of 3 patterns
last attemptrenewal is completeselect membership item
all of:
- strings.icontains(beta.ocr(file.message_screenshot()).text, "AARP")
- strings.icontains(beta.ocr(file.message_screenshot()).text, "join or renew now" )
- strings.icontains(beta.ocr(file.message_screenshot()).text, "to opt out" )
not:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ( "Professional and Career Development", "Newsletters and Digests" ) and .confidence == "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 (14)
| 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]{0,}(-[A-Za-z0-9]{0,})? |
regex.icontains | regex | comp[Il]imentary item |
strings.icontains | substring | last attempt |
strings.icontains | substring | renewal is complete |
strings.icontains | substring | select membership item |
2 more
strings.icontains | substring | join or renew now |
strings.icontains | substring | to opt out |
Stages and Predicates
Stage 1: mql_rule
and
or
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]{0,}(-[A-Za-z0-9]{0,})?"
body.current_thread.text regex_match "comp[Il]imentary item"
body.current_thread.text regex_match "quick .{0,10}survey"
body.current_thread.text contains "AARP"
and
body.current_thread.text contains "601 E Street NW"
body.current_thread.text contains "AARP"
and
body.current_thread.text contains "601 E Street NW"
body.current_thread.text contains "Washington, DC 20049"
and
body.current_thread.text contains "AARP"
body.current_thread.text contains "Washington, DC 20049"
and
sender.display_name contains "AARP"
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name in (\"request\", \"financial\")\n and regex.icontains(.text, \"(?:gift|win|free|renewal)\")\n )"
and
strings.icontains func_call "strings.icontains(beta.ocr(file.message_screenshot()).text, \"AARP\")"
strings.icontains func_call "strings.icontains(beta.ocr(file.message_screenshot()).text,\n \"join or renew now\"\n )"
strings.icontains func_call "strings.icontains(beta.ocr(file.message_screenshot()).text,\n \"to opt out\"\n )"
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"]
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
not
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Professional and Career Development\",\n \"Newsletters and Digests\"\n )\n and .confidence == \"high\"\n)"
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:"AARP" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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 |
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(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') )
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
type.inbound eq "true"
macro "any(filter(attachments, .file_type == \"pdf\"),\n (\n any(ml.logo_detect(.).brands, .name == \"Adobe\")\n or strings.icontains(beta.ocr(.).text,\n 'Powered by Adobe Acrobat Sign'\n )\n or strings.icontains(beta.ocr(.).text, 'Adobe Acrobat Sign')\n )\n and strings.icontains(beta.ocr(.).text, 'File Format: PDF')\n)"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")) == 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(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" ) ) )
any of
attachmentswhere all hold:- .file_type is 'pdf'
- any(file.explode(.), any(.scan.url.urls, regex.icontains(.url, '(?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn)' ) ) )
none of:
all of:
- length(body.previous_threads[length(body.previous_threads) - 1].links) > 0
- 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 ) )
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(.href_url.query_params_decoded['domain'], 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) != 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
body.links.href_url.domain.root_domain in ["mimecast.com", "mimecastprotect.com"]
macro "any(.href_url.query_params_decoded['domain'],\n strings.parse_domain(.).root_domain in (\n \"adobe.com\",\n \"adobesign.com\",\n \"echosign.com\",\n \"adobesignsandbox.com\",\n )\n )"
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[length(body.previous_threads) - 1].links,\n .href_url.domain.root_domain in (\n \"aka.ms\",\n \"adobe.com\",\n \"adobesign.com\",\n \"echosign.com\",\n \"adobesignsandbox.com\",\n \"mimecastprotect.com\",\n \"mimecast.com\"\n )\n or .href_url.domain.root_domain in $org_domains\n or .href_url.domain.root_domain == sender.email.domain.root_domain\n or any(recipients.to,\n .email.domain.root_domain == ..href_url.domain.root_domain\n )\n )"
any(recipients.to)
recipients.to.email.email eq "adobesign@adobesign.com"
or
any(attachments)
and
attachments.file_type eq "pdf"
macro "any(file.explode(.),\n any(.scan.url.urls,\n regex.icontains(.url,\n '(?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn)'\n )\n )\n )"
and
or
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\""
macro "any(html.xpath(body.html, \"//img/@src\").nodes,\n strings.parse_url(.raw).domain.root_domain == \"adobesign.com\"\n and (\n strings.istarts_with(strings.parse_url(.raw).path,\n \"/cobrand_logo/\"\n )\n or strings.icontains(strings.parse_url(.raw).path,\n \"checkmarkCircle\"\n )\n )\n )"
length func_call "length(filter(attachments, .file_type == \"pdf\")) == 0"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain 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"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" |
Exclusions
The rule actively suppresses these predicates.
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' ) // whatsapp or strings.icontains(.href_url.url, 'https://wa.me/8657186563839' ) // messenger 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"
length func_call "(\n length(filter(body.links,\n strings.icontains(.href_url.url,\n 'https://www.facebook.com/aliexpressbr'\n )\n or strings.icontains(.href_url.url,\n 'https://twitter.com/aliexpressbr'\n )\n or strings.icontains(.href_url.url,\n 'https://www.youtube.com/user/AliExpressChannel'\n )\n or strings.icontains(.href_url.url,\n 'https://www.instagram.com/aliexpressbr'\n )\n // whatsapp\n or strings.icontains(.href_url.url,\n 'https://wa.me/8657186563839'\n )\n // messenger\n or strings.icontains(.href_url.url, 'https://m.me/AliExpress')\n )\n ) >= 4\n )"
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 value:"26/F Tower One, Times Square, 1 Matheson Street, Causeway Bay" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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 |
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
- regex.icontains(strings.replace_confusables(sender.display_name), '\baws\b|amazon web services|\bses\b' )
any of:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ("Security and Authentication", "Secure Message") and .confidence == "high" )
all of:
- beta.ocr(file.message_screenshot()).text != ""
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics, .name in ("Security and Authentication", "Secure Message") and .confidence == "high" )
- any(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .confidence == "high" )
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents, .name == "cred_theft" and .confidence == "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
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain 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"
or
and
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != \"\""
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\"Security and Authentication\", \"Secure Message\")\n and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\"Security and Authentication\", \"Secure Message\")\n and .confidence == \"high\"\n )"
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.root_domain macro "sender.email.domain.root_domain in org_domains"
sender.email.domain.tld eq "local"
regex.icontains func_call "regex.icontains(strings.replace_confusables(sender.display_name),\n '\\baws\\b|amazon web services|\\bses\\b'\n)"
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" |
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" |
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) == 0
not:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name == "Advertising and Promotions" and .confidence != "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"]
sender.email.domain.root_domain 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"
or
headers.in_reply_to is_null
headers.references length_compare "0"
not
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name == \"Advertising and Promotions\" and .confidence != \"low\"\n)"
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 |
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" |
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" |
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')
)
or strings.istarts_with(sender.email.local_part, 'aaa')
)
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:
- 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') )
- sender.email.local_part starts with 'aaa'
- 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, false)
none of:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ("Newsletters and Digests") and .confidence != "low" )
- subject.subject contains 'quarantine'
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, sender.email.local_part, subject.subject, type.inbound. Sensors: ml.nlu_classifier, regex.contains, regex.icontains, strings.icontains, strings.istarts_with. Reference lists: $high_trust_sender_root_domains.
Indicators Matched (5)
| 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 |
strings.istarts_with | prefix | aaa |
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
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
not
or
subject.subject contains "quarantine"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\"Newsletters and Digests\") and .confidence != \"low\"\n )"
or
sender.email.local_part starts_with "aaa"
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name in (\"org\", \"sender\")\n and regex.contains(.text, '\\b(?:AAA|RAC|RAA|CAA|BCAA|AMA)\\b')\n )"
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"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" |
sender.email.local_part | starts_with |
| field:"sender.email.local_part" kind:starts_with value:"aaa" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass | |
subject.subject | contains | quarantine | excludes:subject.subject field:"subject.subject" value:"quarantine" |
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) == 1
any of:
- sender.email.email is recipients.to[0].email.email
- recipients.to[0].email.domain.valid is False
all of:
- (0) < (length(body.current_thread.links))
- (length(body.current_thread.links)) < (10)
any of
body.current_thread.linkswhere all hold:- .href_url.domain.root_domain is not 'bidsandtenders.ca'
- any(ml.link_analysis(., mode="aggressive").unique_urls_accessed, .domain.domain == 'bids.bidsandtenders.ca' and strings.icontains(.path, '/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
body.current_thread.links.href_url.domain.root_domain ne "bidsandtenders.ca"
macro "any(ml.link_analysis(., mode=\"aggressive\").unique_urls_accessed,\n .domain.domain == 'bids.bidsandtenders.ca'\n and strings.icontains(.path, '/Logo/')\n )"
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.
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(ml.nlu_classifier(body.current_thread.text).topics, .name in ( "Travel and Transportation", "Customer Service and Support", "Security and Authentication" ) and .confidence != "low" )
all of:
- length(body.links) == 0
- length(attachments) == 0
- length(body.current_thread.text) < 1000
- sender.display_name contains 'booking.com'
any of:
- any(ml.nlu_classifier(body.current_thread.text).entities, .name == "org" and .text == "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(ml.nlu_classifier(body.current_thread.text).intents, .name == "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(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes, .display_text =~ "Booking" )
- any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes, .display_text =~ ".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, false)
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
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
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(.href_url.domain).days_old < 30"
and
macro "any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes,\n .display_text =~ \".com\"\n )"
macro "any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes,\n .display_text =~ \"Booking\"\n )"
body.current_thread.text match " availab"
body.current_thread.text regex_match "(?:book\\sa|open)\\srooms"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\"\n )"
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"
or
and
attachments length_compare "0"
body.current_thread.text length_compare "1000"
body.links length_compare "0"
sender.display_name contains "booking.com"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Travel and Transportation\",\n \"Customer Service and Support\",\n \"Security and Authentication\"\n )\n and .confidence != \"low\"\n )"
or
and
body.current_thread.text contains "Amsterdam"
body.current_thread.text contains "Booking.com"
and
body.current_thread.text contains "Amsterdam"
body.current_thread.text contains "Oosterdokskade 163"
and
body.current_thread.text contains "Booking.com"
body.current_thread.text contains "Oosterdokskade 163"
body.current_thread.text contains " booking.com "
sender.display_name contains "booking.com"
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name == \"org\" and .text == \"Booking.com\"\n )"
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"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*" |
headers.auth_summary.dmarc.pass | eq |
| field:"headers.auth_summary.dmarc.pass" kind:eq value:"true" |
headers.auth_summary.dmarc.pass | is_not_null | field:"headers.auth_summary.dmarc.pass" kind:is_not_null | |
sender.display_name | contains |
| field:"sender.display_name" kind:contains value:"booking.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass | |
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" |
Brand impersonation: Deloitte LLC domain in CC
#Flags inbound messages where a recipient in the CC field—either in the message itself or within a previous email thread included in the body—uses the deloittellc.com root domain. This can indicate an attempt to impersonate or leverage Deloitte's identity to add legitimacy to a message or exploit a hijacked thread.
Threat Classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | 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 (
any(recipients.cc, .email.domain.root_domain == 'deloittellc.com')
or any(body.previous_threads,
any(.recipients.cc, .email.domain.root_domain == 'deloittellc.com')
)
)
Detection Logic
Scope: inbound message.
Flags inbound messages where a recipient in the CC field—either in the message itself or within a previous email thread included in the body—uses the deloittellc.com root domain. This can indicate an attempt to impersonate or leverage Deloitte's identity to add legitimacy to a message or exploit a hijacked thread.
- inbound message
any of:
any of
recipients.ccwhere:- .email.domain.root_domain is 'deloittellc.com'
any of
body.previous_threadswhere:any of
.recipients.ccwhere:- .email.domain.root_domain is 'deloittellc.com'
Inspects: body.previous_threads, body.previous_threads[].recipients.cc, body.previous_threads[].recipients.cc[].email.domain.root_domain, recipients.cc, recipients.cc[].email.domain.root_domain, type.inbound.
Indicators Matched (2)
| Field | Match | Value |
|---|---|---|
recipients.cc[].email.domain.root_domain | equals | deloittellc.com |
body.previous_threads[].recipients.cc[].email.domain.root_domain | equals | deloittellc.com |
Stages and Predicates
Stage 1: mql_rule
and
or
any(body.previous_threads)
any(body.previous_threads.recipients.cc)
body.previous_threads.recipients.cc.email.domain.root_domain eq "deloittellc.com"
any(recipients.cc)
recipients.cc.email.domain.root_domain eq "deloittellc.com"
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: 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.ilike(strings.replace_confusables(sender.display_name), '*disney*' )
not:
- strings.ilike(strings.replace_confusables(sender.display_name), '*disney springs*' )
- strings.ilevenshtein(strings.replace_confusables(sender.display_name), 'disney' ) <= 1
- any(ml.logo_detect(file.message_screenshot()).brands, .name == "Disney" and .confidence == "high" )
any of:
all of:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ( "Security and Authentication", "Secure Message", "Reminders and Notifications" ) and .confidence in ("medium", "high") )
not:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ("Newsletters and Digests", "Entertainment and Sports") and .confidence in ("medium", "high") )
all of:
- beta.ocr(file.message_screenshot()).text != ""
- 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") )
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") )
- any(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .confidence == "high" )
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents, .name == "cred_theft" and .confidence == "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
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"]
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
and
not
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.display_name),\n '*disney springs*'\n )"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.display_name),\n '*disney*'\n )"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name),\n 'disney'\n ) <= 1"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n .name == \"Disney\" and .confidence == \"high\"\n )"
or
and
not
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\"Newsletters and Digests\", \"Entertainment and Sports\")\n and .confidence in (\"medium\", \"high\")\n )"
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != \"\""
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\"\n )\n and .confidence in (\"medium\", \"high\")\n )"
and
not
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\"Newsletters and Digests\", \"Entertainment and Sports\")\n and .confidence in (\"medium\", \"high\")\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\"\n )\n and .confidence in (\"medium\", \"high\")\n )"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
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"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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 |
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'
- strings.ilevenshtein(sender.display_name, 'DocSend') <= 1
- 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(ml.nlu_classifier(body.current_thread.text).entities, .name in ("sender", "org") and strings.icontains(.text, 'Dropbox DocSend') )
not:
all of:
- sender.email.domain.root_domain in ('docsend.com')
- coalesce(headers.auth_summary.dmarc.pass, false)
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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
not
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain eq "docsend.com"
or
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"
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name in (\"sender\", \"org\")\n and strings.icontains(.text, 'Dropbox DocSend')\n )"
not
profile.by_sender_email func_call "profile.by_sender_email().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 |
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" |
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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass | |
sender.email.domain.root_domain | eq | docsend.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"docsend.com" |
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(ml.logo_detect(.).brands, .name == "DocuSign")
- 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.*") ) )
- any(file.explode(.), any(ml.nlu_classifier(.scan.ocr.raw).entities, .name == "org" and .text == "DocuSign" ) )
- any(file.explode(.), any(ml.nlu_classifier(.scan.ocr.raw).entities, .name == "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
attachments.file_type eq "pdf"
macro "any(file.explode(.),\n any(ml.nlu_classifier(.scan.ocr.raw).entities,\n .name == \"org\" and .text == \"DocuSign\"\n )\n )"
macro "any(file.explode(.),\n any(ml.nlu_classifier(.scan.ocr.raw).entities,\n .name == \"request\"\n )\n )"
macro "any(file.explode(.),\n length(.scan.url.urls) <= 9\n and any(.scan.url.urls,\n .domain.root_domain not in $tranco_1m\n and .domain.root_domain not in $org_domains\n and .domain.root_domain != \"sublimesecurity.com\"\n and not strings.ilike(.domain.root_domain, \"docusign.*\")\n )\n )"
macro "any(ml.logo_detect(.).brands, .name == \"DocuSign\")"
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) == 0
- body.current_thread.text matches '\\bQ(\\.)?R(\\.)?\\b'
- body.current_thread.text matches 'scan|mobile|camera'
- any(ml.logo_detect(file.message_screenshot()).brands, strings.starts_with(.name, "DocuSign") )
- any(beta.scan_qr(file.message_screenshot()).items, .type is not null and regex.contains(.data, '\.') )
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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
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"
macro "any(beta.scan_qr(file.message_screenshot()).items,\n .type is not null and regex.contains(.data, '\\.')\n)"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n strings.starts_with(.name, \"DocuSign\")\n)"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) == 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"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" |
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 |
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, // calling parse_url allows url decoding to help us 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) != 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"
length func_call "length(filter(body.links,\n .href_url.domain.root_domain == \"evite.com\"\n and regex.contains(.href_url.path, '^/_ct/[a-f0-9]{40}/')\n )\n) <= 4"
length func_call "length(filter(html.xpath(body.html, '//img/@src').nodes,\n // calling parse_url allows url decoding to help us\n strings.parse_url(.raw).domain.root_domain == 'evitecdn.com'\n )\n) >= 2"
type.inbound eq "true"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" |
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" |
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(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" ) ) )
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
type.inbound eq "true"
macro "any(filter(attachments, .file_extension == \"pdf\"),\n //\n // This rule makes use of a beta feature and is subject to change without notice\n // using the beta feature in custom rules is not suggested until it has been formally released\n //\n (\n strings.icontains(beta.ocr(.).text, \"Neste Niederlande\")\n and strings.icontains(beta.ocr(.).text, \"Antarcticaweg 185\")\n and strings.icontains(beta.ocr(.).text,\n \"NESTE PROCUREMENT ORDER\",\n \"This is not a Purchase Order\"\n )\n )\n or (\n strings.icontains(beta.ocr(.).text, \"TotalEnergies Tower\")\n and strings.icontains(beta.ocr(.).text, \"Louisiana\")\n and strings.icontains(beta.ocr(.).text, \"SUPPLY CHAIN MANAGEMENT\")\n )\n or (\n strings.icontains(beta.ocr(.).text, \"Vattenfall\")\n and strings.icontains(beta.ocr(.).text, \"Hoekenrode 8\")\n and strings.icontains(beta.ocr(.).text, \"SUPPLY CHAIN MANAGEMENT\")\n )\n or (\n strings.icontains(beta.ocr(.).text, \"MOLGROUP\", \"MOL Ceská\")\n and strings.icontains(beta.ocr(.).text, \"Purkynova 2121/3\")\n and strings.icontains(beta.ocr(.).text,\n \"REQUEST FOR PROPOSAL\",\n \"This is not a Purchase Order\"\n )\n )\n or (\n strings.icontains(beta.ocr(.).text,\n \"219 NORTH ROCKS ROAD\",\n \"100 Victoria Embankment\",\n \"WEENA 455\"\n )\n and strings.icontains(beta.ocr(.).text,\n \"SUPPLY CHAIN MANAGEMENT\",\n \"COMPULSORY BIDDERS MUST QUOTE\",\n \"INVITATION TO TENDER\",\n \"UNILEVER SUPPLY CHAIN RFQ\"\n )\n )\n or (\n strings.icontains(beta.ocr(.).text, \"Shell USA\")\n and strings.icontains(beta.ocr(.).text, \"150 N Dairy Ashford Road\")\n and strings.icontains(beta.ocr(.).text,\n \"Public Tender Documentation\",\n \"This is not a Purchase Order\"\n )\n )\n or (\n strings.icontains(beta.ocr(.).text, \"Waldinger Corporation\")\n and strings.icontains(beta.ocr(.).text, \"6200 Scout Trail\")\n and strings.icontains(beta.ocr(.).text,\n \"REQUEST FOR QUOTATION\",\n \"This is not a Purchase Order\"\n )\n )\n or (\n strings.icontains(beta.ocr(.).text,\n \"NOVO NORDISK\",\n \"nordisksourcingeu.com\"\n )\n and strings.icontains(beta.ocr(.).text, \"CARRE MICHELET\")\n and strings.icontains(beta.ocr(.).text,\n \"COMPULSORY BIDDERS MUST QUOTE\",\n \"This is not a Purchase Order\"\n )\n )\n)"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 ) == 1
- strings.icontains(beta.ocr(file.message_screenshot()).text, '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
length func_call "length(html.xpath(body.html,\n \"//img[contains(@src, 'https://api-cdn.figma.com/resize/thumbnails')]\"\n ).nodes\n) == 1"
sender.email.email eq "no-reply@email.figma.com"
strings.icontains func_call "strings.icontains(beta.ocr(file.message_screenshot()).text,\n 'access document'\n)"
subject.base contains "proposal"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
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(ml.logo_detect(file.message_screenshot()).brands, .name == "Gemini Trust" and .confidence != "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
not
and
or
subject.is_forward eq "true"
subject.is_reply eq "true"
body.previous_threads length_compare "1"
headers.references length_compare "0"
or
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"
and
sender.display_name eq "Gemini"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n .name == \"Gemini Trust\" and .confidence != \"low\"\n )"
body.current_thread.text contains "© 2025 Gemini Trust Company, LLC"
length func_call "(\n length(filter(body.links,\n strings.icontains(.href_url.url,\n 'https://www.instagram.com/gemini/'\n )\n or strings.icontains(.href_url.url,\n 'https://www.linkedin.com/company/geminitrust/'\n )\n or strings.icontains(.href_url.url,\n 'https://facebook.com/GeminiTrust'\n )\n or strings.icontains(.href_url.url,\n 'https://twitter.com/Gemini'\n )\n or strings.icontains(.href_url.url,\n 'https://support.gemini.com/hc/en-us/requests/new'\n )\n or strings.icontains(.href_url.url,\n 'https://support.gemini.com/hc/en-us/requests/new'\n )\n )\n ) >= 4\n )"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["gemini.com", "niftygateway.com"]
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 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" |
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" |
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'
- strings.ilevenshtein(sender.display_name, 'godaddy') <= 1
- 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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain 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"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" |
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" |
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:
- regex.icontains(beta.ocr(file.message_screenshot()).text, "google careers" )
- any(ml.logo_detect(file.message_screenshot()).brands, strings.starts_with(.name, "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
regex.icontains func_call "regex.icontains(beta.ocr(file.message_screenshot()).text,\n \"google careers\"\n )"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n strings.starts_with(.name, \"Google\")\n )"
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"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 | eq |
| field:"sender.email.domain.root_domain" kind:eq value:"salesforce.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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" |
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(html.xpath(body.html, '//img[@alt="[Optional Logo]"]').nodes, .raw is not null )
- any(html.xpath(body.html, '//img[@alt="Google Meet"]').nodes, .raw is not null )
- any(html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes, .display_text == "Join with Google Meet" )
- length(html.xpath(body.html, '//table/tbody/tr/td/h2[contains(@style, "color:rgb(60,64,67)")]' ).nodes ) == 0
not:
- any(distinct(map(html.xpath(body.html, '//table//h2').nodes, .inner_text ) ), . 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
macro "any(distinct(map(html.xpath(body.html, '//table//h2').nodes,\n .inner_text\n )\n ),\n . in (\"Meeting link\", \"Join by phone\", \"Guests\")\n)"
or
macro "any(html.xpath(body.html, '//a[contains(@style, \"rgb(52,168,83)\")]').nodes,\n .display_text == \"Join with Google Meet\"\n )"
macro "any(html.xpath(body.html, '//img[@alt=\"Google Meet\"]').nodes,\n .raw is not null\n )"
macro "any(html.xpath(body.html, '//img[@alt=\"[Optional Logo]\"]').nodes,\n .raw is not null\n )"
length func_call "length(html.xpath(body.html,\n '//table/tbody/tr/td/h2[contains(@style, \"color:rgb(60,64,67)\")]'\n ).nodes\n) == 0"
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: 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 ( // 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
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) != 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"
length func_call "length(filter(body.links,\n .href_url.domain.root_domain == \"greenvelope.com\"\n and (\n // card links\n strings.istarts_with(.href_url.path, '/card/')\n // user links are links for the person that created the card\n or strings.istarts_with(.href_url.path, '/user/')\n )\n )\n) == 0"
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.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" |
Exclusions
The rule actively suppresses these predicates.
Brand impersonation: Greetings Island
#Detects messages that impersonate the e-vite service Greetings Island by referencing its branding, copyright footer, or logo.
Threat Classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, Malware/Ransomware |
| Tactics and techniques | Impersonation: Brand, Social engineering, Image as content, Spoofing |
Telemetry Coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message Attributes
Rule Body
type.inbound
and (
// contains assets hosted on Greetings Island's CDN
(
strings.contains(body.html.raw, 'greetingsisland.com')
and any(html.xpath(body.html, '//img/@src').nodes,
strings.parse_url(.raw).domain.root_domain == "greetingsisland.com"
)
)
// copyright footer
or regex.icontains(body.current_thread.text,
'(?:©|\(c\)|copyright)\s*greetings\s?island'
)
// Greetings Island logo present in message screenshot
or (
any(ml.logo_detect(file.message_screenshot()).brands,
.name == "Invite Company" and .confidence != "low"
)
// "Invite Company" matches many different e-vite provider logos
// we want to filter this to greetings island specifically
and (
regex.icontains(body.current_thread.text, 'greetings\s?island')
//
// 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,
'greetings\s?island'
)
)
)
)
// not from Greetings Island actual
and not (
sender.email.domain.root_domain == "greetingsisland.com"
and coalesce(headers.auth_summary.dmarc.pass, false)
)
// negate replies and forwards
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
)
Detection Logic
Scope: inbound message.
Detects messages that impersonate the e-vite service Greetings Island by referencing its branding, copyright footer, or logo.
- inbound message
any of:
all of:
- body.html.raw contains 'greetingsisland.com'
- any(html.xpath(body.html, '//img/@src').nodes, strings.parse_url(.raw).domain.root_domain == "greetingsisland.com" )
- body.current_thread.text matches '(?:©|\\(c\\)|copyright)\\s*greetings\\s?island'
all of:
- any(ml.logo_detect(file.message_screenshot()).brands, .name == "Invite Company" and .confidence != "low" )
any of:
- body.current_thread.text matches 'greetings\\s?island'
- regex.icontains(beta.ocr(file.message_screenshot()).text, 'greetings\s?island' )
not:
all of:
- sender.email.domain.root_domain is 'greetingsisland.com'
- coalesce(headers.auth_summary.dmarc.pass, false)
not:
all of:
any of:
- subject.is_forward
- subject.is_reply
any of:
- length(headers.references) != 0
- headers.in_reply_to is set
- length(body.previous_threads) > 0
Inspects: body.current_thread.text, body.html, body.html.raw, 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: beta.ocr, file.message_screenshot, html.xpath, ml.logo_detect, regex.icontains, strings.contains, strings.parse_url.
Indicators Matched (4)
| Field | Match | Value |
|---|---|---|
strings.contains | substring | greetingsisland.com |
regex.icontains | regex | (?:©|\(c\)|copyright)\s*greetings\s?island |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | Invite Company |
regex.icontains | regex | greetings\s?island |
Stages and Predicates
Stage 1: mql_rule
and
or
and
or
body.current_thread.text regex_match "greetings\\s?island"
regex.icontains func_call "regex.icontains(beta.ocr(file.message_screenshot()).text,\n 'greetings\\s?island'\n )"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n .name == \"Invite Company\" and .confidence != \"low\"\n )"
and
body.html.raw contains "greetingsisland.com"
macro "any(html.xpath(body.html, '//img/@src').nodes,\n strings.parse_url(.raw).domain.root_domain == \"greetingsisland.com\"\n )"
body.current_thread.text regex_match "(?:©|\\(c\\)|copyright)\\s*greetings\\s?island"
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"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain eq "greetingsisland.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.html.raw | contains |
| field:"body.html.raw" kind:contains value:"greetingsisland.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass | |
sender.email.domain.root_domain | eq | greetingsisland.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"greetingsisland.com" |
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:
- strings.ilevenshtein(sender.display_name, 'hulu') <= 1
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) == 0
all of:
all of
recipients.towhere:- .email.domain.valid is False
all of
recipients.ccwhere:- .email.domain.valid is False
- any(ml.logo_detect(file.message_screenshot()).brands, .name == "Hulu" and .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
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"
and
or
and
macro "all(recipients.cc, .email.domain.valid == false)"
macro "all(recipients.to, .email.domain.valid == false)"
recipients.to length_compare "0"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n .name == \"Hulu\" and .confidence in (\"medium\", \"high\")\n )"
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*'
- strings.ilevenshtein(sender.display_name, 'interac e-transfer') <= 2
- sender.email.domain.root_domain not in ('interac.ca')
at least 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" )
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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
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"
or
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name == \"financial\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name == \"org\" and strings.icontains(.text, \"interac\")\n )"
type.inbound eq "true"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" |
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" |
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:
any of:
- strings.ilike(strings.replace_confusables(sender.display_name), '*internal revenue service*' )
- strings.like(strings.replace_confusables(sender.display_name), 'IRS*')
- regex.icontains(strings.replace_confusables(sender.display_name), '\birs.gov' )
- regex.icontains(strings.replace_confusables(sender.display_name), 'internal.{0,5}revenue.{0,5}service' )
- strings.ilevenshtein(strings.replace_confusables(sender.display_name), 'internal revenue service' ) <= 1
all of:
- strings.like(strings.replace_confusables(subject.base), '*IRS*')
- any(ml.nlu_classifier(body.current_thread.text).topics, .name == "Government Services" and .confidence != "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(ml.nlu_classifier(body.current_thread.text).topics, .name in ("Security and Authentication", "Financial Communications") and .confidence == "high" )
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" )
all of:
- ( (length(beta.ocr(file.message_screenshot()).text) + 0.0) / ( length(body.current_thread.text) + 0.0 ) ) > 2
- length(body.previous_threads) == 0
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics, .name in ("Security and Authentication", "Financial Communications") and .confidence == "high" )
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" )
- any(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .confidence == "high" )
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents, .name == "cred_theft" and .confidence == "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(ml.nlu_classifier(body.current_thread.text).intents, .name == "benign" and .confidence == "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, false)
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"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"benign\" and .confidence == \"high\"\n )"
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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
or
and
not
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\n \"Advertising and Promotions\",\n \"Newsletters and Digests\",\n \"Political Mail\",\n \"Events and Webinars\"\n )\n and .confidence != \"low\"\n )"
body.previous_threads length_compare "0"
macro "(\n (length(beta.ocr(file.message_screenshot()).text) + 0.0) / (\n length(body.current_thread.text) + 0.0\n )\n ) > 2"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\"Security and Authentication\", \"Financial Communications\")\n and .confidence == \"high\"\n )"
and
not
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Advertising and Promotions\",\n \"Newsletters and Digests\",\n \"Political Mail\",\n \"Events and Webinars\"\n )\n and .confidence != \"low\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\"Security and Authentication\", \"Financial Communications\")\n and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
or
and
body.current_thread.text contains "1111 Constitution Ave"
body.current_thread.text contains "4228 Park Ave S"
and
body.current_thread.text contains "1111 Constitution Ave"
body.current_thread.text contains "Internal Revenue Service"
and
body.current_thread.text contains "1111 Constitution Ave"
body.current_thread.text contains "New York, New York 10003"
and
body.current_thread.text contains "1111 Constitution Ave"
body.current_thread.text contains "Washington, DC 20224"
and
body.current_thread.text contains "4228 Park Ave S"
body.current_thread.text contains "Internal Revenue Service"
and
body.current_thread.text contains "4228 Park Ave S"
body.current_thread.text contains "New York, New York 10003"
and
body.current_thread.text contains "4228 Park Ave S"
body.current_thread.text contains "Washington, DC 20224"
and
body.current_thread.text contains "Internal Revenue Service"
body.current_thread.text contains "New York, New York 10003"
and
body.current_thread.text contains "Internal Revenue Service"
body.current_thread.text contains "Washington, DC 20224"
and
body.current_thread.text contains "New York, New York 10003"
body.current_thread.text contains "Washington, DC 20224"
and
strings.like func_call "strings.like(strings.replace_confusables(subject.base), '*IRS*')"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name == \"Government Services\" and .confidence != \"low\"\n )"
body.current_thread.text regex_match "©\\s*20[0-9]{2}\\s*\\s*Internal Revenue Service"
regex.icontains func_call "regex.icontains(strings.replace_confusables(sender.display_name),\n '\\birs.gov'\n )"
regex.icontains func_call "regex.icontains(strings.replace_confusables(sender.display_name),\n 'internal.{0,5}revenue.{0,5}service'\n )"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name),\n 'internal revenue service'\n ) <= 1"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.display_name),\n '*internal revenue service*'\n )"
strings.like func_call "strings.like(strings.replace_confusables(sender.display_name), 'IRS*')"
not
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
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 value:"©\s*20[0-9]{2}\s*\s*Internal Revenue Service" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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" |
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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass |
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'
- strings.ilevenshtein(sender.display_name, 'KnowBe4') <= 1
- 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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain 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.ilike(strings.replace_confusables(sender.display_name), '*mailchimp*' )
- strings.ilevenshtein(strings.replace_confusables(sender.display_name), 'mailchimp' ) <= 1
- any(ml.logo_detect(file.message_screenshot()).brands, .name == "MailChimp" and .confidence == "high" )
any of:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ( "Security and Authentication", "Secure Message", "Reminders and Notifications" ) and .confidence in ("medium", "high") )
all of:
- beta.ocr(file.message_screenshot()).text != ""
- 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") )
- any(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .confidence == "high" )
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents, .name == "cred_theft" and .confidence == "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
not
or
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["intuit.com", "mailchimp.com"]
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
and
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != \"\""
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\"\n )\n and .confidence in (\"medium\", \"high\")\n )"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\"\n )\n and .confidence in (\"medium\", \"high\")\n )"
not
headers.message_id ends_with ".mailchimp.com>"
not
profile.by_sender func_call "profile.by_sender().solicited"
or
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name),\n 'mailchimp'\n ) <= 1"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.display_name),\n '*mailchimp*'\n )"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n .name == \"MailChimp\" and .confidence == \"high\"\n )"
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" |
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>" |
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'
- strings.ilevenshtein(sender.display_name, 'marriott') <= 2
- any([body.current_thread.text, subject.base], regex.icontains(., '(?:appreciation|thank)(?:\s|-)?(you)?\s+gift', 'something special', 'special.{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, false)
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
not
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
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"
macro "any([body.current_thread.text, subject.base],\n regex.icontains(.,\n '(?:appreciation|thank)(?:\\s|-)?(you)?\\s+gift',\n 'something special',\n 'special.{0,10}thank(?:\\s|-)you'\n )\n)"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" |
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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes: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 | excludes:sender.email.domain.root_domain |
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|Support)'
)
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|Support)'
- 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(ml.nlu_classifier(body.current_thread.text).entities, .name in ("org", "sender") and strings.icontains(.text, 'mcafee') )
- length(filter(ml.nlu_classifier(body.current_thread.text).entities, .name == "urgency" ) ) >= 2
not:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ("Newsletters and Digests", "Advertising and Promotions") and .confidence != "low" )
not:
all of:
- sender.email.domain.root_domain in ('mcafee.com', 'mcafeesecure.com')
- coalesce(headers.auth_summary.dmarc.pass, false)
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass, false)
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 (8)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | McAfee.{0,30}(?:Defense|Protection|Support) |
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
not
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain in ["mcafee.com", "mcafeesecure.com"]
not
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
or
and
length func_call "length(filter(ml.nlu_classifier(body.current_thread.text).entities,\n .name == \"urgency\"\n )\n ) >= 2"
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name in (\"org\", \"sender\") and strings.icontains(.text, 'mcafee')\n )"
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|Support)"
sender.display_name regex_match "^[\\s[:punct:]]*mc\\s*a+f+ee+(?:$|[^,])"
subject.base regex_match "McAfee.{0,30}(?:Defense|Protection)"
not
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\"Newsletters and Digests\", \"Advertising and Promotions\")\n and .confidence != \"low\"\n)"
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 value:"McAfee.{0,30}(?:Defense|Protection|Support)" |
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" |
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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass | |
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" |
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:
- regex.icontains(strings.replace_confusables(sender.display_name), '\bmetamask\b', '\bmetamask\.io\b' )
- strings.contains(strings.replace_confusables(sender.display_name), "METAMASK" )
- strings.ilevenshtein(strings.replace_confusables(sender.display_name), 'metamask' ) <= 2
any of:
- any(ml.logo_detect(file.message_screenshot()).brands, .name == "MetaMask")
- any(ml.nlu_classifier(body.current_thread.text).intents, .name in ("cred_theft", "callback_scam", "steal_pii") and .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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
or
regex.icontains func_call "regex.icontains(strings.replace_confusables(sender.display_name),\n '\\bmetamask\\b',\n '\\bmetamask\\.io\\b'\n )"
strings.contains func_call "strings.contains(strings.replace_confusables(sender.display_name),\n \"METAMASK\"\n )"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name),\n 'metamask'\n ) <= 2"
not
sender.email.domain.root_domain eq "metamask.io"
or
macro "any(ml.logo_detect(file.message_screenshot()).brands, .name == \"MetaMask\")"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name in (\"cred_theft\", \"callback_scam\", \"steal_pii\")\n and .confidence in (\"high\")\n )"
body.links length_compare "0"
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" |
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" |
Brand impersonation: Microsoft logo image linking to free file host
#Detects inline images that display a Microsoft logo and contain text, used as clickable links within the message body. The link behind the image redirects to a self-service site creation platform or free file hosting domain rather than a legitimate Microsoft or tenant domain, a common technique for disguising credential phishing or malware delivery links as trusted Microsoft branded content.
Threat Classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, Malware/Ransomware |
| Tactics and techniques | Impersonation: Brand, Image as content, Free file host, Social engineering |
Telemetry Coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message Attributes
Rule Body
type.inbound
and any(map(filter(attachments,
.file_type in $file_types_images
and .content_disposition =~ "inline"
and any(ml.logo_detect(.).brands,
strings.istarts_with(.name, "Microsoft")
and .confidence == "high"
)
// big image
and beta.parse_exif(.).image_height > 96
and beta.parse_exif(.).image_width > 96
// and there is text on the image
and regex.icount(beta.ocr(.).text, '\w+\W') > 5
),
.content_id
),
// that image is used a a link in the body
any(html.xpath(body.html, '//a[.//img[@src]]').nodes,
strings.icontains(.raw, ..)
and any(.links,
// the link goes to self_service for free_file_hosts
(
.href_url.domain.domain in $self_service_creation_platform_domains
or .href_url.domain.root_domain in $self_service_creation_platform_domains
or .href_url.domain.domain in $free_file_hosts
or .href_url.domain.root_domain in $free_file_hosts
)
// but not sharepoint
and not .href_url.domain.domain in $tenant_domains
)
)
)
Detection Logic
Scope: inbound message.
Detects inline images that display a Microsoft logo and contain text, used as clickable links within the message body. The link behind the image redirects to a self-service site creation platform or free file hosting domain rather than a legitimate Microsoft or tenant domain, a common technique for disguising credential phishing or malware delivery links as trusted Microsoft branded content.
- inbound message
- any(map(filter(attachments, .file_type in $file_types_images and .content_disposition =~ "inline" and any(ml.logo_detect(.).brands, strings.istarts_with(.name, "Microsoft") and .confidence == "high" ) // big image and beta.parse_exif(.).image_height > 96 and beta.parse_exif(.).image_width > 96 // and there is text on the image and regex.icount(beta.ocr(.).text, '\w+\W') > 5 ), .content_id ), // that image is used a a link in the body any(html.xpath(body.html, '//a[.//img[@src]]').nodes, strings.icontains(.raw, ..) and any(.links, // the link goes to self_service for free_file_hosts ( .href_url.domain.domain in $self_service_creation_platform_domains or .href_url.domain.root_domain in $self_service_creation_platform_domains or .href_url.domain.domain in $free_file_hosts or .href_url.domain.root_domain in $free_file_hosts ) // but not sharepoint and not .href_url.domain.domain in $tenant_domains ) ) )
Inspects: attachments[].content_disposition, attachments[].file_type, body.html, type.inbound. Sensors: beta.ocr, beta.parse_exif, html.xpath, ml.logo_detect, regex.icount, strings.icontains, strings.istarts_with. Reference lists: $file_types_images, $free_file_hosts, $self_service_creation_platform_domains, $tenant_domains.
Indicators Matched (4)
| Field | Match | Value |
|---|---|---|
attachments[].content_disposition | equals | inline |
strings.istarts_with | prefix | Microsoft |
ml.logo_detect(attachments[]).brands[].confidence | equals | high |
regex.icount | regex | \w+\W |
Stages and Predicates
Stage 1: mql_rule
and
type.inbound eq "true"
macro "any(map(filter(attachments,\n .file_type in $file_types_images\n and .content_disposition =~ \"inline\"\n and any(ml.logo_detect(.).brands,\n strings.istarts_with(.name, \"Microsoft\")\n and .confidence == \"high\"\n )\n // big image\n and beta.parse_exif(.).image_height > 96\n and beta.parse_exif(.).image_width > 96\n // and there is text on the image\n and regex.icount(beta.ocr(.).text, '\\w+\\W') > 5\n ),\n .content_id\n ),\n // that image is used a a link in the body\n any(html.xpath(body.html, '//a[.//img[@src]]').nodes,\n strings.icontains(.raw, ..)\n and any(.links,\n // the link goes to self_service for free_file_hosts\n (\n .href_url.domain.domain in $self_service_creation_platform_domains\n or .href_url.domain.root_domain in $self_service_creation_platform_domains\n or .href_url.domain.domain in $free_file_hosts\n or .href_url.domain.root_domain in $free_file_hosts\n )\n // but not sharepoint\n and not .href_url.domain.domain in $tenant_domains\n )\n )\n)"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: 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.email)
- .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) == 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, .email.domain.sld)
- ( any(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .confidence in~ ("medium", "high") ) )
all of:
- length(distinct(body.links, .href_url.domain.root_domain)) == 1
all of:
- (2) < (length(body.links))
- (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(..href_url.url, .email.email)"
and
body.links.href_url.domain.sld eq "google"
body.links.href_url.path starts_with "/amp/"
body.links.href_url.domain.domain macro "body.links[].href_url.domain.domain in free_file_hosts"
body.links.href_url.domain.domain macro "body.links[].href_url.domain.domain in social_landing_hosts"
body.links.href_url.domain.domain macro "body.links[].href_url.domain.domain in url_shorteners"
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"]
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in free_file_hosts"
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in free_subdomain_hosts"
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in social_landing_hosts"
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain not in tranco_1m"
or
any(body.links)
body.links.href_url.domain.domain macro "body.links[].href_url.domain.domain in free_file_hosts"
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"]
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.root_domain macro "body.links[].href_url.domain.root_domain not in org_domains"
body.links.href_url.domain.valid eq "true"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain 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"
or
and
any(recipients.to)
strings.icontains func_call "strings.icontains(body.current_thread.text, .email.domain.sld)"
body.current_thread.text match "Microsoft Office 365"
and
any(recipients.to)
strings.icontains func_call "strings.icontains(body.current_thread.text, .email.domain.sld)"
body.current_thread.text match "internal planner"
and
any(recipients.to)
strings.icontains func_call "strings.icontains(body.current_thread.text, .email.domain.sld)"
body.current_thread.text match "internal task"
and
any(recipients.to)
strings.icontains func_call "strings.icontains(body.current_thread.text, .email.domain.sld)"
body.current_thread.text wildcard "*assigned*new team*"
and
body.current_thread.text match "Microsoft Office 365"
body.current_thread.text match "internal planner"
and
body.current_thread.text match "Microsoft Office 365"
body.current_thread.text match "internal task"
and
body.current_thread.text match "Microsoft Office 365"
body.current_thread.text wildcard "*assigned*new team*"
and
body.current_thread.text match "internal planner"
body.current_thread.text match "internal task"
and
body.current_thread.text match "internal planner"
body.current_thread.text wildcard "*assigned*new team*"
and
body.current_thread.text match "internal task"
body.current_thread.text wildcard "*assigned*new team*"
and
body.links length_compare "2"
body.links length_compare "10"
length func_call "length(distinct(body.links, .href_url.domain.root_domain)) == 1"
macro "all(body.links,\n .href_url.domain.root_domain != sender.email.domain.root_domain\n )"
macro "(\n any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence in~ (\"medium\", \"high\")\n )\n )"
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 "(\n all(attachments,\n .file_type in $file_types_images\n and \n // small, relatively square image\n //\n // This rule makes use of a beta feature and is subject to change without notice\n // using the beta feature in custom rules is not suggested until it has been formally released\n //\n (\n beta.parse_exif(.).image_height / beta.parse_exif(.).image_width\n ) > 0.9\n and (beta.parse_exif(.).image_height + beta.parse_exif(.).image_width) < 500\n )\n)"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" |
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 |
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.ilike(strings.replace_confusables(sender.display_name), '*morgan stanley*', '*morganstanley*' )
- strings.ilevenshtein(strings.replace_confusables(sender.display_name), 'morgan stanley' ) <= 2
- any(ml.nlu_classifier(body.current_thread.text).entities, .name in ("org", "sender") and strings.icontains(.text, '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(ml.nlu_classifier(body.current_thread.text).intents, .name in ("cred_theft", "callback_scam") and .confidence == "high" )
not:
all of:
- sender.email.domain.root_domain in ('docusign.net', 'morganstanley.com')
- coalesce(headers.auth_summary.dmarc.pass, false)
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"
not
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain in ["docusign.net", "morganstanley.com"]
or
body.current_thread.text contains "secure.emailhelp@morganstanley.com"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name),\n 'morgan stanley'\n ) <= 2"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.display_name),\n '*morgan stanley*',\n '*morganstanley*'\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name in (\"org\", \"sender\")\n and strings.icontains(.text, 'Morgan Stanley')\n )"
body.current_thread.text contains "Morgan Stanley"
type.inbound eq "true"
macro "3 of (\n strings.icontains(body.current_thread.text, \"Client Service Center\"),\n regex.icontains(body.current_thread.text,\n 'Financial Advis?or\\s*[|/]\\s*(?:Portfolio\\s+)?Manager'\n ),\n regex.icontains(body.current_thread.text, 'Secure (?:E-)?Mail'),\n strings.icontains(body.current_thread.text, \"Click here to view\"),\n strings.icontains(body.current_thread.text, \"encrypted messages\"),\n strings.icontains(body.current_thread.text, \"1-800-780-0256\"),\n strings.icontains(body.current_thread.text,\n \"secure.emailhelp@morganstanley.com\"\n ),\n regex.icontains(body.current_thread.text,\n 'Morgan Stanley\\s+(?:Smith Barney|Wealth Management|\\w+\\s+Team)'\n ),\n strings.icontains(body.current_thread.text, \"one-time registration\"),\n strings.icontains(body.current_thread.text, \"see payment activity\"),\n regex.icontains(body.current_thread.text,\n 'link will expire on \\d{4}-\\d{2}-\\d{2}'\n ),\n any(ml.nlu_classifier(body.current_thread.text).intents,\n .name in (\"cred_theft\", \"callback_scam\") and .confidence == \"high\"\n )\n)"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 |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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 | |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass | |
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" |
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, false)
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
or
and
body.current_thread.text contains "ad account"
body.current_thread.text contains "ad campaign"
and
body.current_thread.text contains "ad account"
body.current_thread.text contains "connect account"
and
body.current_thread.text contains "ad account"
body.current_thread.text contains "invitation"
and
body.current_thread.text contains "ad account"
body.current_thread.text regex_match "ChatGPT.{0,15}Ads"
and
body.current_thread.text contains "ad campaign"
body.current_thread.text contains "connect account"
and
body.current_thread.text contains "ad campaign"
body.current_thread.text contains "invitation"
and
body.current_thread.text contains "ad campaign"
body.current_thread.text regex_match "ChatGPT.{0,15}Ads"
and
body.current_thread.text contains "connect account"
body.current_thread.text contains "invitation"
and
body.current_thread.text contains "connect account"
body.current_thread.text regex_match "ChatGPT.{0,15}Ads"
and
body.current_thread.text contains "invitation"
body.current_thread.text regex_match "ChatGPT.{0,15}Ads"
not
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
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" |
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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass |
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'
)
) >= 1
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"
or sender.email.domain.domain == 'paperlesspost.zendesk.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, // calling parse_url allows url decoding to help us strings.parse_url(.raw).domain.root_domain == 'ppassets.com' ) ) >= 1
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) != 0
- headers.in_reply_to is set
- length(body.previous_threads) > 0
not:
all of:
any of:
- sender.email.domain.root_domain is 'paperlesspost.com'
- sender.email.domain.domain is 'paperlesspost.zendesk.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.domain, 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"
length func_call "length(filter(body.links,\n .href_url.domain.domain == \"links.paperlesspost.com\"\n or (\n .href_url.domain.root_domain == \"paperlesspost.com\"\n and strings.istarts_with(.href_url.path, '/go/')\n )\n )\n ) < 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
or
sender.email.domain.domain eq "paperlesspost.zendesk.com"
sender.email.domain.root_domain eq "paperlesspost.com"
headers.auth_summary.dmarc.pass eq "true"
body.html.raw contains "ppassets.com"
length func_call "length(filter(html.xpath(body.html, '//img/@src').nodes,\n // calling parse_url allows url decoding to help us\n strings.parse_url(.raw).domain.root_domain == 'ppassets.com'\n )\n) >= 1"
type.inbound eq "true"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" |
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" |
sender.email.domain.domain | eq | paperlesspost.zendesk.com | excludes:sender.email.domain.domain field:"sender.email.domain.domain" value:"paperlesspost.zendesk.com" |
sender.email.domain.root_domain | eq | paperlesspost.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"paperlesspost.com" |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" 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, false)
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"
or
and
any(body.current_thread.links)
body.current_thread.links.href_url.domain.root_domain macro "body.current_thread.links[].href_url.domain.root_domain in free_subdomain_hosts"
sender.display_name ends_with "via Procore"
and
body.current_thread.text contains "6309 Carpinteria Ave"
body.current_thread.text contains "Carpinteria, CA 93013"
and
body.current_thread.text contains "6309 Carpinteria Ave"
body.current_thread.text contains "Procore"
and
body.current_thread.text contains "Carpinteria, CA 93013"
body.current_thread.text contains "Procore"
body.current_thread.text match "powered by procore"
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"
not
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain in ["procore.com", "procoretech.com"]
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 | 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" |
Exclusions
The rule actively suppresses these predicates.
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(html.xpath(body.html, '//title').nodes, strings.icontains(.raw, "secure access") and strings.icontains(.raw, 'Proofpoint') ) )
any of
attachmentswhere any holds:- strings.icontains(file.parse_text(.).text, '<h1>Proofpoint |')
- any(html.xpath(file.parse_html(.), '//title').nodes, strings.icontains(.raw, "secure access") and strings.icontains(.raw, '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(., mode="aggressive").effective_url.path == "/formpostdir/securereader"
- any(ml.link_analysis(., mode="aggressive").redirect_history, .path == "/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 == 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) == 1
- any(file.parse_eml(.).body.links, .display_text == "download it" and .href_url.domain.root_domain == "mimecast.com" )
- strings.ends_with(file.parse_eml(.).headers.message_id, "@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(body.links)
or
and
or
ml.link_analysis func_call "ml.link_analysis(., mode=\"aggressive\").effective_url.path == \"/formpostdir/securereader\""
macro "any(ml.link_analysis(., mode=\"aggressive\").redirect_history,\n .path == \"/formpostdir/securereader\"\n )"
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(.href_url.query_params_decoded[\"domain\"][0]).root_domain == sender.email.domain.root_domain"
body.links.href_url.path eq "/formpostdir/securereader"
not
any(attachments)
or
and
attachments.content_type eq "message/rfc822"
length func_call "length(file.parse_eml(.).body.links) == 1"
strings.ends_with func_call "strings.ends_with(file.parse_eml(.).headers.message_id,\n \"@localhost>\"\n )"
macro "any(file.parse_eml(.).body.links,\n .display_text == \"download it\"\n and .href_url.domain.root_domain == \"mimecast.com\"\n )"
attachments.file_name eq "SecureMessageAtt.html"
or
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(attachments)
or
strings.icontains func_call "strings.icontains(file.parse_text(.).text, '<h1>Proofpoint |')"
macro "any(html.xpath(file.parse_html(.), '//title').nodes,\n strings.icontains(.raw, \"secure access\")\n and strings.icontains(.raw, 'Proofpoint')\n )"
body.current_thread.text regex_match "Copyright © 2009-202\\d Proofpoint, Inc."
body.html.raw contains "<h1>Proofpoint |"
macro "(\n any(html.xpath(body.html, '//title').nodes,\n strings.icontains(.raw, \"secure access\")\n and strings.icontains(.raw, 'Proofpoint')\n )\n )"
or
attachments length_compare "0"
body.current_thread.links length_compare "1"
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 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" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
body.links | array_any | excludes:body.links | |
attachments | array_any | excludes:attachments |
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(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' ) )
any of:
- body.current_thread.text contains "you're invited"
all of:
- regex.icontains(beta.ocr(file.message_screenshot()).text, "you're invited", "open me", "manage 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([ 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)' ) ) )
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
and
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}\\?"
regex.icontains func_call "regex.icontains(beta.ocr(file.message_screenshot()).text,\n \"you're invited\",\n \"open me\",\n \"manage invitation\"\n )"
body.current_thread.text contains "you're invited"
macro "any([\n html.xpath(body.html,\n '//a//img[contains(@src, \"btn_open_invitation\")]'\n ).nodes,\n html.xpath(body.html,\n '//a//img[contains(@src, \"btn_open_save_the_date\")]'\n ).nodes,\n ],\n any(.,\n regex.icontains(.inner_text,\n '(?:open|save).{0,10}(?:invitation|the date)'\n )\n )\n )"
or
body.current_thread.text contains "punchbowl"
body.html.raw contains "alt=\"Punchbowl\""
macro "any(html.xpath(body.html, '//img/@src').nodes,\n strings.parse_url(.raw).domain.domain == \"static.punchbowl.com\"\n and strings.icontains(strings.parse_url(.raw).path,\n '/invitation',\n '/invite'\n )\n )"
not
sender.email.domain.root_domain in ["punchbowl.com", "punchbowl.news"]
body.current_thread.text length_compare "1500"
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 |
body.html.raw | contains |
| field:"body.html.raw" kind:contains |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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" |
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(ml.logo_detect(file.message_screenshot()).brands, .name == "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) == 0
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" )
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"]
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
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 "2884 Sand Hill Road"
body.current_thread.text contains "Robert Half"
and
body.current_thread.text contains "Menlo Park, CA 94025"
body.current_thread.text contains "Robert Half"
and
sender.display_name contains "Robert Half"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n .name == \"Robert Half\"\n )"
sender.display_name contains "Robert Half"
or
headers.in_reply_to is_null
headers.references length_compare "0"
not
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Newsletters and Digests\",\n \"Voicemail Call and Missed Call Notifications\",\n \"Advertising and Promotions\"\n )\n and .confidence != \"low\"\n)"
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 |
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" |
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 |
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")
)
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(ml.nlu_classifier(body.current_thread.text).entities, .name in ("org", "sender") and strings.icontains(.text, 'Robinhood') )
- ( any(ml.nlu_classifier(body.current_thread.text).intents, .name == "callback_scam" and .confidence != "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'
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) == 0
not:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ( "Newsletters and Digests", "Health and Wellness", "Events and Webinars" ) and .confidence == "high" )
not:
- any(ml.nlu_classifier(body.current_thread.text).intents, .name == "benign" and .confidence == "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, false)
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 |
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
or
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Device:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Email ID:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "IP Address:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Location:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Email ID:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "IP Address:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Location:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "IP Address:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "Location:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Location:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Location:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Location:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "App:?"
body.current_thread.text regex_match "Region:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Email ID:?"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "IP Address:?"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Location:?"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "IP Address:?"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "Location:?"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Location:?"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Location:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Location:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Date:"
body.current_thread.text regex_match "Region:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "IP Address:?"
and
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "Location:?"
and
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Location:?"
and
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Location:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Location:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Device:?"
body.current_thread.text regex_match "Region:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Location:?"
and
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "Location:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "Location:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Email ID:?"
body.current_thread.text regex_match "Region:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Location:?"
body.current_thread.text regex_match "Region:?"
and
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Location:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "IP Address:?"
body.current_thread.text regex_match "Region:?"
body.current_thread.text regex_match "Time:"
and
body.current_thread.text regex_match "Location:?"
body.current_thread.text regex_match "Region:?"
body.current_thread.text regex_match "Time:"
body.current_thread.text contains "Security support phone number"
body.current_thread.text contains "new passkey added"
sender.display_name contains "Robinhood"
and
body.current_thread.text contains "Menlo Park, CA"
body.current_thread.text contains "Robinhood"
and
body.current_thread.text contains "Menlo Park, CA"
body.current_thread.text regex_match "42 Willow (?:Road|St)"
and
body.current_thread.text contains "Robinhood"
body.current_thread.text regex_match "42 Willow (?:Road|St)"
and
macro "(\n any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"callback_scam\" and .confidence != \"low\"\n )\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name in (\"org\", \"sender\") and strings.icontains(.text, 'Robinhood')\n )"
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 "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"
length func_call "(\n length(filter(body.links,\n strings.icontains(.href_url.url,\n 'https://www.facebook.com/robinhood'\n )\n or strings.icontains(.href_url.url,\n 'https://twitter.com/robinhoodapp'\n )\n or strings.icontains(.href_url.url,\n 'https://www.youtube.com/@RobinhoodApp'\n )\n or strings.icontains(.href_url.url,\n 'https://www.instagram.com/robinhood'\n )\n )\n ) >= 2\n )"
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
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain in ["bitstamp.net", "duck.com", "robinhood.com", "robinhood.org", "robinhoodauctions.com", "sinch.com"]
not
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"benign\" and .confidence == \"high\"\n)"
not
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Newsletters and Digests\",\n \"Health and Wellness\",\n \"Events and Webinars\"\n )\n and .confidence == \"high\"\n)"
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 |
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" |
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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass | |
sender.email.domain.root_domain | in | bitstamp.net, duck.com, robinhood.com, robinhood.org, robinhoodauctions.com, sinch.com | excludes:sender.email.domain.root_domain |
Brand impersonation: Sedgwick Claims
#Detects inbound messages that impersonate Sedgwick Claims Management Services, either through a display name containing 'Sedgwick Claim' or through NLU classification identifying Sedgwick as an organization entity alongside high-confidence financial communication topics. Legitimate messages from verified Sedgwick domains (sedgwick.com or sedgwickcms.com) that pass DMARC authentication are excluded.
Threat Classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, 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
and (
strings.icontains(sender.display_name, "Sedgwick Claim")
or (
any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "sender" and .text == "Sedgwick"
)
and any(ml.nlu_classifier(body.current_thread.text).topics,
.name == "Financial Communications" and .confidence == "high"
)
and any(body.links, strings.icontains(.display_text, "claim"))
)
)
and not (
sender.email.domain.root_domain in ("sedgwick.com", "sedgwickcms.com")
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection Logic
Scope: inbound message.
Detects inbound messages that impersonate Sedgwick Claims Management Services, either through a display name containing 'Sedgwick Claim' or through NLU classification identifying Sedgwick as an organization entity alongside high-confidence financial communication topics. Legitimate messages from verified Sedgwick domains (sedgwick.com or sedgwickcms.com) that pass DMARC authentication are excluded.
- inbound message
any of:
- sender.display_name contains 'Sedgwick Claim'
all of:
- any(ml.nlu_classifier(body.current_thread.text).entities, .name == "sender" and .text == "Sedgwick" )
- any(ml.nlu_classifier(body.current_thread.text).topics, .name == "Financial Communications" and .confidence == "high" )
any of
body.linkswhere:- .display_text contains 'claim'
not:
all of:
- sender.email.domain.root_domain in ('sedgwick.com', 'sedgwickcms.com')
- coalesce(headers.auth_summary.dmarc.pass, false)
Inspects: body.current_thread.text, body.links, body.links[].display_text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, strings.icontains.
Indicators Matched (6)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | Sedgwick Claim |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | sender |
ml.nlu_classifier(body.current_thread.text).entities[].text | equals | Sedgwick |
ml.nlu_classifier(body.current_thread.text).topics[].name | equals | Financial Communications |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | equals | high |
strings.icontains | substring | claim |
Stages and Predicates
Stage 1: mql_rule
and
or
and
any(body.links)
body.links.display_text contains "claim"
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name == \"sender\" and .text == \"Sedgwick\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name == \"Financial Communications\" and .confidence == \"high\"\n )"
sender.display_name contains "Sedgwick Claim"
not
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain in ["sedgwick.com", "sedgwickcms.com"]
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.display_name | contains |
| field:"sender.display_name" kind:contains value:"Sedgwick Claim" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass | |
sender.email.domain.root_domain | in | sedgwick.com, sedgwickcms.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"sedgwick.com" field:"sender.email.domain.root_domain" value:"sedgwickcms.com" |
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.ilike(strings.replace_confusables(sender.display_name), '*sendgrid*' )
- strings.ilevenshtein(strings.replace_confusables(sender.display_name), 'sendgrid' ) <= 1
- 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.ilike(strings.replace_confusables(sender.email.local_part), '*sendgrid*' )
any of:
- sender.display_name is missing
- strings.ilike(strings.replace_confusables(subject.base), '*sendgrid*' )
- any(ml.logo_detect(file.message_screenshot()).brands, .name == "SendGrid" and .confidence == "high" )
any of:
- strings.ilike(strings.replace_confusables(sender.display_name), '*twilio*')
- strings.ilevenshtein(strings.replace_confusables(sender.display_name), 'twilio' ) <= 1
all of:
- strings.ilike(strings.replace_confusables(sender.email.local_part), '*twilio*' )
any of:
- sender.display_name is missing
- strings.ilike(strings.replace_confusables(subject.base), '*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(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") )
- 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") )
- any(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .confidence == "high" )
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents, .name == "cred_theft" and .confidence == "high" )
- any([subject.base, body.current_thread.text], (strings.icontains(., "capacity") or strings.icontains(., "limit")) and regex.icontains(., '\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, false)
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
and
body.current_thread.text contains "api"
body.current_thread.text contains "delivery"
body.current_thread.text contains "endpoint"
and
body.current_thread.text contains "api"
body.current_thread.text contains "delivery"
body.current_thread.text contains "event notification"
and
body.current_thread.text contains "api"
body.current_thread.text contains "delivery"
body.current_thread.text contains "webhook"
and
body.current_thread.text contains "api"
body.current_thread.text contains "endpoint"
body.current_thread.text contains "event notification"
and
body.current_thread.text contains "api"
body.current_thread.text contains "endpoint"
body.current_thread.text contains "webhook"
and
body.current_thread.text contains "api"
body.current_thread.text contains "event notification"
body.current_thread.text contains "webhook"
and
body.current_thread.text contains "delivery"
body.current_thread.text contains "endpoint"
body.current_thread.text contains "event notification"
and
body.current_thread.text contains "delivery"
body.current_thread.text contains "endpoint"
body.current_thread.text contains "webhook"
and
body.current_thread.text contains "delivery"
body.current_thread.text contains "event notification"
body.current_thread.text contains "webhook"
and
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"]
and
or
sender.display_name is_null
strings.ilike func_call "strings.ilike(strings.replace_confusables(subject.base), '*twilio*')"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.email.local_part),\n '*twilio*'\n )"
and
or
sender.display_name is_null
strings.ilike func_call "strings.ilike(strings.replace_confusables(subject.base),\n '*sendgrid*'\n )"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.email.local_part),\n '*sendgrid*'\n )"
and
body.current_thread.text contains "1801 California St"
body.current_thread.text contains "Denver, CO 80202"
and
body.current_thread.text contains "1801 California St"
body.current_thread.text regex_match "(?:Twilio|SendGrid)"
and
body.current_thread.text contains "Denver, CO 80202"
body.current_thread.text regex_match "(?:Twilio|SendGrid)"
body.current_thread.text contains "the sendgrid team"
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),\n 'sendgrid'\n ) <= 1"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name),\n 'twilio'\n ) <= 1"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.display_name), '*twilio*')"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.display_name),\n '*sendgrid*'\n )"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n .name == \"SendGrid\" and .confidence == \"high\"\n )"
not
and
or
sender.email.domain.root_domain in ["evolve.com", "sendgrid.com", "sendgrid.net", "sendgridsolutions.com", "sendsafely.com", "swoogo.com", "twilio.com"]
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.valid eq "true"
not
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
not
profile.by_sender func_call "profile.by_sender().solicited"
or
macro "any([subject.base, body.current_thread.text],\n (strings.icontains(., \"capacity\") or strings.icontains(., \"limit\"))\n and regex.icontains(., '\\breach(?:\\b|ed)')\n )"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\",\n \"Software and App Updates\",\n \"Customer Service and Support\"\n )\n and .confidence in (\"medium\", \"high\")\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\",\n \"Software and App Updates\",\n \"Customer Service and Support\"\n )\n and .confidence in (\"medium\", \"high\")\n )"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass |
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:
- regex.icontains(strings.replace_confusables(sender.display_name), '\bsh[ie]{2}n\b' )
not:
- sender.display_name contains 'sheen'
all of:
- length(ml.logo_detect(file.message_screenshot()).brands) == 1
- all(ml.logo_detect(file.message_screenshot()).brands, .name == "Shein" and .confidence == "high" )
any of:
all of:
- length(ml.nlu_classifier(body.current_thread.text).topics) > 0
- 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") )
all of:
- beta.ocr(file.message_screenshot()).text != ""
- length(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics ) > 0
- 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") )
- any(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .confidence == "high" )
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents, .name == "cred_theft" and .confidence == "high" )
none of:
- sender.email.domain.root_domain in $org_domains
all of:
- length(attachments) == 1
all of
attachmentswhere all hold:- .file_type is 'pdf'
- strings.icontains(beta.parse_exif(.).creator, "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, .href_url.domain.root_domain in ( "shein.com", "sheinemail.com", "shein.co.uk", "sheingroup.com", "sheinnotice.com", "cash.app", "capitaloneshopping.com" ) ) > 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,\n .href_url.domain.root_domain in (\n \"shein.com\",\n \"sheinemail.com\",\n \"shein.co.uk\",\n \"sheingroup.com\",\n \"sheinnotice.com\",\n \"cash.app\",\n \"capitaloneshopping.com\"\n )\n ) > 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,\n .file_type == \"pdf\"\n and strings.icontains(beta.parse_exif(.).creator, \"MondialRelay\")\n )"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
and
not
sender.display_name contains "sheen"
regex.icontains func_call "regex.icontains(strings.replace_confusables(sender.display_name),\n '\\bsh[ie]{2}n\\b'\n )"
and
length func_call "length(ml.logo_detect(file.message_screenshot()).brands) == 1"
macro "all(ml.logo_detect(file.message_screenshot()).brands,\n .name == \"Shein\" and .confidence == \"high\"\n )"
or
and
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != \"\""
length func_call "length(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics\n ) > 0"
macro "all(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\",\n \"Advertising and Promotions\" // fake surveys/giveaways have been observed\n )\n and .confidence in (\"medium\", \"high\")\n )"
and
length func_call "length(ml.nlu_classifier(body.current_thread.text).topics) > 0"
macro "all(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\",\n \"Advertising and Promotions\" // fake surveys/giveaways have been observed\n )\n and .confidence in (\"medium\", \"high\")\n )"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
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"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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" |
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'
- strings.ilevenshtein(sender.display_name, 'siriusxm') <= 1
- 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, false)
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
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain 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" |
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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass |
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(ml.nlu_classifier(body.current_thread.text).topics, .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, false)
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass, false)
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
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain in ["investordelivery.com", "samsung.com", "sofi.com", "sofi.org"]
not
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
not
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\"Newsletters and Digests\")\n)"
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 | regex_match |
| field:"sender.display_name" kind:regex_match value:"\bsofi\b" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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" |
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass | |
sender.email.domain.root_domain | in | investordelivery.com, samsung.com, sofi.com, sofi.org | excludes:sender.email.domain.root_domain |
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.ilevenshtein(strings.replace_confusables(sender.display_name), 'square' ) <= 1
- sender.display_name not in ('SquareX')
- any(ml.logo_detect(file.message_screenshot()).brands, .name == "Square" and .confidence == "high" )
any of:
all of:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ( "Security and Authentication", "Secure Message", "Reminders and Notifications" ) and .confidence in ("medium", "high") )
not:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ("Newsletters and Digests", "Entertainment and Sports") and .confidence in ("medium", "high") )
all of:
- beta.ocr(file.message_screenshot()).text != ""
- 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") )
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") )
- any(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .confidence == "high" )
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents, .name == "cred_theft" and .confidence == "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
not
or
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["block.com", "square.com", "squareup.com"]
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
and
not
sender.display_name eq "SquareX"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name),\n 'square'\n ) <= 1"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n .name == \"Square\" and .confidence == \"high\"\n )"
or
and
not
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\"Newsletters and Digests\", \"Entertainment and Sports\")\n and .confidence in (\"medium\", \"high\")\n )"
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != \"\""
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\"\n )\n and .confidence in (\"medium\", \"high\")\n )"
and
not
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\"Newsletters and Digests\", \"Entertainment and Sports\")\n and .confidence in (\"medium\", \"high\")\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\"\n )\n and .confidence in (\"medium\", \"high\")\n )"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
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"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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" |
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.icontains(strings.replace_confusables(sender.display_name), "squarespace" )
- strings.ilevenshtein(sender.display_name, "squarespace") < 2
- 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, false)
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"]
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
not
and
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain 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.icontains func_call "strings.icontains(strings.replace_confusables(sender.display_name),\n \"squarespace\"\n )"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"squarespace\") < 2"
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:"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" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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" |
headers.auth_summary.dmarc.pass | is_not_null | excludes:headers.auth_summary.dmarc.pass |
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",
"sfdividend.com" // dividend payout email from State Farm
)
)
)
// 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', 'sfdividend.com')
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass, false)
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
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.root_domain 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", "sfdividend.com", "statefarm.ca", "statefarm.com", "statefarmarena.com", "statefarmbank.com", "statefarmclaims.com", "statefarmfeedback.com", "statefarminsurance.com", "statefarmisthere.com", "statefarmservice.com", "statefarmsurveys.com"]
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
sender.display_name regex_match "state\\s?farm"
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:"state\s?farm" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Exclusions
The rule actively suppresses these predicates.
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*'
- strings.ilevenshtein(sender.display_name, 'stripe') <= 1
- 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 ) ) == 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(.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"
length func_call "length(filter(body.links,\n .href_url.domain.root_domain != 'stripe.com'\n and .display_text is not null\n )\n ) == 2"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain 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"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" |
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" |
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(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .confidence == "high" )
- any(ml.nlu_classifier(body.current_thread.text).entities, .name == "org" and .text in ('AAA', 'Medicare Kit') )
- any(ml.nlu_classifier(body.current_thread.text).entities, .name == "request" and regex.icontains(.text, '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(ml.nlu_classifier(body.current_thread.text).topics, .name == "Advertising and Promotions" and .confidence != "low" )
- any(ml.nlu_classifier(body.current_thread.text).entities, .name in ("request", "org") and strings.icontains(.text, "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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
length func_call "length(filter(ml.nlu_classifier(body.current_thread.text).entities,\n .name == \"financial\"\n and regex.icontains(.text, '\\d{2}%\\s*discount$')\n )\n ) >= 2"
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name == \"org\" and .text in ('AAA', 'Medicare Kit')\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name == \"request\"\n and regex.icontains(.text, 'claim\\s+your\\s+(?:free|medical)?\\s+kit')\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
type.inbound eq "true"
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name in (\"request\", \"org\") and strings.icontains(.text, \"survey\")\n)"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name == \"Advertising and Promotions\" and .confidence != \"low\"\n)"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 a variation of tiktok
or strings.iends_with(sender.email.domain.root_domain,
"-tiktok.com",
"badgetiktok.com"
)
or strings.istarts_with(sender.email.domain.root_domain, "tiktokrequest")
)
// 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.ilike(strings.replace_confusables(sender.display_name), '*tiktok*')
- strings.ilevenshtein(strings.replace_confusables(sender.display_name), 'tiktok' ) <= 1
all of:
- length(ml.logo_detect(file.message_screenshot()).brands) == 1
- any(ml.logo_detect(file.message_screenshot()).brands, .name == "TikTok" and .confidence == "high" )
sender.email.domain.root_domain ends with any of 2 patterns
-tiktok.combadgetiktok.com
- sender.email.domain.root_domain starts with 'tiktokrequest'
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(ml.nlu_classifier(body.current_thread.text).topics, .name in ( "Security and Authentication", "Secure Message", "Reminders and Notifications" ) and .confidence in ("medium", "high") )
all of:
- beta.ocr(file.message_screenshot()).text != ""
- 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") )
- any(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .confidence == "high" )
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents, .name == "cred_theft" and .confidence == "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.istarts_with, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators Matched (29)
| 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.iends_with | suffix | badgetiktok.com |
strings.istarts_with | prefix | tiktokrequest |
strings.icontains | substring | tiktok |
strings.icontains | substring | verified badge |
strings.icontains | substring | verification criteria |
strings.icontains | substring | activate badge |
strings.icontains | substring | verification complete |
17 more
strings.icontains | substring | almost verified |
strings.icontains | substring | review complete |
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
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"
and
length func_call "length(ml.logo_detect(file.message_screenshot()).brands) == 1"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n .name == \"TikTok\" and .confidence == \"high\"\n )"
sender.email.domain.root_domain ends_with "-tiktok.com"
sender.email.domain.root_domain ends_with "badgetiktok.com"
sender.email.domain.root_domain starts_with "tiktokrequest"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name),\n 'tiktok'\n ) <= 1"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.display_name), '*tiktok*')"
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"]
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
and
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != \"\""
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\"\n )\n and .confidence in (\"medium\", \"high\")\n )"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\"\n )\n and .confidence in (\"medium\", \"high\")\n )"
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 | contains |
| field:"body.current_thread.text" kind:contains |
sender.email.domain.root_domain | ends_with |
| field:"sender.email.domain.root_domain" kind:ends_with |
sender.email.domain.root_domain | starts_with |
| field:"sender.email.domain.root_domain" kind:starts_with value:"tiktokrequest" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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 |
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.ilike(strings.replace_confusables(sender.display_name), '*TD Bank*')
- strings.ilike(strings.replace_confusables(sender.display_name), '*TD Canada Trust*' )
- strings.ilevenshtein(strings.replace_confusables(sender.display_name), 'TD Bank' ) <= 1
- strings.ilevenshtein(strings.replace_confusables(sender.display_name), 'TD Canada Trust' ) <= 1
- any(ml.logo_detect(file.message_screenshot()).brands, .name == "TD Bank" and .confidence == "high" )
- any([subject.base, sender.display_name], strings.ilike(., "*TD?Secure*"))
any of:
all of:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ( "Security and Authentication", "Secure Message", "Reminders and Notifications" ) and .confidence in ("medium", "high") )
not:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ("Newsletters and Digests", "Entertainment and Sports") and .confidence in ("medium", "high") )
all of:
- beta.ocr(file.message_screenshot()).text != ""
- 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") )
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") )
- any(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .confidence == "high" )
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents, .name == "cred_theft" and .confidence == "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
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"]
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
and
not
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\"Newsletters and Digests\", \"Entertainment and Sports\")\n and .confidence in (\"medium\", \"high\")\n )"
beta.ocr func_call "beta.ocr(file.message_screenshot()).text != \"\""
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\"\n )\n and .confidence in (\"medium\", \"high\")\n )"
and
not
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\"Newsletters and Digests\", \"Entertainment and Sports\")\n and .confidence in (\"medium\", \"high\")\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Reminders and Notifications\"\n )\n and .confidence in (\"medium\", \"high\")\n )"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
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"
or
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name),\n 'TD Bank'\n ) <= 1"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name),\n 'TD Canada Trust'\n ) <= 1"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.display_name), '*TD Bank*')"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.display_name),\n '*TD Canada Trust*'\n )"
macro "any([subject.base, sender.display_name], strings.ilike(., \"*TD?Secure*\"))"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n .name == \"TD Bank\" and .confidence == \"high\"\n )"
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" |
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 |
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:
- regex.icontains(strings.replace_confusables(sender.display_name), '\btrust wa[li1]{2}et\b' )
- strings.ilevenshtein(strings.replace_confusables(sender.display_name), 'trust wallet' ) <= 2
- ( any(ml.nlu_classifier(body.current_thread.text).intents, .name in ("cred_theft", "callback_scam", "steal_pii", "extortion") and .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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
regex.icontains func_call "regex.icontains(strings.replace_confusables(sender.display_name),\n '\\btrust wa[li1]{2}et\\b'\n )"
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name),\n 'trust wallet'\n ) <= 2"
not
sender.email.domain.root_domain eq "trustwallet.com"
body.links length_compare "0"
type.inbound eq "true"
macro "(\n any(ml.nlu_classifier(body.current_thread.text).intents,\n .name in (\"cred_theft\", \"callback_scam\", \"steal_pii\", \"extortion\")\n and .confidence in (\"high\")\n )\n)"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"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" |
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([ 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") )
- 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(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .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(ml.nlu_classifier(body.html.display_text).topics, .name == "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"
not
macro "all(body.links, .href_url.domain.tld == \"gov.uk\")"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence in (\"medium\", \"high\")\n )"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
and
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"
and
body.current_thread.text contains "This is an automated message from UK Visas and Immigration."
body.current_thread.text contains "© 2025 Home Office"
and
body.current_thread.text contains "This is an automated message from UK Visas and Immigration."
body.current_thread.text contains "© Crown Copyright "
and
body.current_thread.text contains "This is an automated message from UK Visas and Immigration."
body.current_thread.text contains "© UK Visas and Immigration"
and
body.current_thread.text contains "This is an automated message from UK Visas and Immigration."
body.current_thread.text regex_match " [||–-—] Home Office"
and
body.current_thread.text contains "This is an automated message from UK Visas and Immigration."
body.current_thread.text regex_match " [|–-—] UK Visas and Immigration"
and
body.current_thread.text contains "This is an automated message from UK Visas and Immigration."
body.current_thread.text regex_match "If you are not the designated.{0,50}SMS user"
and
body.current_thread.text contains "This is an automated message from UK Visas and Immigration."
body.current_thread.text regex_match "You(?: are|'re) receiving this notification as a registered SMS user"
and
body.current_thread.text contains "This is an automated notification from the Home Office"
body.current_thread.text contains "© 2025 Home Office"
and
body.current_thread.text contains "This is an automated notification from the Home Office"
body.current_thread.text contains "© Crown Copyright "
and
body.current_thread.text contains "This is an automated notification from the Home Office"
body.current_thread.text contains "© UK Visas and Immigration"
and
body.current_thread.text contains "This is an automated notification from the Home Office"
body.current_thread.text regex_match " [||–-—] Home Office"
and
body.current_thread.text contains "This is an automated notification from the Home Office"
body.current_thread.text regex_match " [|–-—] UK Visas and Immigration"
and
body.current_thread.text contains "This is an automated notification from the Home Office"
body.current_thread.text regex_match "If you are not the designated.{0,50}SMS user"
and
body.current_thread.text contains "This is an automated notification from the Home Office"
body.current_thread.text regex_match "You(?: are|'re) receiving this notification as a registered SMS user"
and
body.current_thread.text contains "© 2025 Home Office"
body.current_thread.text contains "© Crown Copyright "
and
body.current_thread.text contains "© 2025 Home Office"
body.current_thread.text contains "© UK Visas and Immigration"
and
body.current_thread.text contains "© 2025 Home Office"
body.current_thread.text regex_match " [||–-—] Home Office"
and
body.current_thread.text contains "© 2025 Home Office"
body.current_thread.text regex_match " [|–-—] UK Visas and Immigration"
and
body.current_thread.text contains "© 2025 Home Office"
body.current_thread.text regex_match "If you are not the designated.{0,50}SMS user"
and
body.current_thread.text contains "© 2025 Home Office"
body.current_thread.text regex_match "You(?: are|'re) receiving this notification as a registered SMS user"
and
body.current_thread.text contains "© Crown Copyright "
body.current_thread.text contains "© UK Visas and Immigration"
and
body.current_thread.text contains "© Crown Copyright "
body.current_thread.text regex_match " [||–-—] Home Office"
and
body.current_thread.text contains "© Crown Copyright "
body.current_thread.text regex_match " [|–-—] UK Visas and Immigration"
and
body.current_thread.text contains "© Crown Copyright "
body.current_thread.text regex_match "If you are not the designated.{0,50}SMS user"
and
body.current_thread.text contains "© Crown Copyright "
body.current_thread.text regex_match "You(?: are|'re) receiving this notification as a registered SMS user"
and
body.current_thread.text contains "© UK Visas and Immigration"
body.current_thread.text regex_match " [||–-—] Home Office"
and
body.current_thread.text contains "© UK Visas and Immigration"
body.current_thread.text regex_match " [|–-—] UK Visas and Immigration"
and
body.current_thread.text contains "© UK Visas and Immigration"
body.current_thread.text regex_match "If you are not the designated.{0,50}SMS user"
and
body.current_thread.text contains "© UK Visas and Immigration"
body.current_thread.text regex_match "You(?: are|'re) receiving this notification as a registered SMS user"
and
body.current_thread.text regex_match " [||–-—] Home Office"
body.current_thread.text regex_match " [|–-—] UK Visas and Immigration"
and
body.current_thread.text regex_match " [||–-—] Home Office"
body.current_thread.text regex_match "If you are not the designated.{0,50}SMS user"
and
body.current_thread.text regex_match " [||–-—] Home Office"
body.current_thread.text regex_match "You(?: are|'re) receiving this notification as a registered SMS user"
and
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"
and
body.current_thread.text regex_match " [|–-—] UK Visas and Immigration"
body.current_thread.text regex_match "You(?: are|'re) receiving this notification as a registered SMS user"
and
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/"
macro "any([\n strings.replace_confusables(sender.display_name),\n strings.replace_confusables(subject.subject)\n ],\n strings.ilike(.,\n \"*sponsorship management system*\",\n \"*Sponsor Management System*\"\n )\n // exact match of high confidence\n or . in~ (\"Home Office\", \"uk home office\", \"UK Visas and Immigration\")\n )"
not
or
body.links length_compare "20"
macro "any(ml.nlu_classifier(body.html.display_text).topics,\n .name == \"Newsletters and Digests\"\n )"
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"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" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
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" |
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.ilike(strings.replace_confusables(sender.display_name), '*vanguard*' )
- strings.ilevenshtein(strings.replace_confusables(sender.display_name), 'vanguard' ) <= 1
- strings.ilike(strings.replace_confusables(sender.email.domain.domain), '*vanguard*' )
all of:
any of:
- any(beta.ml_topic(body.current_thread.text).topics, .name in ( "Security and Authentication", "Secure Message", "Financial Communications" ) and .confidence == "high" )
- any(beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics, .name in ( "Security and Authentication", "Secure Message", "Financial Communications" ) and .confidence == "high" )
any of:
- any(ml.nlu_classifier(body.current_thread.text).intents, .name == "cred_theft" and .confidence == "high" )
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents, .name == "cred_theft" and .confidence == "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
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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in org_domains"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
not
profile.by_sender func_call "profile.by_sender().solicited"
or
strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name),\n 'vanguard'\n ) <= 1"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.display_name),\n '*vanguard*'\n )"
strings.ilike func_call "strings.ilike(strings.replace_confusables(sender.email.domain.domain),\n '*vanguard*'\n )"
or
macro "any(beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Financial Communications\"\n )\n and .confidence == \"high\"\n )"
macro "any(beta.ml_topic(body.current_thread.text).topics,\n .name in (\n \"Security and Authentication\",\n \"Secure Message\",\n \"Financial Communications\"\n )\n and .confidence == \"high\"\n )"
or
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
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" |
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" |
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*'
- strings.ilevenshtein(sender.display_name, "wetransfer") <= 1
- 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
and
any(body.links)
or
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in free_file_hosts"
body.links.href_url.domain.tld macro "body.links[].href_url.domain.tld in suspicious_tlds"
network.whois func_call "network.whois(.href_url.domain).days_old < 30"
any(body.links)
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.display_text match "wetransfer"
and
any(body.links)
or
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in free_file_hosts"
body.links.href_url.domain.tld macro "body.links[].href_url.domain.tld in suspicious_tlds"
network.whois func_call "network.whois(.href_url.domain).days_old < 30"
or
sender.display_name match "we transfer"
sender.display_name match "wetransfer"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"wetransfer\") <= 1"
and
any(body.links)
or
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in free_file_hosts"
body.links.href_url.domain.tld macro "body.links[].href_url.domain.tld in suspicious_tlds"
network.whois func_call "network.whois(.href_url.domain).days_old < 30"
body.current_thread.text regex_match "fichiers n'aient pas encore été téléchargés"
and
any(body.links)
or
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in free_file_hosts"
body.links.href_url.domain.tld macro "body.links[].href_url.domain.tld in suspicious_tlds"
network.whois func_call "network.whois(.href_url.domain).days_old < 30"
body.current_thread.text regex_match "transfert expirera"
and
any(body.links)
or
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in free_file_hosts"
body.links.href_url.domain.tld macro "body.links[].href_url.domain.tld in suspicious_tlds"
network.whois func_call "network.whois(.href_url.domain).days_old < 30"
sender.email.domain.root_domain regex_match "wetransfer\\\\.[a-z]{2,4}$"
and
any(body.links)
or
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in free_file_hosts"
body.links.href_url.domain.tld macro "body.links[].href_url.domain.tld in suspicious_tlds"
network.whois func_call "network.whois(.href_url.domain).days_old < 30"
sender.email.email regex_match "nore?pl[a@]y@wetransfer"
and
any(body.links)
or
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in free_file_hosts"
body.links.href_url.domain.tld macro "body.links[].href_url.domain.tld in suspicious_tlds"
network.whois func_call "network.whois(.href_url.domain).days_old < 30"
subject.subject regex_match "(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer"
and
any(body.links)
or
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in free_file_hosts"
body.links.href_url.domain.tld macro "body.links[].href_url.domain.tld in suspicious_tlds"
network.whois func_call "network.whois(.href_url.domain).days_old < 30"
subject.subject regex_match "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"
and
any(body.links)
or
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in free_file_hosts"
body.links.href_url.domain.tld macro "body.links[].href_url.domain.tld in suspicious_tlds"
network.whois func_call "network.whois(.href_url.domain).days_old < 30"
subject.subject regex_match "WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]"
and
any(body.links)
or
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in free_file_hosts"
body.links.href_url.domain.tld macro "body.links[].href_url.domain.tld in suspicious_tlds"
network.whois func_call "network.whois(.href_url.domain).days_old < 30"
subject.subject regex_match "vous a envoy[ée] .{1,30} par WeTransfer"
and
any(body.links)
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.display_text match "wetransfer"
or
sender.display_name match "we transfer"
sender.display_name match "wetransfer"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"wetransfer\") <= 1"
and
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"
and
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 "transfert expirera"
and
any(body.links)
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.display_text match "wetransfer"
sender.email.domain.root_domain regex_match "wetransfer\\\\.[a-z]{2,4}$"
and
any(body.links)
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.display_text match "wetransfer"
sender.email.email regex_match "nore?pl[a@]y@wetransfer"
and
any(body.links)
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.display_text match "wetransfer"
subject.subject regex_match "(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer"
and
any(body.links)
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.display_text match "wetransfer"
subject.subject regex_match "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"
and
any(body.links)
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.display_text match "wetransfer"
subject.subject regex_match "WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]"
and
any(body.links)
and
not
body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
body.links.display_text match "wetransfer"
subject.subject regex_match "vous a envoy[ée] .{1,30} par WeTransfer"
and
or
sender.display_name match "we transfer"
sender.display_name match "wetransfer"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"wetransfer\") <= 1"
body.current_thread.text regex_match "fichiers n'aient pas encore été téléchargés"
and
or
sender.display_name match "we transfer"
sender.display_name match "wetransfer"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"wetransfer\") <= 1"
body.current_thread.text regex_match "transfert expirera"
and
or
sender.display_name match "we transfer"
sender.display_name match "wetransfer"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"wetransfer\") <= 1"
sender.email.domain.root_domain regex_match "wetransfer\\\\.[a-z]{2,4}$"
and
or
sender.display_name match "we transfer"
sender.display_name match "wetransfer"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"wetransfer\") <= 1"
sender.email.email regex_match "nore?pl[a@]y@wetransfer"
and
or
sender.display_name match "we transfer"
sender.display_name match "wetransfer"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"wetransfer\") <= 1"
subject.subject regex_match "(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer"
and
or
sender.display_name match "we transfer"
sender.display_name match "wetransfer"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"wetransfer\") <= 1"
subject.subject regex_match "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"
and
or
sender.display_name match "we transfer"
sender.display_name match "wetransfer"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"wetransfer\") <= 1"
subject.subject regex_match "WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]"
and
or
sender.display_name match "we transfer"
sender.display_name match "wetransfer"
strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"wetransfer\") <= 1"
subject.subject regex_match "vous a envoy[ée] .{1,30} par WeTransfer"
and
body.current_thread.text regex_match "fichiers n'aient pas encore été téléchargés"
body.current_thread.text regex_match "transfert expirera"
and
body.current_thread.text regex_match "fichiers n'aient pas encore été téléchargés"
sender.email.domain.root_domain regex_match "wetransfer\\\\.[a-z]{2,4}$"
and
body.current_thread.text regex_match "fichiers n'aient pas encore été téléchargés"
sender.email.email regex_match "nore?pl[a@]y@wetransfer"
and
body.current_thread.text regex_match "fichiers n'aient pas encore été téléchargés"
subject.subject regex_match "(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer"
and
body.current_thread.text regex_match "fichiers n'aient pas encore été téléchargés"
subject.subject regex_match "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"
and
body.current_thread.text regex_match "fichiers n'aient pas encore été téléchargés"
subject.subject regex_match "WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]"
and
body.current_thread.text regex_match "fichiers n'aient pas encore été téléchargés"
subject.subject regex_match "vous a envoy[ée] .{1,30} par WeTransfer"
and
body.current_thread.text regex_match "transfert expirera"
sender.email.domain.root_domain regex_match "wetransfer\\\\.[a-z]{2,4}$"
and
body.current_thread.text regex_match "transfert expirera"
sender.email.email regex_match "nore?pl[a@]y@wetransfer"
and
body.current_thread.text regex_match "transfert expirera"
subject.subject regex_match "(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer"
and
body.current_thread.text regex_match "transfert expirera"
subject.subject regex_match "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"
and
body.current_thread.text regex_match "transfert expirera"
subject.subject regex_match "WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]"
and
body.current_thread.text regex_match "transfert expirera"
subject.subject regex_match "vous a envoy[ée] .{1,30} par WeTransfer"
and
sender.email.domain.root_domain regex_match "wetransfer\\\\.[a-z]{2,4}$"
sender.email.email regex_match "nore?pl[a@]y@wetransfer"
and
sender.email.domain.root_domain regex_match "wetransfer\\\\.[a-z]{2,4}$"
subject.subject regex_match "(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer"
and
sender.email.domain.root_domain regex_match "wetransfer\\\\.[a-z]{2,4}$"
subject.subject regex_match "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"
and
sender.email.domain.root_domain regex_match "wetransfer\\\\.[a-z]{2,4}$"
subject.subject regex_match "WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]"
and
sender.email.domain.root_domain regex_match "wetransfer\\\\.[a-z]{2,4}$"
subject.subject regex_match "vous a envoy[ée] .{1,30} par WeTransfer"
and
sender.email.email regex_match "nore?pl[a@]y@wetransfer"
subject.subject regex_match "(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer"
and
sender.email.email regex_match "nore?pl[a@]y@wetransfer"
subject.subject regex_match "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"
and
sender.email.email regex_match "nore?pl[a@]y@wetransfer"
subject.subject regex_match "WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]"
and
sender.email.email regex_match "nore?pl[a@]y@wetransfer"
subject.subject regex_match "vous a envoy[ée] .{1,30} par WeTransfer"
and
subject.subject regex_match "(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer"
subject.subject regex_match "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"
and
subject.subject regex_match "(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer"
subject.subject regex_match "WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]"
and
subject.subject regex_match "(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer"
subject.subject regex_match "vous a envoy[ée] .{1,30} par WeTransfer"
and
subject.subject regex_match "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"
subject.subject regex_match "WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]"
and
subject.subject regex_match "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"
subject.subject regex_match "vous a envoy[ée] .{1,30} par WeTransfer"
and
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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain 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"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" |
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" |
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"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" |
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" |
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) == 1
- all(beta.ml_topic(body.html.display_text).topics, .name in ("Events and Webinars", "Software and App Updates") and .confidence != "low" )
- any(ml.logo_detect(file.message_screenshot()).brands, .name == "Zoom" and .confidence == "high" )
any of
body.linkswhere:- any(ml.nlu_classifier(.display_text).intents, .name == "cred_theft" and .confidence == "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 == "Zoom"
- strings.icontains(ml.link_analysis(.).final_dom.raw, '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
length func_call "length(ml.link_analysis(.).files_downloaded) > 0"
ml.link_analysis func_call "ml.link_analysis(.).credphish.brand.name == \"Zoom\""
strings.icontains func_call "strings.icontains(ml.link_analysis(.).final_dom.raw,\n 'https://challenges.cloudflare.com/turnstile/',\n )"
ml.link_analysis func_call "ml.link_analysis(.).effective_url.domain.root_domain not in (\n \"zoom.us\",\n \"zoom.com\"\n )"
body.links.href_url.domain.tld macro "body.links[].href_url.domain.tld in suspicious_tlds"
body.links.href_url.domain.tld starts_with "com."
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)
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"
and
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"
body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*"
and
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"
body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*"
and
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"
body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*"
and
any(body.links)
body.links.href_url.url contains "blog.zoom.us"
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*"
and
any(body.links)
body.links.href_url.url contains "blog.zoom.us"
any(body.links)
body.links.href_url.url contains "twitter.com/zoom"
body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*"
and
any(body.links)
body.links.href_url.url contains "blog.zoom.us"
any(body.links)
body.links.href_url.url contains "twitter.com/zoom"
body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*"
and
any(body.links)
body.links.href_url.url contains "blog.zoom.us"
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*"
and
any(body.links)
body.links.href_url.url contains "blog.zoom.us"
body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*"
body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*"
and
any(body.links)
body.links.href_url.url contains "blog.zoom.us"
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*"
and
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*"
and
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/*/twitter.png*"
and
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/*/zoomblog.png*"
and
any(body.links)
body.links.href_url.url contains "linkedin.com/company/zoom-video-communications"
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*"
and
any(body.links)
body.links.href_url.url contains "linkedin.com/company/zoom-video-communications"
body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*"
body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*"
and
any(body.links)
body.links.href_url.url contains "linkedin.com/company/zoom-video-communications"
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*"
and
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*"
and
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/*/zoomblog.png*"
and
any(body.links)
body.links.href_url.url contains "twitter.com/zoom"
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*"
and
any(body.links)
macro "any(ml.nlu_classifier(.display_text).intents,\n .name == \"cred_theft\" and .confidence == \"high\"\n )"
length func_call "length(beta.ml_topic(body.html.display_text).topics) == 1"
macro "all(beta.ml_topic(body.html.display_text).topics,\n .name in (\"Events and Webinars\", \"Software and App Updates\")\n and .confidence != \"low\"\n )"
macro "any(ml.logo_detect(file.message_screenshot()).brands,\n .name == \"Zoom\" and .confidence == \"high\"\n )"
and
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"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" |
Exclusions
The rule actively suppresses these predicates.
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(html.xpath(body.html, '//tr/td[contains(@style, "rgb(11,92,255)")]/h1').nodes, strings.icontains(.display_text, "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
type.inbound eq "true"
macro "any(html.xpath(body.html, '//tr/td[contains(@style, \"rgb(11,92,255)\")]/h1').nodes,\n strings.icontains(.display_text, \"zoom\")\n)"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)) == 1
- sender.email.domain.root_domain in $free_email_providers
- length(recipients.to) == 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"
length func_call "length(distinct(body.current_thread.links, .href_url.url)) == 1"
recipients.to length_compare "1"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in free_email_providers"
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" |
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" |
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([subject.base, body.current_thread.text], strings.icontains(., "zoom"))
- 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") )
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
sender.email.domain.root_domain macro "sender.email.domain.root_domain in free_email_providers"
type.inbound eq "true"
macro "any([subject.base, body.current_thread.text], strings.icontains(., \"zoom\"))"
macro "any(filter(body.current_thread.links,\n strings.icontains(.href_url.url, \"zoom.us\")\n ),\n .href_url.domain.root_domain not in (\"zoom.us\", \"zoom.com\")\n and .display_url.domain.root_domain not in (\"zoom.us\", \"zoom.com\")\n)"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([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}' ) )
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
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"
macro "3 of (\n strings.ilike(body.current_thread.text, '*purchase*'),\n strings.ilike(body.current_thread.text, '*payment*'),\n strings.ilike(body.current_thread.text, '*transaction*'),\n strings.ilike(body.current_thread.text, '*subscription*'),\n strings.ilike(body.current_thread.text, '*antivirus*'),\n strings.ilike(body.current_thread.text, '*order*'),\n strings.ilike(body.current_thread.text, '*support*'),\n strings.ilike(body.current_thread.text, '*help line*'),\n strings.ilike(body.current_thread.text, '*receipt*'),\n strings.ilike(body.current_thread.text, '*invoice*'),\n strings.ilike(body.current_thread.text, '*call*'),\n strings.ilike(body.current_thread.text, '*cancel*'),\n strings.ilike(body.current_thread.text, '*renew*'),\n strings.ilike(body.current_thread.text, '*refund*')\n)"
macro "any([body.current_thread.text, subject.subject],\n regex.icontains(.,\n '\\+?([ilo0-9]{1}.)?\\(?[ilo0-9]{3}?\\)?.[ilo0-9]{3}.?[ilo0-9]{4}',\n '\\+?([ilo0-9]{1,2})?\\s?\\(?\\d{3}\\)?[\\s\\.\\-⋅]{0,5}[ilo0-9]{3}[\\s\\.\\-⋅]{0,5}[ilo0-9]{4}'\n )\n)"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.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" |