Detection rules › Sublime MQL
Sublime MQL rules: spam
Display Name Emoji with Financial Symbols
#Detects messages where the sender's display name contains emoji characters alongside financial symbols ($ £ € ¥ ₿) in the subject line. The sender's domain is not present in the Alexa top 1 million sites and has DMARC authentication issues.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Callback Phishing |
| Tactics and techniques | Social engineering, Evasion |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Check for emoji in sender display name using Unicode ranges
and regex.contains(sender.display_name,
'[\x{1F600}-\x{1F64F}]|[\x{1F300}-\x{1F5FF}]|[\x{1F680}-\x{1F6FF}]|[\x{1F1E0}-\x{1F1FF}]|[\x{2600}-\x{26FF}]|[\x{2700}-\x{27BF}]'
)
// Check for financial symbols in subject
and regex.contains(subject.subject, '[\$£€¥₿]')
and (
headers.auth_summary.dmarc.pass is null
or headers.auth_summary.dmarc.pass == false
)
and sender.email.domain.root_domain not in $alexa_1m
Detection logic
Scope: inbound message.
Detects messages where the sender's display name contains emoji characters alongside financial symbols ($ £ € ¥ ₿) in the subject line. The sender's domain is not present in the Alexa top 1 million sites and has DMARC authentication issues.
- inbound message
- sender.display_name 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}]'
- subject.subject matches '[\\$£€¥₿]'
any of:
- headers.auth_summary.dmarc.pass is missing
- headers.auth_summary.dmarc.pass is False
- sender.email.domain.root_domain not in $alexa_1m
Inspects: headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: regex.contains. Reference lists: $alexa_1m.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
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}] |
regex.contains | regex | [\$£€¥₿] |
Stages and Predicates
Stage 1: mql_rule
and
or
headers.auth_summary.dmarc.pass eq "false"
headers.auth_summary.dmarc.pass is_null
sender.display_name 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}]"
subject.subject regex_match "[\\$£€¥₿]"
type.inbound eq "true"
macro "sender.email.domain.root_domain not in alexa_1m"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq |
| field:"headers.auth_summary.dmarc.pass" kind:eq value:"false" |
headers.auth_summary.dmarc.pass | is_null | field:"headers.auth_summary.dmarc.pass" kind:is_null | |
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match value:"[$£€¥₿]" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Link: Spam website with evasion indicators
#Detects messages containing links to spam websites that show signs of evasion techniques, including blocklisted IP provider messages or rate limiting responses when analyzed.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Evasion |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// single meaningful root domain in links
and length(filter(distinct(body.links, .href_url.domain.root_domain),
// filter out unrelated domains
.href_url.domain.root_domain != sender.email.domain.root_domain
and any(recipients.to,
.email.domain.root_domain != ..href_url.domain.root_domain
)
and .href_url.domain.root_domain not in ("aka.ms")
)
) == 1
// specific spam website pattern
and any(body.links,
// did not redirect to any other domain
ml.link_analysis(.).effective_url.domain.domain == .href_url.domain.domain
and (
// LinkAnalysis was "evaded"
any(ml.link_analysis(.).effective_url.query_params_decoded["q"],
strings.icontains(., "IP provider is blacklisted!")
)
// or we encountered the rate limiting
or ml.link_analysis(.).final_dom.inner_text == "Too Many Requests!"
)
)
Detection logic
Scope: inbound message.
Detects messages containing links to spam websites that show signs of evasion techniques, including blocklisted IP provider messages or rate limiting responses when analyzed.
- inbound message
- length(filter(distinct(body.links, .href_url.domain.root_domain), .href_url.domain.root_domain != sender.email.domain.root_domain and any(recipients.to, .email.domain.root_domain != ..href_url.domain.root_domain) and .href_url.domain.root_domain not in ('aka.ms'))) is 1
any of
body.linkswhere all hold:- ml.link_analysis(.).effective_url.domain.domain is .href_url.domain.domain
any of:
any of
ml.link_analysis(.).effective_url.query_params_decoded['q']where:- . contains 'IP provider is blacklisted!'
- ml.link_analysis(.).final_dom.inner_text is 'Too Many Requests!'
Inspects: body.links, body.links[].href_url.domain.domain, body.links[].href_url.domain.root_domain, recipients.to, recipients.to[].email.domain.root_domain, sender.email.domain.root_domain, type.inbound. Sensors: ml.link_analysis, strings.icontains.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | IP provider is blacklisted! |
Stages and Predicates
Stage 1: mql_rule
and
any(body.links)
and
or
any(ml.link_analysis(body.links).effective_url.query_params_decoded['q'])
ml.link_analysis(body.links).effective_url.query_params_decoded['q'] contains "IP provider is blacklisted!"
ml.link_analysis func_call "ml.link_analysis(body.links[]).final_dom.inner_text == Too Many Requests!"
ml.link_analysis func_call "ml.link_analysis(body.links[]).effective_url.domain.domain == body.links[].href_url.domain.domain"
filter(distinct(body.links, .href_url.domain.root_domain), .href_url.domain.root_domain != sender.email.domain.root_domain and any(recipients.to, .email.domain.root_domain != ..href_url.domain.root_domain) and .href_url.domain.root_domain not in ('aka.ms')) length_compare "1"
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" |
Spam: Attendee list solicitation
#This rule detects messages claiming to have the attendee list from a specific event, they may list various information such as the number of contacts, the demographic and sample contacts. The messages typically offer to send pricing information upon request.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(body.current_thread.text) < 2000
and length(body.links) < 5
and any(ml.nlu_classifier(coalesce(body.html.display_text, body.plain.raw)).topics,
.name in ("Contact List Solicitation", "B2B Cold Outreach")
and .confidence in ("medium", "high")
)
and (
(
(
any([subject.subject, body.current_thread.text],
(
regex.icontains(.,
'(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Store|Grocer|Lead)(?:[[:punct:]]*s)?(?:\s\w*){0,9}(?:\blist(?:\b|[^ei])|database)'
)
and not (
regex.icount(.,
'(email|contact)(?:[[:punct:]]*s)?(?:\s\w*){0,9}list'
) == 1
and regex.icontains(.,
'(?:unsub|remove|safe|delete|leave|update|part of|be added|safe)[[:punct:]]*s?(?:\s\w*){0,9}(mailing|email|my|sender)(?:\s\w*){0,9}list(?:\b|[^ei])',
'email list(?:\b|[^ei])[[:punct:]]*s?(\s\w*){0,5}(?:unsub|remove|safe|delete|leave|up to date|part of|be added)'
)
)
)
or regex.icontains(.,
'\b(?:list|database)(?:[[:punct:]]*s)?\b(\s\w*){0,9}(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Store|Grocer)s?'
)
)
)
and (
regex.icontains(body.current_thread.text,
"(?:interest(s|ed)|accessing|purchas|obtain|acuir|sample|provide.{0,10}samples|counts|pricing)"
)
or any(body.previous_threads,
regex.icontains(.text,
"(?:interest(s|ed)|accessing|purchas|obtain|acuir|sample|provide.{0,10}samples|counts|pricing)"
)
)
)
and not regex.icontains(body.current_thread.text,
"(?:debit card|transaction.{0,20}processed)"
)
)
// if there are indicators of a previous thread, also inspect the previous thread
or (
// contains references to the previous thread
2 of (
regex.icontains(body.current_thread.text, '(?:get|got|had) a chance'),
regex.icontains(body.current_thread.text, '(take|move)(\Wthis)?\Wforward'),
regex.icontains(body.current_thread.text,
'(review|drop me a line about) (my|this|it)'
),
regex.icontains(body.current_thread.text, 'missed it( the)? first time'),
regex.icontains(body.current_thread.text,
'(?:below|previous(ly)?|last|prior|earlier) (message|email|sent)'
),
regex.icontains(body.current_thread.text,
// "the email I sent you earlier"
'(e?mail|message).{0,20}(sent).{0,20}(?:below|previous(ly)?|last|prior|earlier)'
),
regex.icontains(body.current_thread.text,
'(sent).{0,50}(e?mail|message) (?:below|previous(ly)?|last|prior|earlier)'
),
regex.icontains(body.current_thread.text, 'follow(?:ing)?(-| )up'),
regex.icontains(body.current_thread.text, '(?:contact|attendee)s? list'),
regex.icontains(body.current_thread.text, '(any|get an) update.{0,50}\?'),
regex.icontains(body.current_thread.text, '(heard?|circling) back'),
strings.icontains(body.current_thread.text, 'recently sent'),
strings.icontains(body.current_thread.text, 'still interested'),
regex.icontains(body.current_thread.text,
'did you (get|receive) (it|my (message|e?mail))'
),
regex.icontains(body.current_thread.text, '(swift|quick|short) response'),
regex.icontains(body.current_thread.text, 'kindly.{0,30}.interested'),
)
and any([body.html.display_text, body.plain.raw],
(
3 of (
strings.icontains(., "from:"),
strings.icontains(., "to:"),
strings.icontains(., "sent:"),
strings.icontains(., "date:"),
strings.icontains(., "cc:"),
strings.icontains(., "subject:"),
strings.icontains(., "--Original Message--")
)
or strings.icontains(.,
strings.concat(sender.display_name,
" <",
sender.email.email,
"> wrote:"
)
)
)
// match _after_ the previous thread indciators
and (
regex.icontains(.,
'(?:from|to|sent|date|cc|subject|wrote):(.|\W)*(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Mailing)(?:[[:punct:]]*s)?(?:\s\w*){0,9}(?:list(?:\b|[^ei])|database)'
)
or regex.icontains(.,
'(?:from|to|sent|date|cc|subject|wrote):(.|\W)*(?:list(?:\b|[^ei])|database)(?:[[:punct:]]*s)?(\s\w*){0,9}(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Mailing)s?'
)
or (
2 of (
strings.icontains(., "provide counts"),
regex.icontains(., "(?:verified|fresh) data"),
strings.icontains(., "precise targeting"),
strings.icontains(., "deliverability"),
regex.icontains(., "target (verticals|regions|criteria)")
)
and regex.icontains(., '(?:list(?:\b|[^ei])|database)')
)
)
)
)
)
// negate Zendesk support tickets
and not any(body.links,
.href_url.domain.root_domain in ('zendesk.com')
and .display_text == 'Zendesk'
)
and not profile.by_sender().solicited
and not profile.by_sender().any_messages_benign
Detection logic
Scope: inbound message.
This rule detects messages claiming to have the attendee list from a specific event, they may list various information such as the number of contacts, the demographic and sample contacts. The messages typically offer to send pricing information upon request.
- inbound message
- length(body.current_thread.text) < 2000
- length(body.links) < 5
any of
ml.nlu_classifier(coalesce(body.html.display_text, body.plain.raw)).topicswhere all hold:- .name in ('Contact List Solicitation', 'B2B Cold Outreach')
- .confidence in ('medium', 'high')
any of:
all of:
any of
[subject.subject, body.current_thread.text]where any holds:all of:
- . matches '(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Store|Grocer|Lead)(?:[[:punct:]]*s)?(?:\\s\\w*){0,9}(?:\\blist(?:\\b|[^ei])|database)'
not:
all of:
- regex.icount(., '(email|contact)(?:[[:punct:]]*s)?(?:\\s\\w*){0,9}list') is 1
. matches any of 2 patterns
(?:unsub|remove|safe|delete|leave|update|part of|be added|safe)[[:punct:]]*s?(?:\s\w*){0,9}(mailing|email|my|sender)(?:\s\w*){0,9}list(?:\b|[^ei])email list(?:\b|[^ei])[[:punct:]]*s?(\s\w*){0,5}(?:unsub|remove|safe|delete|leave|up to date|part of|be added)
- . matches '\\b(?:list|database)(?:[[:punct:]]*s)?\\b(\\s\\w*){0,9}(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Store|Grocer)s?'
any of:
- body.current_thread.text matches '(?:interest(s|ed)|accessing|purchas|obtain|acuir|sample|provide.{0,10}samples|counts|pricing)'
any of
body.previous_threadswhere:- .text matches '(?:interest(s|ed)|accessing|purchas|obtain|acuir|sample|provide.{0,10}samples|counts|pricing)'
not:
- body.current_thread.text matches '(?:debit card|transaction.{0,20}processed)'
all of:
at least 2 of:
- body.current_thread.text matches '(?:get|got|had) a chance'
- body.current_thread.text matches '(take|move)(\\Wthis)?\\Wforward'
- body.current_thread.text matches '(review|drop me a line about) (my|this|it)'
- body.current_thread.text matches 'missed it( the)? first time'
- body.current_thread.text matches '(?:below|previous(ly)?|last|prior|earlier) (message|email|sent)'
- body.current_thread.text matches '(e?mail|message).{0,20}(sent).{0,20}(?:below|previous(ly)?|last|prior|earlier)'
- body.current_thread.text matches '(sent).{0,50}(e?mail|message) (?:below|previous(ly)?|last|prior|earlier)'
- body.current_thread.text matches 'follow(?:ing)?(-| )up'
- body.current_thread.text matches '(?:contact|attendee)s? list'
- body.current_thread.text matches '(any|get an) update.{0,50}\\?'
- body.current_thread.text matches '(heard?|circling) back'
- body.current_thread.text contains 'recently sent'
- body.current_thread.text contains 'still interested'
- body.current_thread.text matches 'did you (get|receive) (it|my (message|e?mail))'
- body.current_thread.text matches '(swift|quick|short) response'
- body.current_thread.text matches 'kindly.{0,30}.interested'
any of
[body.html.display_text, body.plain.raw]where all hold:any of:
at least 3 of 7: . contains any of 7 patterns
from:to:sent:date:cc:subject:--Original Message--
- strings.icontains(.)
any of:
- . matches '(?:from|to|sent|date|cc|subject|wrote):(.|\\W)*(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Mailing)(?:[[:punct:]]*s)?(?:\\s\\w*){0,9}(?:list(?:\\b|[^ei])|database)'
- . matches '(?:from|to|sent|date|cc|subject|wrote):(.|\\W)*(?:list(?:\\b|[^ei])|database)(?:[[:punct:]]*s)?(\\s\\w*){0,9}(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Mailing)s?'
all of:
at least 2 of:
- . contains 'provide counts'
- . matches '(?:verified|fresh) data'
- . contains 'precise targeting'
- . contains 'deliverability'
- . matches 'target (verticals|regions|criteria)'
- . matches '(?:list(?:\\b|[^ei])|database)'
not:
any of
body.linkswhere all hold:- .href_url.domain.root_domain in ('zendesk.com')
- .display_text is 'Zendesk'
not:
- profile.by_sender().solicited
not:
- profile.by_sender().any_messages_benign
Inspects: body.current_thread.text, body.html.display_text, body.links, body.links[].display_text, body.links[].href_url.domain.root_domain, body.plain.raw, body.previous_threads, body.previous_threads[].text, sender.display_name, sender.email.email, subject.subject, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender, regex.icontains, regex.icount, strings.concat, strings.icontains.
Indicators matched (38)
| Field | Match | Value |
|---|---|---|
ml.nlu_classifier(coalesce(body.html.display_text, body.plain.raw)).topics[].name | member | Contact List Solicitation |
ml.nlu_classifier(coalesce(body.html.display_text, body.plain.raw)).topics[].name | member | B2B Cold Outreach |
ml.nlu_classifier(coalesce(body.html.display_text, body.plain.raw)).topics[].confidence | member | medium |
ml.nlu_classifier(coalesce(body.html.display_text, body.plain.raw)).topics[].confidence | member | high |
regex.icontains | regex | (?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Store|Grocer|Lead)(?:[[:punct:]]*s)?(?:\s\w*){0,9}(?:\blist(?:\b|[^ei])|database) |
regex.icontains | regex | \b(?:list|database)(?:[[:punct:]]*s)?\b(\s\w*){0,9}(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Store|Grocer)s? |
regex.icontains | regex | (?:interest(s|ed)|accessing|purchas|obtain|acuir|sample|provide.{0,10}samples|counts|pricing) |
regex.icontains | regex | (?:get|got|had) a chance |
regex.icontains | regex | (take|move)(\Wthis)?\Wforward |
regex.icontains | regex | (review|drop me a line about) (my|this|it) |
regex.icontains | regex | missed it( the)? first time |
regex.icontains | regex | (?:below|previous(ly)?|last|prior|earlier) (message|email|sent) |
26 more
regex.icontains | regex | (e?mail|message).{0,20}(sent).{0,20}(?:below|previous(ly)?|last|prior|earlier) |
regex.icontains | regex | (sent).{0,50}(e?mail|message) (?:below|previous(ly)?|last|prior|earlier) |
regex.icontains | regex | follow(?:ing)?(-| )up |
regex.icontains | regex | (?:contact|attendee)s? list |
regex.icontains | regex | (any|get an) update.{0,50}\? |
regex.icontains | regex | (heard?|circling) back |
strings.icontains | substring | recently sent |
strings.icontains | substring | still interested |
regex.icontains | regex | did you (get|receive) (it|my (message|e?mail)) |
regex.icontains | regex | (swift|quick|short) response |
regex.icontains | regex | kindly.{0,30}.interested |
strings.icontains | substring | from: |
strings.icontains | substring | to: |
strings.icontains | substring | sent: |
strings.icontains | substring | date: |
strings.icontains | substring | cc: |
strings.icontains | substring | subject: |
strings.icontains | substring | --Original Message-- |
regex.icontains | regex | (?:from|to|sent|date|cc|subject|wrote):(.|\W)*(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Mailing)(?:[[:punct:]]*s)?(?:\s\w*){0,9}(?:list(?:\b|[^ei])|database) |
regex.icontains | regex | (?:from|to|sent|date|cc|subject|wrote):(.|\W)*(?:list(?:\b|[^ei])|database)(?:[[:punct:]]*s)?(\s\w*){0,9}(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Mailing)s? |
strings.icontains | substring | provide counts |
regex.icontains | regex | (?:verified|fresh) data |
strings.icontains | substring | precise targeting |
strings.icontains | substring | deliverability |
regex.icontains | regex | target (verticals|regions|criteria) |
regex.icontains | regex | (?:list(?:\b|[^ei])|database) |
Stages and Predicates
Stage 1: mql_rule
and
or
and
any([subject.subject, body.current_thread.text])
or
and
not
and
or
[subject.subject, body.current_thread.text] regex_match "(?:unsub|remove|safe|delete|leave|update|part of|be added|safe)[[:punct:]]*s?(?:\\s\\w*){0,9}(mailing|email|my|sender)(?:\\s\\w*){0,9}list(?:\\b|[^ei])"
[subject.subject, body.current_thread.text] regex_match "email list(?:\\b|[^ei])[[:punct:]]*s?(\\s\\w*){0,5}(?:unsub|remove|safe|delete|leave|up to date|part of|be added)"
regex.icount func_call "regex.icount([subject.subject, body.current_thread.text][], \"(email|contact)(?:[[:punct:]]*s)?(?:\\s\\w*){0,9}list\") == 1"
[subject.subject, body.current_thread.text] regex_match "(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Store|Grocer|Lead)(?:[[:punct:]]*s)?(?:\\s\\w*){0,9}(?:\\blist(?:\\b|[^ei])|database)"
[subject.subject, body.current_thread.text] regex_match "\\b(?:list|database)(?:[[:punct:]]*s)?\\b(\\s\\w*){0,9}(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Store|Grocer)s?"
or
any(body.previous_threads)
body.previous_threads.text regex_match "(?:interest(s|ed)|accessing|purchas|obtain|acuir|sample|provide.{0,10}samples|counts|pricing)"
body.current_thread.text regex_match "(?:interest(s|ed)|accessing|purchas|obtain|acuir|sample|provide.{0,10}samples|counts|pricing)"
not
body.current_thread.text regex_match "(?:debit card|transaction.{0,20}processed)"
and
any([body.html.display_text, body.plain.raw])
and
or
and
or
[body.html.display_text, body.plain.raw] contains "deliverability"
[body.html.display_text, body.plain.raw] contains "precise targeting"
[body.html.display_text, body.plain.raw] contains "provide counts"
[body.html.display_text, body.plain.raw] regex_match "(?:verified|fresh) data"
[body.html.display_text, body.plain.raw] regex_match "target (verticals|regions|criteria)"
[body.html.display_text, body.plain.raw] regex_match "(?:list(?:\\b|[^ei])|database)"
[body.html.display_text, body.plain.raw] regex_match "(?:from|to|sent|date|cc|subject|wrote):(.|\\W)*(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Mailing)(?:[[:punct:]]*s)?(?:\\s\\w*){0,9}(?:list(?:\\b|[^ei])|database)"
[body.html.display_text, body.plain.raw] regex_match "(?:from|to|sent|date|cc|subject|wrote):(.|\\W)*(?:list(?:\\b|[^ei])|database)(?:[[:punct:]]*s)?(\\s\\w*){0,9}(?:Attendee|Buyer|Contact|Decision Maker|Email|Member|Participant|Professional|Registrant|User|Visitor|Mailing)s?"
or
[body.html.display_text, body.plain.raw] contains "--Original Message--"
[body.html.display_text, body.plain.raw] contains "cc:"
[body.html.display_text, body.plain.raw] contains "date:"
[body.html.display_text, body.plain.raw] contains "from:"
[body.html.display_text, body.plain.raw] contains "sent:"
[body.html.display_text, body.plain.raw] contains "subject:"
[body.html.display_text, body.plain.raw] contains "to:"
strings.icontains func_call "strings.icontains([body.html.display_text, body.plain.raw][])"
or
body.current_thread.text contains "recently sent"
body.current_thread.text contains "still interested"
body.current_thread.text regex_match "(?:below|previous(ly)?|last|prior|earlier) (message|email|sent)"
body.current_thread.text regex_match "(?:contact|attendee)s? list"
body.current_thread.text regex_match "(?:get|got|had) a chance"
body.current_thread.text regex_match "(any|get an) update.{0,50}\\?"
body.current_thread.text regex_match "(e?mail|message).{0,20}(sent).{0,20}(?:below|previous(ly)?|last|prior|earlier)"
body.current_thread.text regex_match "(heard?|circling) back"
body.current_thread.text regex_match "(review|drop me a line about) (my|this|it)"
body.current_thread.text regex_match "(sent).{0,50}(e?mail|message) (?:below|previous(ly)?|last|prior|earlier)"
body.current_thread.text regex_match "(swift|quick|short) response"
body.current_thread.text regex_match "(take|move)(\\Wthis)?\\Wforward"
body.current_thread.text regex_match "did you (get|receive) (it|my (message|e?mail))"
body.current_thread.text regex_match "follow(?:ing)?(-| )up"
body.current_thread.text regex_match "kindly.{0,30}.interested"
body.current_thread.text regex_match "missed it( the)? first time"
not
any(body.links)
and
body.links.display_text eq "Zendesk"
body.links.href_url.domain.root_domain eq "zendesk.com"
any(ml.nlu_classifier(coalesce(body.html.display_text, body.plain.raw)).topics)
and
ml.nlu_classifier(coalesce(body.html.display_text, body.plain.raw)).topics.confidence in ["high", "medium"]
ml.nlu_classifier(coalesce(body.html.display_text, body.plain.raw)).topics.name in ["B2B Cold Outreach", "Contact List Solicitation"]
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
not
profile.by_sender func_call "profile.by_sender().solicited"
body.current_thread.text length_compare "2000"
body.links length_compare "5"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
body.links | array_any | excludes:body.links |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: BlackBaud infrastructure abuse
#Malvertising campaign has been observed abusing a compromised account with BlackBaud. These campaigns have been leveraging brands like Disney+, Netflix, Paramount+, Peacock, UPS, and impersonating the likeness of Elon Musk.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Evasion, Impersonation: Brand, Image as content, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and regex.imatch(sender.email.email, 'communications[a-z]{4,}@.+')
and any(headers.hops, any(.fields, strings.ilike(.name, "x-campaignid")))
and any(headers.domains, strings.contains(.domain, "blackbaud.com"))
and regex.imatch(subject.subject, 'RE\s?:.*')
and (length(headers.references) == 0 or headers.in_reply_to is null)
and any(body.links, .display_text is null)
Detection logic
Scope: inbound message.
Malvertising campaign has been observed abusing a compromised account with BlackBaud. These campaigns have been leveraging brands like Disney+, Netflix, Paramount+, Peacock, UPS, and impersonating the likeness of Elon Musk.
- inbound message
- sender.email.email matches 'communications[a-z]{4,}@.+'
any of
headers.hopswhere:any of
.fieldswhere:- .name matches 'x-campaignid'
any of
headers.domainswhere:- .domain contains 'blackbaud.com'
- subject.subject matches 'RE\\s?:.*'
any of:
- length(headers.references) is 0
- headers.in_reply_to is missing
any of
body.linkswhere:- .display_text is missing
Inspects: body.links, body.links[].display_text, headers.domains, headers.domains[].domain, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.in_reply_to, headers.references, sender.email.email, subject.subject, type.inbound. Sensors: regex.imatch, strings.contains, strings.ilike.
Indicators matched (4)
| Field | Match | Value |
|---|---|---|
regex.imatch | regex | communications[a-z]{4,}@.+ |
strings.ilike | substring | x-campaignid |
strings.contains | substring | blackbaud.com |
regex.imatch | regex | RE\s?:.* |
Stages and Predicates
Stage 1: mql_rule
and
any(headers.hops)
any(headers.hops.fields)
headers.hops.fields.name eq "x-campaignid"
any(body.links)
body.links.display_text is_null
any(headers.domains)
headers.domains.domain contains "blackbaud.com"
or
headers.in_reply_to is_null
headers.references length_compare "0"
sender.email.email regex_match "communications[a-z]{4,}@.+"
subject.subject regex_match "RE\\s?:.*"
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.email.email | regex_match |
| field:"sender.email.email" kind:regex_match value:"communications[a-z]{4,}@.+" |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match value:"RE\s?:.*" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Campaign with excessive display-text and keywords found
#Detects affiliate marketing spam where any link contains display-text greater than 3000 chars and specific values found.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(body.links) > 0
and any(body.links, length(.display_text) > 3000)
and any(body.links,
regex.icontains(.display_text, '(\bPassword:)', 'Hi.{0,5}Welcome\b')
)
and (
profile.by_sender().prevalence in ("new", "outlier")
or (
profile.by_sender().any_messages_malicious_or_spam
and not profile.by_sender().any_messages_benign
)
)
Detection logic
Scope: inbound message.
Detects affiliate marketing spam where any link contains display-text greater than 3000 chars and specific values found.
- inbound message
- length(body.links) > 0
any of
body.linkswhere:- length(.display_text) > 3000
any of
body.linkswhere:.display_text matches any of 2 patterns
(\bPassword:)Hi.{0,5}Welcome\b
any of:
- profile.by_sender().prevalence in ('new', 'outlier')
all of:
- profile.by_sender().any_messages_malicious_or_spam
not:
- profile.by_sender().any_messages_benign
Inspects: body.links, body.links[].display_text, type.inbound. Sensors: profile.by_sender, regex.icontains.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | (\bPassword:) |
regex.icontains | regex | Hi.{0,5}Welcome\b |
Stages and Predicates
Stage 1: mql_rule
and
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"
profile.by_sender func_call "profile.by_sender().prevalence in (new, outlier)"
any(body.links)
or
body.links.display_text regex_match "(\\bPassword:)"
body.links.display_text regex_match "Hi.{0,5}Welcome\\b"
any(body.links)
body.links.display_text length_compare "3000"
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" |
Spam: Campaign with excessive space/char obfuscation and free file hosted link
#This rule detects mass spam campaigns using excessive space padding with links utilizing free file hosting.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Free file host |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(attachments) == 0
and regex.icontains(coalesce(body.html.inner_text, body.html.display_text),
'([a-zA-Z\d\.]\s){30,}'
)
and any(body.links,
.href_url.domain.domain in $free_file_hosts
or .href_url.domain.root_domain in $free_file_hosts
)
and (
profile.by_sender().prevalence in ("new", "outlier")
or profile.by_sender().any_messages_malicious_or_spam
or sender.email.domain.valid == false
)
and not profile.by_sender().any_messages_benign
Detection logic
Scope: inbound message.
This rule detects mass spam campaigns using excessive space padding with links utilizing free file hosting.
- inbound message
- length(attachments) is 0
- coalesce(body.html.inner_text, body.html.display_text) matches '([a-zA-Z\\d\\.]\\s){30,}'
any of
body.linkswhere any holds:- .href_url.domain.domain in $free_file_hosts
- .href_url.domain.root_domain in $free_file_hosts
any of:
- profile.by_sender().prevalence in ('new', 'outlier')
- profile.by_sender().any_messages_malicious_or_spam
- sender.email.domain.valid is False
not:
- profile.by_sender().any_messages_benign
Inspects: body.html.display_text, body.html.inner_text, body.links, body.links[].href_url.domain.domain, body.links[].href_url.domain.root_domain, sender.email.domain.valid, type.inbound. Sensors: profile.by_sender, regex.icontains. Reference lists: $free_file_hosts.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | ([a-zA-Z\d\.]\s){30,} |
Stages and Predicates
Stage 1: mql_rule
and
any(body.links)
or
macro "body.links[].href_url.domain.domain in free_file_hosts"
macro "body.links[].href_url.domain.root_domain in free_file_hosts"
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
or
profile.by_sender func_call "profile.by_sender().any_messages_malicious_or_spam"
profile.by_sender func_call "profile.by_sender().prevalence in (new, outlier)"
sender.email.domain.valid eq "false"
attachments length_compare "0"
coalesce(body.html.inner_text, body.html.display_text) regex_match "([a-zA-Z\\d\\.]\\s){30,}"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
Spam: Cold outreach from Cloudflare-hosted newly registered domain
#Flags inbound messages from sender domains that were registered fewer than 365 days ago and use exactly two Cloudflare name servers with subdomains ending in '.ns'. The rule further requires that the subject or body text be classified as B2B cold outreach by the NLU model, indicating abuse of Cloudflare's free DNS infrastructure to rapidly stand up new domains for outreach-style spam.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Evasion, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// newly registered sender domain
and network.whois(sender.email.domain).days_old < 365
// there are 2 name servers which have subdomains ending with .ns
and length(network.whois(sender.email.domain).name_servers) == 2
and all(network.whois(sender.email.domain).name_servers,
strings.iends_with(.subdomain, '.ns')
and .root_domain == 'cloudflare.com'
)
and any(ml.nlu_classifier(body.current_thread.text).topics,
.name == 'B2B Cold Outreach'
)
Detection logic
Scope: inbound message.
Flags inbound messages from sender domains that were registered fewer than 365 days ago and use exactly two Cloudflare name servers with subdomains ending in '.ns'. The rule further requires that the subject or body text be classified as B2B cold outreach by the NLU model, indicating abuse of Cloudflare's free DNS infrastructure to rapidly stand up new domains for outreach-style spam.
- inbound message
- network.whois(sender.email.domain).days_old < 365
- length(network.whois(sender.email.domain).name_servers) is 2
all of
network.whois(sender.email.domain).name_serverswhere all hold:- .subdomain ends with '.ns'
- .root_domain is 'cloudflare.com'
any of
ml.nlu_classifier(body.current_thread.text).topicswhere:- .name is 'B2B Cold Outreach'
Inspects: body.current_thread.text, sender.email.domain, type.inbound. Sensors: ml.nlu_classifier, network.whois, strings.iends_with.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
strings.iends_with | suffix | .ns |
network.whois(sender.email.domain).name_servers[].root_domain | equals | cloudflare.com |
ml.nlu_classifier(body.current_thread.text).topics[].name | equals | B2B Cold Outreach |
Stages and Predicates
Stage 1: mql_rule
and
any(ml.nlu_classifier(body.current_thread.text).topics)
ml.nlu_classifier(body.current_thread.text).topics.name eq "B2B Cold Outreach"
network.whois func_call "network.whois(sender.email.domain).days_old < 365"
network.whois(sender.email.domain).name_servers length_compare "2"
type.inbound eq "true"
macro "all(network.whois(sender.email.domain).name_servers)"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Commonly observed formatting of unauthorized free giveaways
#Detects commonly observed formatting of unauthorized giveaways, free tools, and products by multiple different brands.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | 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 (
(
any(html.xpath(body.html, "//div[contains(@style, 'BACKGROUND: URL')]").nodes,
.raw is not null
)
)
or (
any(body.links,
any([
"blob.core.windows.net",
"click.email.formula1.com",
"firmy-praha.eu"
],
..href_url.domain.domain == .
or strings.ends_with(..href_url.domain.domain, .)
)
)
)
)
and (
(
// subject has # plus random characters only
regex.icontains(subject.base, "#[a-z0-9]{5,}?")
// plus one of these
and (
// display name has a # + random characters only
regex.icontains(sender.display_name, "#[a-z0-9]{5,}?")
// subject starts with a period (yes, both subject cases should be true)
or strings.starts_with(subject.base, ".")
// Display name contains at least 2 emojis
or length(distinct(map(regex.extract(sender.display_name,
'(?P<emoji>[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}])'
),
.full_match
)
)
) >= 2
)
)
or (
// Subject contains at least 2 emojias
length(distinct(map(regex.extract(subject.base,
'(?P<emoji>[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}])'
),
.full_match
)
)
) >= 2
)
or
// another variant with different strings that have numbers but the same pattern is in both subject and displayname
(
// subject has # plus random characters & numbers
regex.icontains(subject.base, "#[1-9a-z]+")
// plus one of these
and (
regex.icontains(sender.display_name, "#[1-9a-z]+")
or strings.icontains(sender.display_name, "rewards")
)
)
or (
// or prornotions (promotions) once confusables are stripped in subject
strings.icontains(strings.replace_confusables(subject.base), "prornotions")
// and rewards in display name
and strings.icontains(sender.display_name, "rewards")
)
or (
// subject has * plus 4 random characters and numbers *
regex.icontains(subject.base, '\*[1-9a-z]{4,}\*')
// same with the display name
and regex.icontains(sender.display_name, '\*[1-9a-z]{4,}\*')
)
or (
// subject and display name has two *
strings.count(subject.base, "*") == 2
and strings.count(sender.display_name, "*") == 2
)
or (
// subject has string of random characters and numbers
// checking if string has 1 uppercase, 1 lowercase and 1 number
any(regex.extract(subject.base, '(?:-{1,2}|\s)([a-zA-Z0-9]{11,})'),
regex.contains(.full_match, '[A-Z]')
and regex.contains(.full_match, '[a-z]')
and regex.contains(.full_match, '[0-9]')
// some matches are legit but they are 35+ characters
and length(.full_match) <= 30
)
// negating support thread email subjects containg multiple : in their IDs
and not regex.count(subject.base, ':') > 5
)
)
Detection logic
Scope: inbound message.
Detects commonly observed formatting of unauthorized giveaways, free tools, and products by multiple different brands.
- inbound message
any of:
any of
html.xpath(body.html, "//div[contains(@style, 'BACKGROUND: URL')]").nodeswhere:- .raw is set
any of
body.linkswhere:any of
['blob.core.windows.net', 'click.email.formula1.com', 'firmy-praha.eu']where any holds:- .href_url.domain.domain is .
- strings.ends_with(.href_url.domain.domain)
any of:
all of:
- subject.base matches '#[a-z0-9]{5,}?'
any of:
- sender.display_name matches '#[a-z0-9]{5,}?'
- subject.base starts with '.'
- length(distinct(map(regex.extract(sender.display_name, '(?P<emoji>[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}])'), .full_match))) ≥ 2
- length(distinct(map(regex.extract(subject.base, '(?P<emoji>[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}])'), .full_match))) ≥ 2
all of:
- subject.base matches '#[1-9a-z]+'
any of:
- sender.display_name matches '#[1-9a-z]+'
- sender.display_name contains 'rewards'
all of:
- strings.replace_confusables(subject.base) contains 'prornotions'
- sender.display_name contains 'rewards'
all of:
- subject.base matches '\\*[1-9a-z]{4,}\\*'
- sender.display_name matches '\\*[1-9a-z]{4,}\\*'
all of:
- strings.count(subject.base, '*') is 2
- strings.count(sender.display_name, '*') is 2
all of:
any of
regex.extract(subject.base)where all hold:- .full_match matches '[A-Z]'
- .full_match matches '[a-z]'
- .full_match matches '[0-9]'
- length(.full_match) ≤ 30
not:
- regex.count(subject.base, ':') > 5
Inspects: body.html, body.links, body.links[].href_url.domain.domain, sender.display_name, subject.base, type.inbound. Sensors: html.xpath, regex.contains, regex.count, regex.extract, regex.icontains, strings.count, strings.ends_with, strings.icontains, strings.replace_confusables, strings.starts_with.
Indicators matched (11)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | #[a-z0-9]{5,}? |
strings.starts_with | prefix | . |
regex.extract | regex | (?P<emoji>[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]) |
regex.icontains | regex | #[1-9a-z]+ |
strings.icontains | substring | rewards |
strings.icontains | substring | prornotions |
regex.icontains | regex | \*[1-9a-z]{4,}\* |
regex.extract | regex | (?:-{1,2}|\s)([a-zA-Z0-9]{11,}) |
regex.contains | regex | [A-Z] |
regex.contains | regex | [a-z] |
regex.contains | regex | [0-9] |
Stages and Predicates
Stage 1: mql_rule
and
or
any(body.links)
any(['blob.core.windows.net', 'click.email.formula1.com', 'firmy-praha.eu'])
or
body.links.href_url.domain.domain cross_field_compare "['blob.core.windows.net', 'click.email.formula1.com', 'firmy-praha.eu']"
strings.ends_with func_call "strings.ends_with(body.links[].href_url.domain.domain)"
any(html.xpath(body.html, "//div[contains(@style, 'BACKGROUND: URL')]").nodes)
html.xpath(body.html, "//div[contains(@style, 'BACKGROUND: URL')]").nodes.raw is_not_null
or
and
any(regex.extract(subject.base))
and
regex.extract(subject.base).full_match length_compare "30"
regex.extract(subject.base).full_match regex_match "[0-9]"
regex.extract(subject.base).full_match regex_match "[A-Z]"
regex.extract(subject.base).full_match regex_match "[a-z]"
not
regex.count func_call "regex.count(subject.base, \":\") > 5"
and
or
distinct(map(regex.extract(sender.display_name, '(?P<emoji>[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}])'), .full_match)) length_compare "2"
sender.display_name regex_match "#[a-z0-9]{5,}?"
subject.base starts_with "."
subject.base regex_match "#[a-z0-9]{5,}?"
and
or
sender.display_name contains "rewards"
sender.display_name regex_match "#[1-9a-z]+"
subject.base regex_match "#[1-9a-z]+"
and
sender.display_name contains "rewards"
strings.replace_confusables(subject.base) contains "prornotions"
and
sender.display_name regex_match "\\*[1-9a-z]{4,}\\*"
subject.base regex_match "\\*[1-9a-z]{4,}\\*"
and
strings.count func_call "strings.count(sender.display_name, \"*\") == 2"
strings.count func_call "strings.count(subject.base, \"*\") == 2"
distinct(map(regex.extract(subject.base, '(?P<emoji>[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}])'), .full_match)) length_compare "2"
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:"rewards" |
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match |
strings.replace_confusables(subject.base) | contains |
| field:"strings.replace_confusables(subject.base)" kind:contains value:"prornotions" |
subject.base | regex_match |
| field:"subject.base" kind:regex_match |
subject.base | starts_with |
| field:"subject.base" kind:starts_with value:"." |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Cryptocurrency airdrop/giveaway
#Detects messages promoting cryptocurrency airdrops, token claims, or wallet-related rewards.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Social engineering, Impersonation: Brand |
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).topics,
.name in ("Financial Communications")
)
and not any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
'Newsletters and Digests',
'News and Current Events',
'Legal and Compliance'
)
)
and not any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "benign" and .confidence == "high"
)
// action word
and (
strings.ilike(subject.base, '*airdrop*')
or strings.like(body.current_thread.text, '*airdrop*')
or strings.ilike(subject.base, '*giveaway*')
or strings.like(body.current_thread.text, '*giveaway*')
or regex.icontains(body.current_thread.text, 'receive \$\d{2,5} worth')
or regex.icontains(body.current_thread.text,
'claim your (allocation|airdrop|bonus|share|\$\d{2,5})'
)
or regex.icontains(body.current_thread.text, 'connect .{0,20} wallet')
)
and not regex.icontains(body.current_thread.text, '\$\d{2,4} (off|cash)')
and (
// crypto keyword
regex.icontains(body.current_thread.text,
'\bmetamask\b',
'\bethereum\b',
'\bbinance\b',
'\bgemini\b',
'\bwallet\b',
'\bkraken\b',
'\bsolana\b',
'\btrezor\b',
'\bledger\b'
)
// token name, e.g. $USDT
or regex.contains(body.current_thread.text, '\s\$[A-Z]{3,4}\s')
)
and not (
sender.email.domain.root_domain in (
"gemini.com",
"ledger.com",
"binance.com",
"trezor.io",
"kraken.com",
"solana.com",
"metamask.com",
"ethereum.org",
"bloomberg.com"
)
and headers.auth_summary.dmarc.pass
)
Detection logic
Scope: inbound message.
Detects messages promoting cryptocurrency airdrops, token claims, or wallet-related rewards.
- inbound message
any of
ml.nlu_classifier(body.current_thread.text).topicswhere:- .name in ('Financial Communications')
not:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere:- .name in ('Newsletters and Digests', 'News and Current Events', 'Legal and Compliance')
not:
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name is 'benign'
- .confidence is 'high'
any of:
- subject.base matches '*airdrop*'
- body.current_thread.text matches '*airdrop*'
- subject.base matches '*giveaway*'
- body.current_thread.text matches '*giveaway*'
- body.current_thread.text matches 'receive \\$\\d{2,5} worth'
- body.current_thread.text matches 'claim your (allocation|airdrop|bonus|share|\\$\\d{2,5})'
- body.current_thread.text matches 'connect .{0,20} wallet'
not:
- body.current_thread.text matches '\\$\\d{2,4} (off|cash)'
any of:
body.current_thread.text matches any of 9 patterns
\bmetamask\b\bethereum\b\bbinance\b\bgemini\b\bwallet\b\bkraken\b\bsolana\b\btrezor\b\bledger\b
- body.current_thread.text matches '\\s\\$[A-Z]{3,4}\\s'
not:
all of:
- sender.email.domain.root_domain in ('gemini.com', 'ledger.com', 'binance.com', 'trezor.io', 'kraken.com', 'solana.com', 'metamask.com', 'ethereum.org', 'bloomberg.com')
- headers.auth_summary.dmarc.pass
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, subject.base, type.inbound. Sensors: ml.nlu_classifier, regex.contains, regex.icontains, strings.ilike, strings.like.
Indicators matched (18)
| Field | Match | Value |
|---|---|---|
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Financial Communications |
strings.ilike | substring | *airdrop* |
strings.like | substring | *airdrop* |
strings.ilike | substring | *giveaway* |
strings.like | substring | *giveaway* |
regex.icontains | regex | receive \$\d{2,5} worth |
regex.icontains | regex | claim your (allocation|airdrop|bonus|share|\$\d{2,5}) |
regex.icontains | regex | connect .{0,20} wallet |
regex.icontains | regex | \bmetamask\b |
regex.icontains | regex | \bethereum\b |
regex.icontains | regex | \bbinance\b |
regex.icontains | regex | \bgemini\b |
6 more
regex.icontains | regex | \bwallet\b |
regex.icontains | regex | \bkraken\b |
regex.icontains | regex | \bsolana\b |
regex.icontains | regex | \btrezor\b |
regex.icontains | regex | \bledger\b |
regex.contains | regex | \s\$[A-Z]{3,4}\s |
Stages and Predicates
Stage 1: mql_rule
and
not
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "benign"
not
and
headers.auth_summary.dmarc.pass eq "true"
sender.email.domain.root_domain in ["binance.com", "bloomberg.com", "ethereum.org", "gemini.com", "kraken.com", "ledger.com", "metamask.com", "solana.com", "trezor.io"]
not
any(ml.nlu_classifier(body.current_thread.text).topics)
ml.nlu_classifier(body.current_thread.text).topics.name in ["Legal and Compliance", "News and Current Events", "Newsletters and Digests"]
or
body.current_thread.text match "airdrop"
body.current_thread.text match "giveaway"
body.current_thread.text regex_match "claim your (allocation|airdrop|bonus|share|\\$\\d{2,5})"
body.current_thread.text regex_match "connect .{0,20} wallet"
body.current_thread.text regex_match "receive \\$\\d{2,5} worth"
subject.base match "airdrop"
subject.base match "giveaway"
not
body.current_thread.text regex_match "\\$\\d{2,4} (off|cash)"
or
body.current_thread.text regex_match "\\bbinance\\b"
body.current_thread.text regex_match "\\bethereum\\b"
body.current_thread.text regex_match "\\bgemini\\b"
body.current_thread.text regex_match "\\bkraken\\b"
body.current_thread.text regex_match "\\bledger\\b"
body.current_thread.text regex_match "\\bmetamask\\b"
body.current_thread.text regex_match "\\bsolana\\b"
body.current_thread.text regex_match "\\btrezor\\b"
body.current_thread.text regex_match "\\bwallet\\b"
body.current_thread.text regex_match "\\s\\$[A-Z]{3,4}\\s"
any(ml.nlu_classifier(body.current_thread.text).topics)
ml.nlu_classifier(body.current_thread.text).topics.name eq "Financial Communications"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
ml.nlu_classifier(body.current_thread.text).intents | array_any | excludes:ml.nlu_classifier(body.current_thread.text).intents | |
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 | binance.com, bloomberg.com, ethereum.org, gemini.com, kraken.com, ledger.com, metamask.com, solana.com, trezor.io | excludes:sender.email.domain.root_domain |
ml.nlu_classifier(body.current_thread.text).topics | array_any | excludes:ml.nlu_classifier(body.current_thread.text).topics | |
body.current_thread.text | regex_match | $\d{2,4} (off|cash) | excludes:body.current_thread.text field:"body.current_thread.text" value:"$\d{2,4} (off|cash)" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
body.current_thread.text | wildcard |
| field:"body.current_thread.text" kind:wildcard |
subject.base | wildcard |
| field:"subject.base" kind:wildcard |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Default Microsoft Exchange Online sender domain (onmicrosoft.com)
#The default Microsoft Exchange Online sender domain, onmicrosoft.com, is commonly used to send unwanted and malicious email. Enable this rule in your environment if receiving email from the onmicrosoft.com domain is unexpected behaviour.
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 (
sender.email.domain.root_domain == "onmicrosoft.com"
or (
strings.icontains(sender.display_name, "onmicrosoft.com")
and sender.email.domain.valid == false
)
)
and length(recipients.to) < 2
and length(body.links) > 0
// bounce-back negations
and not strings.like(sender.email.local_part,
"*postmaster*",
"*mailer-daemon*",
"*administrator*"
)
and not any(attachments,
.content_type in (
"message/rfc822",
"message/delivery-status",
"text/calendar"
)
or (.content_type == "text/plain" and .file_extension == "ics")
)
// negating legit replies
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 auto-replies
and not (
any(headers.hops,
any(.fields, .name =~ "auto-submitted" and .value =~ "auto-generated")
and any(.fields,
.name =~ "X-MS-Exchange-Generated-Message-Source"
and .value not in ("Antispam Quarantine Agent")
)
)
)
// Microsoft has some legit onmicrosoft domains...
and not (
sender.email.domain.domain == "microsoft.onmicrosoft.com"
and headers.auth_summary.spf.pass
and all(body.links, .href_url.domain.root_domain == "microsoft.com")
)
// negate legitimate microsoft b2b applications invitations
and not (
length(body.links) > 0
and (
sender.email.local_part == "invites"
and sender.email.domain.root_domain == "onmicrosoft.com"
// infra validated message id
and strings.icontains(headers.message_id, "pepf")
)
)
// construct the proper sender domain and check against known recipients
and not strings.concat(sender.email.domain.subdomain,
".",
sender.email.domain.tld
) in $recipient_domains
// sender profiles
and (
not profile.by_sender().solicited
or (
profile.by_sender().any_messages_malicious_or_spam
and not profile.by_sender().any_messages_benign
)
)
// negate org domains
and not (
sender.email.domain.domain in $org_domains
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
The default Microsoft Exchange Online sender domain, onmicrosoft.com, is commonly used to send unwanted and malicious email. Enable this rule in your environment if receiving email from the onmicrosoft.com domain is unexpected behaviour.
- inbound message
any of:
- sender.email.domain.root_domain is 'onmicrosoft.com'
all of:
- sender.display_name contains 'onmicrosoft.com'
- sender.email.domain.valid is False
- length(recipients.to) < 2
- length(body.links) > 0
not:
sender.email.local_part matches any of 3 patterns
*postmaster**mailer-daemon**administrator*
not:
any of
attachmentswhere any holds:- .content_type in ('message/rfc822', 'message/delivery-status', 'text/calendar')
all of:
- .content_type is 'text/plain'
- .file_extension is 'ics'
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:
any of
headers.hopswhere all hold:any of
.fieldswhere all hold:- .name is 'auto-submitted'
- .value is 'auto-generated'
any of
.fieldswhere all hold:- .name is 'X-MS-Exchange-Generated-Message-Source'
- .value not in ('Antispam Quarantine Agent')
not:
all of:
- sender.email.domain.domain is 'microsoft.onmicrosoft.com'
- headers.auth_summary.spf.pass
all of
body.linkswhere:- .href_url.domain.root_domain is 'microsoft.com'
not:
all of:
- length(body.links) > 0
all of:
- sender.email.local_part is 'invites'
- sender.email.domain.root_domain is 'onmicrosoft.com'
- headers.message_id contains 'pepf'
not:
- strings.concat(sender.email.domain.subdomain, '.') in $recipient_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:
all of:
- sender.email.domain.domain in $org_domains
- coalesce(headers.auth_summary.dmarc.pass)
Inspects: attachments[].content_type, attachments[].file_extension, body.links, body.links[].href_url.domain.root_domain, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, headers.in_reply_to, headers.message_id, headers.references, recipients.to, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, sender.email.domain.subdomain, sender.email.domain.tld, sender.email.domain.valid, sender.email.local_part, subject.subject, type.inbound. Sensors: profile.by_sender, regex.imatch, strings.concat, strings.icontains, strings.istarts_with, strings.like. Reference lists: $org_domains, $recipient_domains.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
sender.email.domain.root_domain | equals | onmicrosoft.com |
strings.icontains | substring | onmicrosoft.com |
headers.hops[].fields[].value | member | Antispam Quarantine Agent |
Stages and Predicates
Stage 1: mql_rule
and
not
any(headers.hops)
and
any(headers.hops.fields)
and
not
headers.hops.fields[].value eq "Antispam Quarantine Agent"
headers.hops.fields[].name eq "X-MS-Exchange-Generated-Message-Source"
any(headers.hops.fields)
and
headers.hops.fields[].name eq "auto-submitted"
headers.hops.fields[].value eq "auto-generated"
not
any(attachments)
or
and
attachments.content_type eq "text/plain"
attachments.file_extension eq "ics"
attachments.content_type in ["message/delivery-status", "message/rfc822", "text/calendar"]
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
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
body.links length_compare "0"
headers.message_id contains "pepf"
sender.email.domain.root_domain eq "onmicrosoft.com"
sender.email.local_part eq "invites"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
macro "sender.email.domain.domain in org_domains"
not
and
headers.auth_summary.spf.pass eq "true"
sender.email.domain.domain eq "microsoft.onmicrosoft.com"
macro "all(body.links)"
or
and
sender.display_name contains "onmicrosoft.com"
sender.email.domain.valid eq "false"
sender.email.domain.root_domain eq "onmicrosoft.com"
not
or
sender.email.local_part match "administrator"
sender.email.local_part match "mailer-daemon"
sender.email.local_part match "postmaster"
not
strings.concat func_call "strings.concat(sender.email.domain.subdomain, \".\") in recipient_domains"
body.links length_compare "0"
recipients.to length_compare "2"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
Indicators
These rows show field, operator, and value matches.
Spam: Fake dating profile notification
#Detects dating-themed messages from free email providers containing links with the recipient's email address embedded in URL parameters, combined with suspicious language or topics in the message body.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Free email provider, Social engineering |
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
// not a reply
and length(headers.references) == 0
and 0 < length(distinct(body.current_thread.links, .href_url.domain.root_domain)
) <= 3
and any(body.links,
(
any(values(.href_url.query_params_decoded),
any(.,
strings.parse_email(.).email in map(recipients.to,
.email.email
)
)
)
)
or regex.icontains(.display_text,
'(?:(open|view|read|private).{0,15}message)'
)
or any([.href_url.path, .display_text],
any((ml.nlu_classifier(.).topics),
.name in ("Romance", "Sexually Explicit Messages")
)
)
// visit the URL and check the effecitve url
or any(values(ml.link_analysis(.).effective_url.query_params_decoded),
any(.,
strings.parse_email(.).email in map(recipients.to,
.email.email
)
)
)
)
and (
any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "org"
and strings.ilike(.text,
"*Flirt*",
"*Singles*",
"*Date*",
"*Dating*",
"*Girls*",
"*Love*",
"*Hook*up*"
)
)
or any(ml.nlu_classifier(body.current_thread.text).topics, .name == "Romance")
)
Detection logic
Scope: inbound message.
Detects dating-themed messages from free email providers containing links with the recipient's email address embedded in URL parameters, combined with suspicious language or topics in the message body.
- inbound message
- sender.email.domain.root_domain in $free_email_providers
- length(headers.references) is 0
all of:
- length(distinct(body.current_thread.links, .href_url.domain.root_domain)) > 0
- length(distinct(body.current_thread.links, .href_url.domain.root_domain)) ≤ 3
any of
body.linkswhere any holds:any of
values(.href_url.query_params_decoded)where:any of
.where:- strings.parse_email(.).email in map(recipients.to, .email.email)
- .display_text matches '(?:(open|view|read|private).{0,15}message)'
any of
[.href_url.path, .display_text]where:any of
ml.nlu_classifier(.).topicswhere:- .name in ('Romance', 'Sexually Explicit Messages')
any of
values(...)where:any of
.where:- strings.parse_email(.).email in map(recipients.to, .email.email)
any of:
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name is 'org'
.text matches any of 7 patterns
*Flirt**Singles**Date**Dating**Girls**Love**Hook*up*
any of
ml.nlu_classifier(body.current_thread.text).topicswhere:- .name is 'Romance'
Inspects: body.current_thread.links, body.current_thread.links[].href_url.domain.root_domain, body.current_thread.text, body.links, body.links[].display_text, body.links[].href_url.path, body.links[].href_url.query_params_decoded, headers.references, recipients.to, recipients.to[].email.email, sender.email.domain.root_domain, type.inbound. Sensors: ml.link_analysis, ml.nlu_classifier, regex.icontains, strings.ilike, strings.parse_email. Reference lists: $free_email_providers.
Indicators matched (12)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | (?:(open|view|read|private).{0,15}message) |
ml.nlu_classifier([body.links[].href_url.path, body.links[].display_text][]).topics[].name | member | Romance |
ml.nlu_classifier([body.links[].href_url.path, body.links[].display_text][]).topics[].name | member | Sexually Explicit Messages |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | org |
strings.ilike | substring | *Flirt* |
strings.ilike | substring | *Singles* |
strings.ilike | substring | *Date* |
strings.ilike | substring | *Dating* |
strings.ilike | substring | *Girls* |
strings.ilike | substring | *Love* |
strings.ilike | substring | *Hook*up* |
ml.nlu_classifier(body.current_thread.text).topics[].name | equals | Romance |
Stages and Predicates
Stage 1: mql_rule
and
any(body.links)
or
any([body.links.href_url.path, body.links.display_text])
any(ml.nlu_classifier([body.links.href_url.path, body.links.display_text]).topics)
ml.nlu_classifier([body.links.href_url.path, body.links.display_text]).topics.name in ["Romance", "Sexually Explicit Messages"]
any(values(...))
any(values(...))
strings.parse_email func_call "strings.parse_email(values(...)[][]).email in map(recipients.to, values(...)[][].email.email)"
any(values(body.links.href_url.query_params_decoded))
any(values(body.links.href_url.query_params_decoded))
strings.parse_email func_call "strings.parse_email(values(body.links[].href_url.query_params_decoded)[][]).email in map(recipients.to, values(body.links[].href_url.query_params_decoded)[][].email.email)"
body.links.display_text regex_match "(?:(open|view|read|private).{0,15}message)"
or
any(ml.nlu_classifier(body.current_thread.text).entities)
and
or
ml.nlu_classifier(body.current_thread.text).entities.text match "Date"
ml.nlu_classifier(body.current_thread.text).entities.text match "Dating"
ml.nlu_classifier(body.current_thread.text).entities.text match "Flirt"
ml.nlu_classifier(body.current_thread.text).entities.text match "Girls"
ml.nlu_classifier(body.current_thread.text).entities.text match "Love"
ml.nlu_classifier(body.current_thread.text).entities.text match "Singles"
ml.nlu_classifier(body.current_thread.text).entities.text wildcard "*Hook*up*"
ml.nlu_classifier(body.current_thread.text).entities.name eq "org"
any(ml.nlu_classifier(body.current_thread.text).topics)
ml.nlu_classifier(body.current_thread.text).topics.name eq "Romance"
distinct(body.current_thread.links, .href_url.domain.root_domain) length_compare "0"
distinct(body.current_thread.links, .href_url.domain.root_domain) length_compare "3"
headers.references length_compare "0"
type.inbound eq "true"
macro "sender.email.domain.root_domain in free_email_providers"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Firebase password reset from suspicious sender
#Detects Firebase password reset messages from suspicious or new senders that may be attempting to abuse the Firebase authentication service.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, Spam |
| Tactics and techniques | Evasion, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and sender.email.domain.root_domain == "firebaseapp.com"
and length(filter(body.links,
.href_url.domain.root_domain not in ("aka.ms")
and .href_url.path is not null
)
) == 1
and any(body.links,
.href_url.domain.domain == sender.email.domain.domain
and .href_url.path == "/__/auth/action"
and any(.href_url.query_params_decoded["mode"], . == "resetPassword")
)
and (
(
not profile.by_sender().solicited
and profile.by_sender().prevalence == "new"
)
or (
profile.by_sender().any_messages_malicious_or_spam
and not profile.by_sender().any_messages_benign
)
or not headers.auth_summary.dmarc.pass
)
Detection logic
Scope: inbound message.
Detects Firebase password reset messages from suspicious or new senders that may be attempting to abuse the Firebase authentication service.
- inbound message
- sender.email.domain.root_domain is 'firebaseapp.com'
- length(filter(body.links, .href_url.domain.root_domain not in ('aka.ms') and .href_url.path is not null)) is 1
any of
body.linkswhere all hold:- .href_url.domain.domain is sender.email.domain.domain
- .href_url.path is '/__/auth/action'
any of
.href_url.query_params_decoded['mode']where:- . is 'resetPassword'
any of:
all of:
not:
- profile.by_sender().solicited
- profile.by_sender().prevalence is 'new'
all of:
- profile.by_sender().any_messages_malicious_or_spam
not:
- profile.by_sender().any_messages_benign
not:
- headers.auth_summary.dmarc.pass
Inspects: body.links, body.links[].href_url.domain.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.links[].href_url.query_params_decoded['mode'], headers.auth_summary.dmarc.pass, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: profile.by_sender.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
sender.email.domain.root_domain | equals | firebaseapp.com |
body.links[].href_url.path | equals | /__/auth/action |
body.links[].href_url.query_params_decoded['mode'][] | equals | resetPassword |
Stages and Predicates
Stage 1: mql_rule
and
any(body.links)
and
any(body.links.href_url.query_params_decoded['mode'])
body.links.href_url.query_params_decoded['mode'] eq "resetPassword"
body.links.href_url.domain.domain cross_field_compare "sender.email.domain.domain"
body.links.href_url.path eq "/__/auth/action"
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 == new"
not
headers.auth_summary.dmarc.pass eq "true"
filter(body.links, .href_url.domain.root_domain not in ('aka.ms') and .href_url.path is not null) length_compare "1"
sender.email.domain.root_domain eq "firebaseapp.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.email.domain.root_domain | eq |
| field:"sender.email.domain.root_domain" kind:eq value:"firebaseapp.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Ghostwriting services scam with manipulative language
#Detects unsolicited messages promoting ghostwriting or book publishing services that use manipulative language patterns commonly seen in scams, such as offering complimentary samples, expressing fascination with the recipient's achievements, or requesting personal information under the guise of writing assistance.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(body.current_thread.text) < 1500
and (
// Ghostwriting and book-related terms in subject
strings.icontains(subject.subject, "book project")
or strings.icontains(subject.subject, "ghostwriting")
or strings.icontains(subject.subject, "becoming an author")
or strings.icontains(subject.subject, "your book")
or strings.icontains(subject.subject, "writing project")
or strings.icontains(subject.subject, "publish")
or strings.icontains(subject.subject, " author ")
// Body contains ghostwriting service offers
or strings.icontains(body.current_thread.text, "ghostwriting")
or strings.icontains(body.current_thread.text, "ghostwriter")
or strings.icontains(body.current_thread.text, "writing firm")
or strings.icontains(body.current_thread.text, "book writing")
or strings.icontains(body.current_thread.text, "publishing")
)
// Common scam language patterns
and (
(
strings.icontains(body.current_thread.text, "complimentary")
and (
strings.icontains(body.current_thread.text, "sample")
or strings.icontains(body.current_thread.text, "chapter")
or strings.icontains(body.current_thread.text, "consultation")
)
)
or (
strings.icontains(body.current_thread.text, "fascinated")
and strings.icontains(body.current_thread.text, "what you have done")
)
or strings.icontains(body.current_thread.text, "inspiring stories")
or strings.icontains(body.current_thread.text, "gather some information")
or strings.icontains(body.current_thread.text, "few minutes of your time")
or strings.icontains(body.current_thread.text, "absolutely no obligation")
or strings.icontains(body.current_thread.text, "writing team")
)
and not (
any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Newsletters and Digests",
"Events and Webinars",
"Educational and Research",
"Financial Communications",
"Advertising and Promotions",
"Legal and Compliance",
"Professional and Career Development"
)
and .confidence == "high"
)
)
// Standard negations
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 unsolicited messages promoting ghostwriting or book publishing services that use manipulative language patterns commonly seen in scams, such as offering complimentary samples, expressing fascination with the recipient's achievements, or requesting personal information under the guise of writing assistance.
- inbound message
- length(body.current_thread.text) < 1500
any of:
- subject.subject contains 'book project'
- subject.subject contains 'ghostwriting'
- subject.subject contains 'becoming an author'
- subject.subject contains 'your book'
- subject.subject contains 'writing project'
- subject.subject contains 'publish'
- subject.subject contains ' author '
- body.current_thread.text contains 'ghostwriting'
- body.current_thread.text contains 'ghostwriter'
- body.current_thread.text contains 'writing firm'
- body.current_thread.text contains 'book writing'
- body.current_thread.text contains 'publishing'
any of:
all of:
- body.current_thread.text contains 'complimentary'
any of:
- body.current_thread.text contains 'sample'
- body.current_thread.text contains 'chapter'
- body.current_thread.text contains 'consultation'
all of:
- body.current_thread.text contains 'fascinated'
- body.current_thread.text contains 'what you have done'
- body.current_thread.text contains 'inspiring stories'
- body.current_thread.text contains 'gather some information'
- body.current_thread.text contains 'few minutes of your time'
- body.current_thread.text contains 'absolutely no obligation'
- body.current_thread.text contains 'writing team'
not:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Newsletters and Digests', 'Events and Webinars', 'Educational and Research', 'Financial Communications', 'Advertising and Promotions', 'Legal and Compliance', 'Professional and Career Development')
- .confidence is 'high'
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, subject.subject, type.inbound. Sensors: ml.nlu_classifier, strings.icontains. Reference lists: $high_trust_sender_root_domains.
Indicators matched (22)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | book project |
strings.icontains | substring | ghostwriting |
strings.icontains | substring | becoming an author |
strings.icontains | substring | your book |
strings.icontains | substring | writing project |
strings.icontains | substring | publish |
strings.icontains | substring | author |
strings.icontains | substring | ghostwriter |
strings.icontains | substring | writing firm |
strings.icontains | substring | book writing |
strings.icontains | substring | publishing |
strings.icontains | substring | complimentary |
10 more
strings.icontains | substring | sample |
strings.icontains | substring | chapter |
strings.icontains | substring | consultation |
strings.icontains | substring | fascinated |
strings.icontains | substring | what you have done |
strings.icontains | substring | inspiring stories |
strings.icontains | substring | gather some information |
strings.icontains | substring | few minutes of your time |
strings.icontains | substring | absolutely no obligation |
strings.icontains | substring | writing team |
Stages and Predicates
Stage 1: mql_rule
and
or
and
or
body.current_thread.text contains "chapter"
body.current_thread.text contains "consultation"
body.current_thread.text contains "sample"
body.current_thread.text contains "complimentary"
and
body.current_thread.text contains "fascinated"
body.current_thread.text contains "what you have done"
body.current_thread.text contains "absolutely no obligation"
body.current_thread.text contains "few minutes of your time"
body.current_thread.text contains "gather some information"
body.current_thread.text contains "inspiring stories"
body.current_thread.text contains "writing team"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
not
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).topics.name in ["Advertising and Promotions", "Educational and Research", "Events and Webinars", "Financial Communications", "Legal and Compliance", "Newsletters and Digests", "Professional and Career Development"]
or
body.current_thread.text contains "book writing"
body.current_thread.text contains "ghostwriter"
body.current_thread.text contains "ghostwriting"
body.current_thread.text contains "publishing"
body.current_thread.text contains "writing firm"
subject.subject contains " author "
subject.subject contains "becoming an author"
subject.subject contains "book project"
subject.subject contains "ghostwriting"
subject.subject contains "publish"
subject.subject contains "writing project"
subject.subject contains "your book"
body.current_thread.text length_compare "1500"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
ml.nlu_classifier(body.current_thread.text).topics | array_any | excludes:ml.nlu_classifier(body.current_thread.text).topics |
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 |
subject.subject | contains |
| field:"subject.subject" kind:contains |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Item giveaway spam template
#This detection rule matches on observed html templates impersonating multiple popular brands used to deliver spam. Often the lure leverages a theme of item giveaways or a chance to win an item for completing a survey.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Image as content |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (not profile.by_sender().solicited or sender.email.email == "")
// not high trust sender 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 regex.icontains(body.html.raw,
'<(?:div|body)[^\>]*\>\s*<a href=(?:\x22[^\>]+)\>\s*[^\n]*<br>\s*<img src=(?:\x22[^\>]+)\>\s*\<img src=(?:\x22[^\>]+)\><\/a>\s*<br>\s*<a href=(?:\x22[^\>]+)\>\s*\<img src=(?:\x22[^\>]+)\>\s*\<img src=(?:\x22[^\>]+)\><\/a>\s*<br>',
'<center>(?:<[^\>]+>)*<a href=(?:\x22[^\>]+)\>\s*[^\n]*<img src=(?:\x22[^\>]+)\>\s*\<img src=(?:\x22[^\>]+)\>\s*<br>\s*\<img src=(?:\x22[^\>]+)\><\/a>'
)
Detection logic
Scope: inbound message.
This detection rule matches on observed html templates impersonating multiple popular brands used to deliver spam. Often the lure leverages a theme of item giveaways or a chance to win an item for completing a survey.
- inbound message
any of:
not:
- profile.by_sender().solicited
- sender.email.email is ''
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
body.html.raw matches any of 2 patterns
<(?:div|body)[^\>]*\>\s*<a href=(?:\x22[^\>]+)\>\s*[^\n]*<br>\s*<img src=(?:\x22[^\>]+)\>\s*\<img src=(?:\x22[^\>]+)\><\/a>\s*<br>\s*<a href=(?:\x22[^\>]+)\>\s*\<img src=(?:\x22[^\>]+)\>\s*\<img src=(?:\x22[^\>]+)\><\/a>\s*<br><center>(?:<[^\>]+>)*<a href=(?:\x22[^\>]+)\>\s*[^\n]*<img src=(?:\x22[^\>]+)\>\s*\<img src=(?:\x22[^\>]+)\>\s*<br>\s*\<img src=(?:\x22[^\>]+)\><\/a>
Inspects: body.html.raw, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, sender.email.email, type.inbound. Sensors: profile.by_sender, regex.icontains. Reference lists: $high_trust_sender_root_domains.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | |
regex.icontains | regex | <(?:div|body)[^\>]*\>\s*<a href=(?:\x22[^\>]+)\>\s*[^\n]*<br>\s*<img src=(?:\x22[^\>]+)\>\s*\<img src=(?:\x22[^\>]+)\><\/a>\s*<br>\s*<a href=(?:\x22[^\>]+)\>\s*\<img src=(?:\x22[^\>]+)\>\s*\<img src=(?:\x22[^\>]+)\><\/a>\s*<br> |
regex.icontains | regex | <center>(?:<[^\>]+>)*<a href=(?:\x22[^\>]+)\>\s*[^\n]*<img src=(?:\x22[^\>]+)\>\s*\<img src=(?:\x22[^\>]+)\>\s*<br>\s*\<img src=(?:\x22[^\>]+)\><\/a> |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
not
profile.by_sender func_call "profile.by_sender().solicited"
sender.email.email eq ""
or
body.html.raw regex_match "<(?:div|body)[^\\>]*\\>\\s*<a href=(?:\\x22[^\\>]+)\\>\\s*[^\\n]*<br>\\s*<img src=(?:\\x22[^\\>]+)\\>\\s*\\<img src=(?:\\x22[^\\>]+)\\><\\/a>\\s*<br>\\s*<a href=(?:\\x22[^\\>]+)\\>\\s*\\<img src=(?:\\x22[^\\>]+)\\>\\s*\\<img src=(?:\\x22[^\\>]+)\\><\\/a>\\s*<br>"
body.html.raw regex_match "<center>(?:<[^\\>]+>)*<a href=(?:\\x22[^\\>]+)\\>\\s*[^\\n]*<img src=(?:\\x22[^\\>]+)\\>\\s*\\<img src=(?:\\x22[^\\>]+)\\>\\s*<br>\\s*\\<img src=(?:\\x22[^\\>]+)\\><\\/a>"
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" |
Spam: Large financial amount mention from newly registered sender domain
#Detects inbound messages from domains less than 180 days old that solicit investment interest from named organizations or individuals on behalf of a purported private family office. Senders use financial-sounding names and rotate first names and target company names while keeping the subject line structure nearly identical. The outreach is designed to appear as a legitimate investment inquiry to bait a response.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Spam |
| Tactics and techniques | Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and network.whois(sender.email.domain).days_old < 180
and any([body.html.display_text, subject.base],
regex.icontains(., '\$\d\p{Pd}\$\d{1,2}(?:m\b|million)')
)
Detection logic
Scope: inbound message.
Detects inbound messages from domains less than 180 days old that solicit investment interest from named organizations or individuals on behalf of a purported private family office. Senders use financial-sounding names and rotate first names and target company names while keeping the subject line structure nearly identical. The outreach is designed to appear as a legitimate investment inquiry to bait a response.
- inbound message
- network.whois(sender.email.domain).days_old < 180
any of
[body.html.display_text, subject.base]where:- . matches '\\$\\d\\p{Pd}\\$\\d{1,2}(?:m\\b|million)'
Inspects: body.html.display_text, sender.email.domain, subject.base, type.inbound. Sensors: network.whois, regex.icontains.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | \$\d\p{Pd}\$\d{1,2}(?:m\b|million) |
Stages and Predicates
Stage 1: mql_rule
and
any([body.html.display_text, subject.base])
[body.html.display_text, subject.base] regex_match "\\$\\d\\p{Pd}\\$\\d{1,2}(?:m\\b|million)"
network.whois func_call "network.whois(sender.email.domain).days_old < 180"
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" |
Spam: Link to blob.core.windows.net from new domain (<30d)
#This rule detects messages containing a link to blob.core.windows.net from a sender domain less than 30 days old. There is a single recipient present, but the recipient is a random email address, and not someone at the organization.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Free subdomain host |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(recipients.to) == 1
and any(recipients.to, .email.domain.root_domain not in $org_domains)
and network.whois(sender.email.domain).days_old < 30
and length(body.links) < 3
and any(body.links,
strings.ends_with(.href_url.domain.subdomain, "blob.core")
and .href_url.domain.root_domain == "windows.net"
)
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.
This rule detects messages containing a link to blob.core.windows.net from a sender domain less than 30 days old. There is a single recipient present, but the recipient is a random email address, and not someone at the organization.
- inbound message
- length(recipients.to) is 1
any of
recipients.towhere:- .email.domain.root_domain not in $org_domains
- network.whois(sender.email.domain).days_old < 30
- length(body.links) < 3
any of
body.linkswhere all hold:- .href_url.domain.subdomain ends with 'blob.core'
- .href_url.domain.root_domain is 'windows.net'
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.links, body.links[].href_url.domain.root_domain, body.links[].href_url.domain.subdomain, recipients.to, recipients.to[].email.domain.root_domain, sender.email.domain, type.inbound. Sensors: network.whois, profile.by_sender, strings.ends_with. Reference lists: $org_domains.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
strings.ends_with | suffix | blob.core |
body.links[].href_url.domain.root_domain | equals | windows.net |
Stages and Predicates
Stage 1: mql_rule
and
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"
any(body.links)
and
body.links.href_url.domain.root_domain eq "windows.net"
body.links.href_url.domain.subdomain ends_with "blob.core"
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
any(recipients.to)
macro "recipients.to[].email.domain.root_domain not in org_domains"
body.links length_compare "3"
network.whois func_call "network.whois(sender.email.domain).days_old < 30"
recipients.to length_compare "1"
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" |
Spam: Mastercard promotional content with image-based body
#Detects messages promoting untrustworthy Mastercard credit cards that contain both financial communications and promotional content topics, with the message body primarily consisting of image content rather than text. Excludes legitimate payment-related Mastercard communications and applies additional scrutiny to high-trust sender domains that fail DMARC authentication.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, Spam |
| Tactics and techniques | Image as content, Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(attachments) == 0
and not subject.is_forward
and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name == "Financial Communications"
)
and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
.name == "Advertising and Promotions"
)
// mastercard mention
and strings.icontains(beta.ocr(file.message_screenshot()).text, "mastercard")
and not strings.icontains(beta.ocr(file.message_screenshot()).text,
"paying with mastercard"
)
// body is image
and (
length(beta.ocr(file.message_screenshot()).text) / length(body.current_thread.text
)
) > 10
and length(body.previous_threads) == 0
// 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 promoting untrustworthy Mastercard credit cards that contain both financial communications and promotional content topics, with the message body primarily consisting of image content rather than text. Excludes legitimate payment-related Mastercard communications and applies additional scrutiny to high-trust sender domains that fail DMARC authentication.
- inbound message
- length(attachments) is 0
not:
- subject.is_forward
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere:- .name is 'Financial Communications'
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topicswhere:- .name is 'Advertising and Promotions'
- beta.ocr(file.message_screenshot()).text contains 'mastercard'
not:
- beta.ocr(file.message_screenshot()).text contains 'paying with mastercard'
- length(beta.ocr(file.message_screenshot()).text) / length(body.current_thread.text) > 10
- length(body.previous_threads) is 0
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.previous_threads, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, subject.is_forward, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.nlu_classifier, strings.icontains. Reference lists: $high_trust_sender_root_domains.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | equals | Financial Communications |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].name | equals | Advertising and Promotions |
strings.icontains | substring | mastercard |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
not
beta.ocr(file.message_screenshot()).text contains "paying with mastercard"
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name eq "Advertising and Promotions"
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name eq "Financial Communications"
not
subject.is_forward eq "true"
attachments length_compare "0"
beta.ocr(file.message_screenshot()).text contains "mastercard"
body.previous_threads length_compare "0"
type.inbound eq "true"
macro "(length(beta.ocr(file.message_screenshot()).text) / length(body.current_thread.text)) > 10"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
beta.ocr(file.message_screenshot()).text | contains | paying with mastercard | excludes:beta.ocr(file.message_screenshot()).text field:"beta.ocr(file.message_screenshot()).text" value:"paying with mastercard" |
subject.is_forward | eq | true | excludes:subject.is_forward field:"subject.is_forward" value:"true" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
beta.ocr(file.message_screenshot()).text | contains |
| field:"beta.ocr(file.message_screenshot()).text" kind:contains value:"mastercard" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: New job cold outreach from unsolicited sender
#Detects unsolicited messages congratulating recipients on new jobs or roles that contain unsubscribe links, calendar booking links, or exhibit B2B cold outreach characteristics from senders who have not been previously contacted.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// direct outreach to sender
and length(recipients.to) == 1
// talking about new job
and any([body.current_thread.text, subject.subject],
regex.icontains(., 'congrat(?:ulation)?s on the new (?:job|gig|role)')
)
// body link to unsubscribe or to book time, otherwise use NLU on the body current thread
and (
any(body.links,
strings.icontains(.href_url.url, "unsubscribe")
or strings.icontains(.href_url.url, "opt-out")
or strings.icontains(.href_url.url, "preferences")
or strings.icontains(.href_url.url, "calendar")
)
or any(ml.nlu_classifier(body.current_thread.text).topics,
.name == "B2B Cold Outreach" and .confidence != "low"
)
)
// not someone they have reached out to before
and not profile.by_sender().solicited
Detection logic
Scope: inbound message.
Detects unsolicited messages congratulating recipients on new jobs or roles that contain unsubscribe links, calendar booking links, or exhibit B2B cold outreach characteristics from senders who have not been previously contacted.
- inbound message
- length(recipients.to) is 1
any of
[body.current_thread.text, subject.subject]where:- . matches 'congrat(?:ulation)?s on the new (?:job|gig|role)'
any of:
any of
body.linkswhere any holds:- .href_url.url contains 'unsubscribe'
- .href_url.url contains 'opt-out'
- .href_url.url contains 'preferences'
- .href_url.url contains 'calendar'
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name is 'B2B Cold Outreach'
- .confidence is not 'low'
not:
- profile.by_sender().solicited
Inspects: body.current_thread.text, body.links, body.links[].href_url.url, recipients.to, subject.subject, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender, regex.icontains, strings.icontains.
Indicators matched (6)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | congrat(?:ulation)?s on the new (?:job|gig|role) |
strings.icontains | substring | unsubscribe |
strings.icontains | substring | opt-out |
strings.icontains | substring | preferences |
strings.icontains | substring | calendar |
ml.nlu_classifier(body.current_thread.text).topics[].name | equals | B2B Cold Outreach |
Stages and Predicates
Stage 1: mql_rule
and
or
any(body.links)
or
body.links.href_url.url contains "calendar"
body.links.href_url.url contains "opt-out"
body.links.href_url.url contains "preferences"
body.links.href_url.url contains "unsubscribe"
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).topics.name eq "B2B Cold Outreach"
any([body.current_thread.text, subject.subject])
[body.current_thread.text, subject.subject] regex_match "congrat(?:ulation)?s on the new (?:job|gig|role)"
not
profile.by_sender func_call "profile.by_sender().solicited"
recipients.to length_compare "1"
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" |
Spam: New link domain (<=10d) and emojis
#Detects spam from freemail senders, where the linked domain is less than 10 days old and emojis present.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Free email provider |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// sender is a freemail
and sender.email.domain.root_domain in $free_email_providers
// linked domain is less than 10 days old
and any(body.links, network.whois(.href_url.domain).days_old < 10)
// has an emoji in the subject or body
and (
regex.contains(body.plain.raw,
'[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]'
)
or regex.contains(subject.subject,
'[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]'
)
)
and (
profile.by_sender().prevalence in ("new", "outlier")
or (
profile.by_sender().any_messages_malicious_or_spam
and not profile.by_sender().any_messages_benign
)
)
Detection logic
Scope: inbound message.
Detects spam from freemail senders, where the linked domain is less than 10 days old and emojis present.
- inbound message
- sender.email.domain.root_domain in $free_email_providers
any of
body.linkswhere:- network.whois(.href_url.domain).days_old < 10
any of:
- body.plain.raw matches '[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]'
- subject.subject matches '[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]'
any of:
- profile.by_sender().prevalence in ('new', 'outlier')
all of:
- profile.by_sender().any_messages_malicious_or_spam
not:
- profile.by_sender().any_messages_benign
Inspects: body.links, body.links[].href_url.domain, body.plain.raw, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: network.whois, profile.by_sender, regex.contains. Reference lists: $free_email_providers.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
regex.contains | regex | [\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}] |
Stages and Predicates
Stage 1: mql_rule
and
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"
profile.by_sender func_call "profile.by_sender().prevalence in (new, outlier)"
or
body.plain.raw regex_match "[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]"
subject.subject regex_match "[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]"
any(body.links)
network.whois func_call "network.whois(body.links[].href_url.domain).days_old < 10"
type.inbound eq "true"
macro "sender.email.domain.root_domain in free_email_providers"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.plain.raw | regex_match |
| field:"body.plain.raw" kind:regex_match value:"[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]" |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match value:"[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Personalized subject and greetings via Salesforce Marketing Cloud
#Detects messages sent through Salesforce Marketing Cloud infrastructure that contain a fake previous email thread, where both the current and previous threads start with the same greeting pattern extracted from the subject line.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// attempt to find SF sending infra
and (
headers.domains[0].root_domain == "exacttarget.com"
or strings.iends_with(headers.message_id, '.xt.local>')
or any(headers.hops,
any(.fields,
.name =~ "X-SFMC-Stack"
or (.name =~ "x-job" and regex.match(.value, '^\d+_\d+$'))
)
)
)
// the message contains a fake previous thread
and length(body.previous_threads) == 1
// extract the name from the subject
and any(regex.iextract(subject.base, '(?:^|: )(?P<first_name>[A-Z][a-z]+)$'),
// the current thread starts with "Hi <extracted from subject>
strings.istarts_with(body.current_thread.text,
strings.concat('Hi ', .named_groups["first_name"])
)
// the previous thread starts with "Hi <extracted from subject>
and any(body.previous_threads,
strings.istarts_with(.text,
strings.concat('Hi ',
..named_groups["first_name"]
)
)
)
)
Detection logic
Scope: inbound message.
Detects messages sent through Salesforce Marketing Cloud infrastructure that contain a fake previous email thread, where both the current and previous threads start with the same greeting pattern extracted from the subject line.
- inbound message
any of:
- headers.domains[0].root_domain is 'exacttarget.com'
- headers.message_id ends with '.xt.local>'
any of
headers.hopswhere:any of
.fieldswhere any holds:- .name is 'X-SFMC-Stack'
all of:
- .name is 'x-job'
- .value matches '^\\d+_\\d+$'
- length(body.previous_threads) is 1
any of
regex.iextract(subject.base)where all hold:- strings.istarts_with(body.current_thread.text)
any of
body.previous_threadswhere:- strings.istarts_with(.text)
Inspects: body.current_thread.text, body.previous_threads, body.previous_threads[].text, headers.domains[0].root_domain, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, headers.message_id, subject.base, type.inbound. Sensors: regex.iextract, regex.match, strings.concat, strings.iends_with, strings.istarts_with.
Indicators matched (6)
| Field | Match | Value |
|---|---|---|
headers.domains[0].root_domain | equals | exacttarget.com |
strings.iends_with | suffix | .xt.local> |
headers.hops[].fields[].name | equals | X-SFMC-Stack |
headers.hops[].fields[].name | equals | x-job |
regex.match | regex | ^\d+_\d+$ |
regex.iextract | regex | (?:^|: )(?P<first_name>[A-Z][a-z]+)$ |
Stages and Predicates
Stage 1: mql_rule
and
or
any(headers.hops)
any(headers.hops.fields)
or
and
headers.hops.fields[].name eq "x-job"
headers.hops.fields[].value regex_match "^\\d+_\\d+$"
headers.hops.fields[].name eq "X-SFMC-Stack"
headers.domains[0].root_domain eq "exacttarget.com"
headers.message_id ends_with ".xt.local>"
any(regex.iextract(subject.base))
and
any(body.previous_threads)
strings.istarts_with func_call "strings.istarts_with(body.previous_threads[].text)"
strings.istarts_with func_call "strings.istarts_with(body.current_thread.text)"
body.previous_threads length_compare "1"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
headers.domains[0].root_domain | eq |
| field:"headers.domains[0].root_domain" kind:eq value:"exacttarget.com" |
headers.message_id | ends_with |
| field:"headers.message_id" kind:ends_with value:".xt.local>" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Sendersrv.com with financial communications and unsubscribe language
#Detects messages from sendersrv.com infrastructure containing unsubscribe language and financial communication topics, indicating potential abuse of the bulk email service for unauthorized financial solicitations.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Evasion, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and any(headers.domains, .root_domain == "sendersrv.com")
and strings.icontains(body.current_thread.text, 'unsubscribe')
and any(ml.nlu_classifier(body.current_thread.text).topics,
.name == "Financial Communications" and .confidence != "low"
)
Detection logic
Scope: inbound message.
Detects messages from sendersrv.com infrastructure containing unsubscribe language and financial communication topics, indicating potential abuse of the bulk email service for unauthorized financial solicitations.
- inbound message
any of
headers.domainswhere:- .root_domain is 'sendersrv.com'
- body.current_thread.text contains 'unsubscribe'
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name is 'Financial Communications'
- .confidence is not 'low'
Inspects: body.current_thread.text, headers.domains, headers.domains[].root_domain, type.inbound. Sensors: ml.nlu_classifier, strings.icontains.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
headers.domains[].root_domain | equals | sendersrv.com |
strings.icontains | substring | unsubscribe |
ml.nlu_classifier(body.current_thread.text).topics[].name | equals | Financial Communications |
Stages and Predicates
Stage 1: mql_rule
and
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).topics.name eq "Financial Communications"
any(headers.domains)
headers.domains.root_domain eq "sendersrv.com"
body.current_thread.text contains "unsubscribe"
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:"unsubscribe" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Sexually explicit content with emoji in subject from freemail provider
#Detects messages from free email providers that contain sexually explicit content and include emojis in the subject line.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Free email provider, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// sender is a freemail domain
and sender.email.domain.root_domain in $free_email_providers
// look for commonly used emojis in sexually explicit messages
and regex.icontains(subject.subject,
'(\x{1F346}|\x{1F608}|\x{1F609}|\x{1F351}|\x{2764}|\x{1F60D}|\x{1F618}|\x{1F48B}|\x{1F63B}|\x{1F445}|\x{1F51E}|\x{1F525}|\x{1F4F7})'
)
and any(ml.nlu_classifier(body.current_thread.text).topics,
.name == 'Sexually Explicit Messages'
)
Detection logic
Scope: inbound message.
Detects messages from free email providers that contain sexually explicit content and include emojis in the subject line.
- inbound message
- sender.email.domain.root_domain in $free_email_providers
- subject.subject matches '(\\x{1F346}|\\x{1F608}|\\x{1F609}|\\x{1F351}|\\x{2764}|\\x{1F60D}|\\x{1F618}|\\x{1F48B}|\\x{1F63B}|\\x{1F445}|\\x{1F51E}|\\x{1F525}|\\x{1F4F7})'
any of
ml.nlu_classifier(body.current_thread.text).topicswhere:- .name is 'Sexually Explicit Messages'
Inspects: body.current_thread.text, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: ml.nlu_classifier, regex.icontains. Reference lists: $free_email_providers.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | (\x{1F346}|\x{1F608}|\x{1F609}|\x{1F351}|\x{2764}|\x{1F60D}|\x{1F618}|\x{1F48B}|\x{1F63B}|\x{1F445}|\x{1F51E}|\x{1F525}|\x{1F4F7}) |
ml.nlu_classifier(body.current_thread.text).topics[].name | equals | Sexually Explicit Messages |
Stages and Predicates
Stage 1: mql_rule
and
any(ml.nlu_classifier(body.current_thread.text).topics)
ml.nlu_classifier(body.current_thread.text).topics.name eq "Sexually Explicit Messages"
subject.subject regex_match "(\\x{1F346}|\\x{1F608}|\\x{1F609}|\\x{1F351}|\\x{2764}|\\x{1F60D}|\\x{1F618}|\\x{1F48B}|\\x{1F63B}|\\x{1F445}|\\x{1F51E}|\\x{1F525}|\\x{1F4F7})"
type.inbound eq "true"
macro "sender.email.domain.root_domain in free_email_providers"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match value:"(\x{1F346}|\x{1F608}|\x{1F609}|\x{1F351}|\x{2764}|\x{1F60D}|\x{1F618}|\x{1F48B}|\x{1F63B}|\x{1F445}|\x{1F51E}|\x{1F525}|\x{1F4F7})" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Sexually explicit Google group invitation
#Detects suspicious Google Groups invitations containing inappropriate content or suspicious patterns. The rule looks for invites from non-organizational domains that contain random alphanumeric strings, explicit keywords, or suspicious call-to-action phrases in the group names or descriptions.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Free email provider, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
//
// Warning: This rule contains sexually explicit keywords
//
and sender.email.email == "noreply@groups.google.com"
and (
strings.istarts_with(subject.base, 'Invitation to join ')
or strings.istarts_with(subject.base, 'You have been added to ')
// the group name contains sexually explicit keywords
// this regex should be kept in sync between the Google Group, Google Drive Share, and Looker Studio rules
or regex.icontains(subject.base,
'(?:Invitation to join|You have been added to) .*(?:sex|horny|cock|fuck|\bass\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\blust\b|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner)'
)
)
// the invite is not from an $org_domain user
and not any($org_domains,
strings.icontains(body.current_thread.text,
strings.concat('@',
.,
' invited you to join the '
)
)
or strings.icontains(body.current_thread.text,
strings.concat('@', ., ' added you to the ')
)
)
and (
// the group name contains 7 char sets at the start and end and must contain a number
regex.icontains(subject.base,
'(?:added to|to join) [A-Z0-9]{5,7} .*(?:[[:^ascii:]]|[[:^alpha:]]) [A-Z0-9]{5,7}$'
)
// calls to action in the group name
or regex.icontains(subject.base,
'(?:added to|to join) .*(join|(?:click|go|tap) here)'
)
// it contains an emoji in the group name
or regex.icontains(subject.base,
'(?:added to|to join) .*[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]'
)
// the description of the group contains sexually explicit keywords
// this regex should be kept in sync between the Google Group and the Looker Studio rules
or regex.icontains(body.current_thread.text,
'(?:about this group|message from).*(?:sex|horny|cock|fuck|\bass\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|lust|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner).*https?://'
)
// the invitor is an email domain which contains 3 labels
or (
regex.icontains(body.current_thread.text,
'\n[^\@]+@(?:[a-zA-Z0-9-]{1,255}\.){2}[a-zA-Z0-9-]{2,255} (?:added you to the|invited you to join the)'
)
// where the group name contains "lists."
and not regex.icontains(body.current_thread.text,
'\n[^\@]+@(?:[a-zA-Z0-9-]{1,255}\.){2}[a-zA-Z0-9-]{2,255} (?:added you to the|invited you to join the) [^\@]+\@lists\.'
)
)
)
Detection logic
Scope: inbound message.
Detects suspicious Google Groups invitations containing inappropriate content or suspicious patterns. The rule looks for invites from non-organizational domains that contain random alphanumeric strings, explicit keywords, or suspicious call-to-action phrases in the group names or descriptions.
- inbound message
- sender.email.email is 'noreply@groups.google.com'
any of:
- subject.base starts with 'Invitation to join '
- subject.base starts with 'You have been added to '
- subject.base matches '(?:Invitation to join|You have been added to) .*(?:sex|horny|cock|fuck|\\bass\\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\\blust\\b|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner)'
not:
any of
$org_domainswhere any holds:- strings.icontains(body.current_thread.text)
- strings.icontains(body.current_thread.text)
any of:
- subject.base matches '(?:added to|to join) [A-Z0-9]{5,7} .*(?:[[:^ascii:]]|[[:^alpha:]]) [A-Z0-9]{5,7}$'
- subject.base matches '(?:added to|to join) .*(join|(?:click|go|tap) here)'
- subject.base matches '(?:added to|to join) .*[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]'
- body.current_thread.text matches '(?:about this group|message from).*(?:sex|horny|cock|fuck|\\bass\\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|lust|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner).*https?://'
all of:
- body.current_thread.text matches '\\n[^\\@]+@(?:[a-zA-Z0-9-]{1,255}\\.){2}[a-zA-Z0-9-]{2,255} (?:added you to the|invited you to join the)'
not:
- body.current_thread.text matches '\\n[^\\@]+@(?:[a-zA-Z0-9-]{1,255}\\.){2}[a-zA-Z0-9-]{2,255} (?:added you to the|invited you to join the) [^\\@]+\\@lists\\.'
Inspects: body.current_thread.text, sender.email.email, subject.base, type.inbound. Sensors: regex.icontains, strings.concat, strings.icontains, strings.istarts_with. Reference lists: $org_domains.
Indicators matched (9)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | noreply@groups.google.com |
strings.istarts_with | prefix | Invitation to join |
strings.istarts_with | prefix | You have been added to |
regex.icontains | regex | (?:Invitation to join|You have been added to) .*(?:sex|horny|cock|fuck|\bass\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\blust\b|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner) |
regex.icontains | regex | (?:added to|to join) [A-Z0-9]{5,7} .*(?:[[:^ascii:]]|[[:^alpha:]]) [A-Z0-9]{5,7}$ |
regex.icontains | regex | (?:added to|to join) .*(join|(?:click|go|tap) here) |
regex.icontains | regex | (?:added to|to join) .*[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}] |
regex.icontains | regex | (?:about this group|message from).*(?:sex|horny|cock|fuck|\bass\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|lust|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner).*https?:// |
regex.icontains | regex | \n[^\@]+@(?:[a-zA-Z0-9-]{1,255}\.){2}[a-zA-Z0-9-]{2,255} (?:added you to the|invited you to join the) |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
body.current_thread.text regex_match "\\n[^\\@]+@(?:[a-zA-Z0-9-]{1,255}\\.){2}[a-zA-Z0-9-]{2,255} (?:added you to the|invited you to join the) [^\\@]+\\@lists\\."
body.current_thread.text regex_match "\\n[^\\@]+@(?:[a-zA-Z0-9-]{1,255}\\.){2}[a-zA-Z0-9-]{2,255} (?:added you to the|invited you to join the)"
body.current_thread.text regex_match "(?:about this group|message from).*(?:sex|horny|cock|fuck|\\bass\\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|lust|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner).*https?://"
subject.base regex_match "(?:added to|to join) .*(join|(?:click|go|tap) here)"
subject.base regex_match "(?:added to|to join) .*[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]"
subject.base regex_match "(?:added to|to join) [A-Z0-9]{5,7} .*(?:[[:^ascii:]]|[[:^alpha:]]) [A-Z0-9]{5,7}$"
not
any($org_domains)
strings.icontains func_call "strings.icontains(body.current_thread.text)"
or
subject.base regex_match "(?:Invitation to join|You have been added to) .*(?:sex|horny|cock|fuck|\\bass\\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\\blust\\b|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner)"
subject.base starts_with "Invitation to join "
subject.base starts_with "You have been added to "
sender.email.email eq "noreply@groups.google.com"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
$org_domains | array_any | excludes:$org_domains |
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.email | eq |
| field:"sender.email.email" kind:eq value:"noreply@groups.google.com" |
subject.base | regex_match |
| field:"subject.base" kind:regex_match |
subject.base | starts_with |
| field:"subject.base" kind:starts_with |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Sexually explicit Looker Studio report
#Detects suspicious Looker Studio Reports which containing inappropriate content or suspicious patterns. The rule looks for reports from non-organizational domains that contain emojis or explicit keywords within the report.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Social engineering, Free email provider |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
//
// Warning: This rule contains sexually explicit keywords
//
and sender.email.email == "looker-studio-noreply@google.com"
// the invite is not from an $org_domain user
and all(headers.reply_to,
.email.domain.domain not in $org_domains
and .email.email not in $recipient_emails
and .email.email not in $sender_emails
)
// the subject or the body contain sexually explicit keywords
and any([subject.subject, body.current_thread.text],
// this regex should be kept in sync between the Google Group, Google Drive Share, and Looker Studio rules
regex.icontains(.,
'(?:sex|horny|cock|fuck|\bass\b|pussy|dick|tits|cum\b|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\blust\b|desire|intimate|explicit|fetish|kinky|seduce|adult\s*(?:\w+\s+){0,2}\s*community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner)'
)
)
Detection logic
Scope: inbound message.
Detects suspicious Looker Studio Reports which containing inappropriate content or suspicious patterns. The rule looks for reports from non-organizational domains that contain emojis or explicit keywords within the report.
- inbound message
- sender.email.email is 'looker-studio-noreply@google.com'
all of
headers.reply_towhere all hold:- .email.domain.domain not in $org_domains
- .email.email not in $recipient_emails
- .email.email not in $sender_emails
any of
[subject.subject, body.current_thread.text]where:- . matches '(?:sex|horny|cock|fuck|\\bass\\b|pussy|dick|tits|cum\\b|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\\blust\\b|desire|intimate|explicit|fetish|kinky|seduce|adult\\s*(?:\\w+\\s+){0,2}\\s*community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner)'
Inspects: body.current_thread.text, headers.reply_to, headers.reply_to[].email.domain.domain, headers.reply_to[].email.email, sender.email.email, subject.subject, type.inbound. Sensors: regex.icontains. Reference lists: $org_domains, $recipient_emails, $sender_emails.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | looker-studio-noreply@google.com |
regex.icontains | regex | (?:sex|horny|cock|fuck|\bass\b|pussy|dick|tits|cum\b|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\blust\b|desire|intimate|explicit|fetish|kinky|seduce|adult\s*(?:\w+\s+){0,2}\s*community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner) |
Stages and Predicates
Stage 1: mql_rule
and
any([subject.subject, body.current_thread.text])
[subject.subject, body.current_thread.text] regex_match "(?:sex|horny|cock|fuck|\\bass\\b|pussy|dick|tits|cum\\b|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\\blust\\b|desire|intimate|explicit|fetish|kinky|seduce|adult\\s*(?:\\w+\\s+){0,2}\\s*community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner)"
sender.email.email eq "looker-studio-noreply@google.com"
type.inbound eq "true"
macro "all(headers.reply_to)"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.email.email | eq |
| field:"sender.email.email" kind:eq value:"looker-studio-noreply@google.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Single recipient duplicated in cc
#Detects spam emails where the 'To' and 'CC' fields match, using indicators such as short body length with spam keywords, unsolicited content, dmarc failures, fake threads, and suspicious links.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// one recipient and 1 cc
and length(recipients.to) == 1
and length(recipients.cc) == 1
// unsolicited
and not profile.by_sender().solicited
// recipients email matches the cc email
and any(recipients.to, any(recipients.cc, .email.email == ..email.email))
// body is short with spam keywords
and (
(
length(body.current_thread.text) < 150
and strings.ilike(body.current_thread.text,
"*congrat*",
"*win*",
"*expired*",
"*subscription*",
"*won*",
"*gift*",
"*CARTE CADEAU*",
"*Votre chance*",
"*survey*",
"*livraison*",
"*delivery*",
"*package*"
)
)
// body is super short
or length(body.current_thread.text) < 10
// body has no spaces
or regex.imatch(body.current_thread.text, '[^ ]+')
// subject is null
or subject.subject == ""
// dmarc failure
or not headers.auth_summary.dmarc.pass
// or display text contains suspicious terms
or any(body.links,
regex.icontains(.display_text,
'Congrat|Survey|package|delivery|\bclaim\b'
)
and not .href_url.domain.root_domain == "surveymonkey.com"
)
// compauth failure
or any(headers.hops,
.authentication_results.compauth.verdict not in (
"pass",
"softpass",
"none"
)
)
// all links display text is null or aka.ms
or (
length(filter(body.links,
(
(
.display_text is null
and .href_url.domain.root_domain != sender.email.domain.root_domain
)
or .href_url.domain.root_domain in (
"aka.ms",
"mimecast.com",
"mimecastprotect.com",
"cisco.com"
)
)
)
) == length(body.links)
)
or (
// fake thread check
regex.imatch(subject.subject, '(\[[^\]]+\]\s?){0,3}(re|fwd?)\s?:.*')
and (
(length(headers.references) == 0 and headers.in_reply_to is null)
or headers.in_reply_to is null
)
)
)
Detection logic
Scope: inbound message.
Detects spam emails where the 'To' and 'CC' fields match, using indicators such as short body length with spam keywords, unsolicited content, dmarc failures, fake threads, and suspicious links.
- inbound message
- length(recipients.to) is 1
- length(recipients.cc) is 1
not:
- profile.by_sender().solicited
any of
recipients.towhere:any of
recipients.ccwhere:- .email.email is .email.email
any of:
all of:
- length(body.current_thread.text) < 150
body.current_thread.text matches any of 12 patterns
*congrat**win**expired**subscription**won**gift**CARTE CADEAU**Votre chance**survey**livraison**delivery**package*
- length(body.current_thread.text) < 10
- body.current_thread.text matches '[^ ]+'
- subject.subject is ''
not:
- headers.auth_summary.dmarc.pass
any of
body.linkswhere all hold:- .display_text matches 'Congrat|Survey|package|delivery|\\bclaim\\b'
not:
- .href_url.domain.root_domain is 'surveymonkey.com'
any of
headers.hopswhere:- .authentication_results.compauth.verdict not in ('pass', 'softpass', 'none')
- length(filter(body.links, .display_text is null and .href_url.domain.root_domain != sender.email.domain.root_domain or .href_url.domain.root_domain in ('aka.ms', 'mimecast.com', 'mimecastprotect.com', 'cisco.com'))) is length(body.links)
all of:
- subject.subject matches '(\\[[^\\]]+\\]\\s?){0,3}(re|fwd?)\\s?:.*'
any of:
all of:
- length(headers.references) is 0
- headers.in_reply_to is missing
- headers.in_reply_to is missing
Inspects: body.current_thread.text, body.links, body.links[].display_text, body.links[].href_url.domain.root_domain, headers.auth_summary.dmarc.pass, headers.hops, headers.hops[].authentication_results.compauth.verdict, headers.in_reply_to, headers.references, recipients.cc, recipients.cc[].email.email, recipients.to, recipients.to[].email.email, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: profile.by_sender, regex.icontains, regex.imatch, strings.ilike.
Indicators matched (20)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *congrat* |
strings.ilike | substring | *win* |
strings.ilike | substring | *expired* |
strings.ilike | substring | *subscription* |
strings.ilike | substring | *won* |
strings.ilike | substring | *gift* |
strings.ilike | substring | *CARTE CADEAU* |
strings.ilike | substring | *Votre chance* |
strings.ilike | substring | *survey* |
strings.ilike | substring | *livraison* |
strings.ilike | substring | *delivery* |
strings.ilike | substring | *package* |
8 more
regex.imatch | regex | [^ ]+ |
subject.subject | equals | |
regex.icontains | regex | Congrat|Survey|package|delivery|\bclaim\b |
body.links[].href_url.domain.root_domain | member | aka.ms |
body.links[].href_url.domain.root_domain | member | mimecast.com |
body.links[].href_url.domain.root_domain | member | mimecastprotect.com |
body.links[].href_url.domain.root_domain | member | cisco.com |
regex.imatch | regex | (\[[^\]]+\]\s?){0,3}(re|fwd?)\s?:.* |
Stages and Predicates
Stage 1: mql_rule
and
or
any(body.links)
and
not
body.links.href_url.domain.root_domain eq "surveymonkey.com"
body.links.display_text regex_match "Congrat|Survey|package|delivery|\\bclaim\\b"
and
or
and
headers.in_reply_to is_null
headers.references length_compare "0"
headers.in_reply_to is_null
subject.subject regex_match "(\\[[^\\]]+\\]\\s?){0,3}(re|fwd?)\\s?:.*"
and
or
body.current_thread.text match "CARTE CADEAU"
body.current_thread.text match "Votre chance"
body.current_thread.text match "congrat"
body.current_thread.text match "delivery"
body.current_thread.text match "expired"
body.current_thread.text match "gift"
body.current_thread.text match "livraison"
body.current_thread.text match "package"
body.current_thread.text match "subscription"
body.current_thread.text match "survey"
body.current_thread.text match "win"
body.current_thread.text match "won"
body.current_thread.text length_compare "150"
any(headers.hops)
not
headers.hops.authentication_results.compauth.verdict in ["none", "pass", "softpass"]
not
headers.auth_summary.dmarc.pass eq "true"
body.current_thread.text length_compare "10"
body.current_thread.text regex_match "[^ ]+"
length func_call "length(filter(body.links, .display_text is null and .href_url.domain.root_domain != sender.email.domain.root_domain or .href_url.domain.root_domain in ('aka.ms', 'mimecast.com', 'mimecastprotect.com', 'cisco.com'))) == length(body.links)"
subject.subject eq ""
any(recipients.to)
any(recipients.cc)
recipients.cc.email.email cross_field_compare "recipients.to.email.email"
not
profile.by_sender func_call "profile.by_sender().solicited"
recipients.cc length_compare "1"
recipients.to length_compare "1"
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:"[^ ]+" |
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 | |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match value:"([[^]]+]\s?){0,3}(re|fwd?)\s?:.*" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: SMTP & Proxy Communications in Email Body
#An email containing SMTP and Proxy (socks5) command and control information within the body of the message.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Free email provider |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(attachments) == 0
and 1 < length(body.links) < 5
and regex.icontains(body.current_thread.text,
'(?:\:socks5:|::127.0.0.1:1080|:0:127.0.0.1:1080)'
)
Detection logic
Scope: inbound message.
An email containing SMTP and Proxy (socks5) command and control information within the body of the message.
- inbound message
- length(attachments) is 0
all of:
- length(body.links) > 1
- length(body.links) < 5
- body.current_thread.text matches '(?:\\:socks5:|::127.0.0.1:1080|:0:127.0.0.1:1080)'
Inspects: body.current_thread.text, body.links, type.inbound. Sensors: regex.icontains.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | (?:\:socks5:|::127.0.0.1:1080|:0:127.0.0.1:1080) |
Stages and Predicates
Stage 1: mql_rule
and
attachments length_compare "0"
body.current_thread.text regex_match "(?:\\:socks5:|::127.0.0.1:1080|:0:127.0.0.1:1080)"
body.links length_compare "1"
body.links length_compare "5"
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:"(?:\:socks5:|::127.0.0.1:1080|:0:127.0.0.1:1080)" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Unsolicited malformed PDF
#This rule is designed to identify spam messages featuring a single malformed PDF attachment often leading to romance scam, pornographic, or dating websites. These emails typically contain short body text and intentionally distorted PDFs to avoid detection.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Evasion, Free email provider, PDF |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// body text is very short
and length(body.current_thread.text) < 50
// one attachment
and length(attachments) == 1
// attachment is named a pdf, but mime type doesn't match with high entropy
and any(attachments,
.file_type == "unknown"
and strings.ends_with(.file_name, "pdf")
and any(file.explode(.),
.flavors.mime in (
"application/octet-stream",
"application/marc"
)
and .scan.entropy.entropy >= 6
)
)
// a free email address was hyperlinked
and any(body.links,
.display_text is null and .href_url.url in $free_email_providers
)
// multiple freemail senders found in recipients.to
and length(filter(recipients.to,
.email.domain.root_domain in $free_email_providers
)
) >= 3
// unsolicited and no false positives or previously flagged
and (
profile.by_sender().prevalence in ("new", "outlier")
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.
This rule is designed to identify spam messages featuring a single malformed PDF attachment often leading to romance scam, pornographic, or dating websites. These emails typically contain short body text and intentionally distorted PDFs to avoid detection.
- inbound message
- length(body.current_thread.text) < 50
- length(attachments) is 1
any of
attachmentswhere all hold:- .file_type is 'unknown'
- .file_name ends with 'pdf'
any of
file.explode(.)where all hold:- .flavors.mime in ('application/octet-stream', 'application/marc')
- .scan.entropy.entropy ≥ 6
any of
body.linkswhere all hold:- .display_text is missing
- .href_url.url in $free_email_providers
- length(filter(recipients.to, .email.domain.root_domain in $free_email_providers)) ≥ 3
any of:
- profile.by_sender().prevalence in ('new', 'outlier')
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: attachments[].file_name, attachments[].file_type, body.current_thread.text, body.links, body.links[].display_text, body.links[].href_url.url, recipients.to, recipients.to[].email.domain.root_domain, type.inbound. Sensors: file.explode, profile.by_sender, strings.ends_with. Reference lists: $free_email_providers.
Indicators matched (4)
| Field | Match | Value |
|---|---|---|
attachments[].file_type | equals | unknown |
strings.ends_with | suffix | pdf |
file.explode(attachments[])[].flavors.mime | member | application/octet-stream |
file.explode(attachments[])[].flavors.mime | member | application/marc |
Stages and Predicates
Stage 1: mql_rule
and
any(attachments)
and
any(file.explode(attachments))
and
file.explode(attachments[])[].flavors.mime in ["application/marc", "application/octet-stream"]
file.explode(attachments[])[].scan.entropy.entropy ge "6"
attachments.file_name ends_with "pdf"
attachments.file_type eq "unknown"
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"
profile.by_sender func_call "profile.by_sender().prevalence in (new, outlier)"
any(body.links)
and
body.links.display_text is_null
macro "body.links[].href_url.url in free_email_providers"
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
attachments length_compare "1"
body.current_thread.text length_compare "50"
filter(recipients.to, .email.domain.root_domain in $free_email_providers) length_compare "3"
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" |
Spam: Unsolicited WordPress account creation or password reset request
#Detects messages containing WordPress password reset links where the login parameter does not match the recipient's email address. The rule triggers for unsolicited senders, previously malicious senders, or when DMARC authentication fails.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and body.html.raw is null
and any(body.links,
.href_url.path == "/wp-login.php"
and any(.href_url.query_params_decoded["key"], . is not null)
and any(.href_url.query_params_decoded["login"],
any(recipients.to,
.email.local_part != .. and .email.email != ..
)
)
)
and (
(
not profile.by_sender().solicited
and profile.by_sender().prevalence == "new"
)
or (
profile.by_sender().any_messages_malicious_or_spam
and not profile.by_sender().any_messages_benign
)
or not headers.auth_summary.dmarc.pass
)
Detection logic
Scope: inbound message.
Detects messages containing WordPress password reset links where the login parameter does not match the recipient's email address. The rule triggers for unsolicited senders, previously malicious senders, or when DMARC authentication fails.
- inbound message
- body.html.raw is missing
any of
body.linkswhere all hold:- .href_url.path is '/wp-login.php'
any of
.href_url.query_params_decoded['key']where:- . is set
any of
.href_url.query_params_decoded['login']where:any of
recipients.towhere all hold:- .email.local_part is not .
- .email.email is not .
any of:
all of:
not:
- profile.by_sender().solicited
- profile.by_sender().prevalence is 'new'
all of:
- profile.by_sender().any_messages_malicious_or_spam
not:
- profile.by_sender().any_messages_benign
not:
- headers.auth_summary.dmarc.pass
Inspects: body.html.raw, body.links, body.links[].href_url.path, body.links[].href_url.query_params_decoded['key'], body.links[].href_url.query_params_decoded['login'], headers.auth_summary.dmarc.pass, recipients.to, recipients.to[].email.email, recipients.to[].email.local_part, type.inbound. Sensors: profile.by_sender.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
body.links[].href_url.path | equals | /wp-login.php |
Stages and Predicates
Stage 1: mql_rule
and
any(body.links)
and
any(body.links.href_url.query_params_decoded['login'])
any(recipients.to)
and
recipients.to.email.email cross_field_compare "body.links.href_url.query_params_decoded['login'][]"
recipients.to.email.local_part cross_field_compare "body.links.href_url.query_params_decoded['login'][]"
any(body.links.href_url.query_params_decoded['key'])
body.links.href_url.query_params_decoded['key'] is_not_null
body.links.href_url.path eq "/wp-login.php"
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 == new"
not
headers.auth_summary.dmarc.pass eq "true"
body.html.raw is_null
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.html.raw | is_null | field:"body.html.raw" kind:is_null | |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: URL shortener with short body content and emojis
#Detects spam from freemail senders, where the majority of the body is a URL shortener and emojis.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
| Tactics and techniques | Free email provider |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// sender is a freemail
and sender.email.domain.root_domain in $free_email_providers
// has a URL shortener
and any(body.links,
.href_url.domain.root_domain in $url_shorteners
or .href_url.domain.root_domain in $social_landing_hosts
)
// short body, basically just the URL
and length(body.plain.raw) < 100
// has an emoji in the subject or body
and (
regex.contains(body.plain.raw,
'[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]'
)
or regex.contains(subject.subject,
'[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]'
)
)
and (
profile.by_sender().prevalence in ("new", "outlier")
or (
profile.by_sender().any_messages_malicious_or_spam
and not profile.by_sender().any_messages_benign
)
)
Detection logic
Scope: inbound message.
Detects spam from freemail senders, where the majority of the body is a URL shortener and emojis.
- inbound message
- sender.email.domain.root_domain in $free_email_providers
any of
body.linkswhere any holds:- .href_url.domain.root_domain in $url_shorteners
- .href_url.domain.root_domain in $social_landing_hosts
- length(body.plain.raw) < 100
any of:
- body.plain.raw matches '[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]'
- subject.subject matches '[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]'
any of:
- profile.by_sender().prevalence in ('new', 'outlier')
all of:
- profile.by_sender().any_messages_malicious_or_spam
not:
- profile.by_sender().any_messages_benign
Inspects: body.links, body.links[].href_url.domain.root_domain, body.plain.raw, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: profile.by_sender, regex.contains. Reference lists: $free_email_providers, $social_landing_hosts, $url_shorteners.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
regex.contains | regex | [\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}] |
Stages and Predicates
Stage 1: mql_rule
and
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"
profile.by_sender func_call "profile.by_sender().prevalence in (new, outlier)"
any(body.links)
or
macro "body.links[].href_url.domain.root_domain in social_landing_hosts"
macro "body.links[].href_url.domain.root_domain in url_shorteners"
or
body.plain.raw regex_match "[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]"
subject.subject regex_match "[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]"
body.plain.raw length_compare "100"
type.inbound eq "true"
macro "sender.email.domain.root_domain in free_email_providers"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.plain.raw | regex_match |
| field:"body.plain.raw" kind:regex_match value:"[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]" |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match value:"[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Spam: Website errors solicitation
#This rule detects messages claiming to have identified errors on a website. The messages typically offer to send pricing or information upon request.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and not profile.by_sender().solicited
// no attachments
and length(attachments) == 0
// subject must contain SEO or web dev spam keywords or be short
and (
(
// SEO or web development service keywords
regex.icontains(strings.replace_confusables(subject.subject),
'(?:proposal|cost|estimate|error|bug|audit|screenshot|strategy|rankings|issues|fix|website|design|review|price)'
)
or regex.icontains(subject.base,
'[^\x{2600}-\x{27BF}\x{1F300}-\x{1F9FF}][\x{2600}-\x{27BF}\x{1F300}-\x{1F9FF}]\x{FE0F}?$'
)
// report and follow up keywords
or (
strings.icontains(strings.replace_confusables(subject.subject), "report")
and regex.icontains(strings.replace_confusables(body.current_thread.text),
"(?:free|send you|can i send|may i send|let me know|interested|get back to me|reply back|just reply)"
)
)
// short subject
or length(subject.base) < 7
or regex.icontains(subject.base, '[.?!-]{4,}')
)
// or a reply or forward in a thread that mentions website or screenshots
or (
(length(subject.base) < 5 or subject.is_reply or subject.is_forward)
and any(body.previous_threads,
regex.icontains(strings.replace_confusables(.text),
"(?:screenshot|website)"
)
)
)
)
// body structure and content patterns
and (
// Single thread with no links
(
length(filter(body.current_thread.links,
not (.href_url.scheme == "mailto" and .parser == "plain")
)
) == 0
and length(body.previous_threads) == 0
// short message between 20 and 500 chars
and (
20 < length(body.current_thread.text) < 500
or any(map(filter(ml.nlu_classifier(body.current_thread.text).entities,
.name == "disclaimer"
),
.text
),
20 < (length(body.current_thread.text) - length(.)) < 500
)
)
// service offering keywords
and regex.icontains(strings.replace_confusables(body.current_thread.text),
'(?:screenshot|errors? (?:list|report)|plan|quote|rank|professional|price|mistake|visibility|improvement|review|emailed.{0,10}more details|(?:may|can|shall|should) i (?:email|send|share|forward|show)(?:\s+you)?.{0,15}(?:the|more|those|these|some)?\s*(?:details|info(?:rmation)?|report|screenshots?|list))'
)
// generic greeting
and regex.icontains(strings.replace_confusables(body.current_thread.text),
'h(?:i|ello|ey)\b'
)
// problem or urgency keywords
and regex.icontains(strings.replace_confusables(body.current_thread.text),
'(?:errors?|report|issues|website|repair|redesign|upgrade|Google\s+.{0,15}find it|glitch|send you|SEO|broken)'
)
// website or page mention
and regex.icontains(strings.replace_confusables(body.current_thread.text),
"(?:site|website|page|package|SEO)"
)
)
// Single thread with unsubscribe link or $org_domains link
or (
length(body.links) <= 3
and (
// unsubscribe mailto link
regex.icontains(body.html.raw, "mailto:*[++unsubscribe@]")
// or link to found in org_domains
or any(body.links, .href_url.domain.root_domain in~ $org_domains)
)
and length(body.previous_threads) == 0
// short message between 20 and 500 chars
and 20 < length(body.current_thread.text) < 500
// service offering keywords
and regex.icontains(strings.replace_confusables(body.current_thread.text),
"(?:screenshot|error list|plan|quote|rank|professional|price|mistake)"
)
// generic greeting
and regex.icontains(strings.replace_confusables(body.current_thread.text),
'(?:h(?:i|ello|ey)|morning)\b'
)
// problem or urgency keywords
and regex.icontains(strings.replace_confusables(body.current_thread.text),
'(?:error|report|issues|website|repair|redesign|upgrade|Google\s+.{0,15}find it|send you|SEO)'
)
// website or page mention
and regex.icontains(strings.replace_confusables(body.current_thread.text),
"(?:site|website|page|package|SEO)"
)
)
// Multiple thread messages
or (
length(body.links) == 0
// small thread with less than 5 messages
and length(body.previous_threads) < 5
// check previous messages for spam characteristics
and any(body.previous_threads,
// short previous messages less than 400 chars
length(.text) < 400
and (
// generic greeting
regex.icontains(strings.replace_confusables(.text),
'(?:h(?:i|ello|ey)|morning)\b'
)
// service offering keywords
and regex.icontains(strings.replace_confusables(.text),
'(?:\berror(?:\s+list)?\b|screenshot|report|plan)'
)
// previous threads written in English
and ml.nlu_classifier(.text).language == "english"
)
)
)
)
Detection logic
Scope: inbound message.
This rule detects messages claiming to have identified errors on a website. The messages typically offer to send pricing or information upon request.
- inbound message
not:
- profile.by_sender().solicited
- length(attachments) is 0
any of:
any of:
- strings.replace_confusables(subject.subject) matches '(?:proposal|cost|estimate|error|bug|audit|screenshot|strategy|rankings|issues|fix|website|design|review|price)'
- subject.base matches '[^\\x{2600}-\\x{27BF}\\x{1F300}-\\x{1F9FF}][\\x{2600}-\\x{27BF}\\x{1F300}-\\x{1F9FF}]\\x{FE0F}?$'
all of:
- strings.replace_confusables(subject.subject) contains 'report'
- strings.replace_confusables(body.current_thread.text) matches '(?:free|send you|can i send|may i send|let me know|interested|get back to me|reply back|just reply)'
- length(subject.base) < 7
- subject.base matches '[.?!-]{4,}'
all of:
any of:
- length(subject.base) < 5
- subject.is_reply
- subject.is_forward
any of
body.previous_threadswhere:- strings.replace_confusables(.text) matches '(?:screenshot|website)'
any of:
all of:
- length(filter(body.current_thread.links, not .href_url.scheme == 'mailto' and .parser == 'plain')) is 0
- length(body.previous_threads) is 0
any of:
all of:
- length(body.current_thread.text) > 20
- length(body.current_thread.text) < 500
any of
map(...)where all hold:- 20 < length(body.current_thread.text) - length(.)
- length(body.current_thread.text) - length(.) < 500
- strings.replace_confusables(body.current_thread.text) matches '(?:screenshot|errors? (?:list|report)|plan|quote|rank|professional|price|mistake|visibility|improvement|review|emailed.{0,10}more details|(?:may|can|shall|should) i (?:email|send|share|forward|show)(?:\\s+you)?.{0,15}(?:the|more|those|these|some)?\\s*(?:details|info(?:rmation)?|report|screenshots?|list))'
- strings.replace_confusables(body.current_thread.text) matches 'h(?:i|ello|ey)\\b'
- strings.replace_confusables(body.current_thread.text) matches '(?:errors?|report|issues|website|repair|redesign|upgrade|Google\\s+.{0,15}find it|glitch|send you|SEO|broken)'
- strings.replace_confusables(body.current_thread.text) matches '(?:site|website|page|package|SEO)'
all of:
- length(body.links) ≤ 3
any of:
- body.html.raw matches 'mailto:*[++unsubscribe@]'
any of
body.linkswhere:- .href_url.domain.root_domain in $org_domains
- length(body.previous_threads) is 0
all of:
- length(body.current_thread.text) > 20
- length(body.current_thread.text) < 500
- strings.replace_confusables(body.current_thread.text) matches '(?:screenshot|error list|plan|quote|rank|professional|price|mistake)'
- strings.replace_confusables(body.current_thread.text) matches '(?:h(?:i|ello|ey)|morning)\\b'
- strings.replace_confusables(body.current_thread.text) matches '(?:error|report|issues|website|repair|redesign|upgrade|Google\\s+.{0,15}find it|send you|SEO)'
- strings.replace_confusables(body.current_thread.text) matches '(?:site|website|page|package|SEO)'
all of:
- length(body.links) is 0
- length(body.previous_threads) < 5
any of
body.previous_threadswhere all hold:- length(.text) < 400
all of:
- strings.replace_confusables(.text) matches '(?:h(?:i|ello|ey)|morning)\\b'
- strings.replace_confusables(.text) matches '(?:\\berror(?:\\s+list)?\\b|screenshot|report|plan)'
- ml.nlu_classifier(.text).language is 'english'
Inspects: body.current_thread.links, body.current_thread.links[].href_url.scheme, body.current_thread.links[].parser, body.current_thread.text, body.html.raw, body.links, body.links[].href_url.domain.root_domain, body.previous_threads, body.previous_threads[].text, subject.base, subject.is_forward, subject.is_reply, subject.subject, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender, regex.icontains, strings.icontains, strings.replace_confusables. Reference lists: $org_domains.
Indicators matched (16)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | (?:proposal|cost|estimate|error|bug|audit|screenshot|strategy|rankings|issues|fix|website|design|review|price) |
regex.icontains | regex | [^\x{2600}-\x{27BF}\x{1F300}-\x{1F9FF}][\x{2600}-\x{27BF}\x{1F300}-\x{1F9FF}]\x{FE0F}?$ |
strings.icontains | substring | report |
regex.icontains | regex | (?:free|send you|can i send|may i send|let me know|interested|get back to me|reply back|just reply) |
regex.icontains | regex | [.?!-]{4,} |
regex.icontains | regex | (?:screenshot|website) |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | disclaimer |
regex.icontains | regex | (?:screenshot|errors? (?:list|report)|plan|quote|rank|professional|price|mistake|visibility|improvement|review|emailed.{0,10}more details|(?:may|can|shall|should) i (?:email|send|share|forward|show)(?:\s+you)?.{0,15}(?:the|more|those|these|some)?\s*(?:details|info(?:rmation)?|report|screenshots?|list)) |
regex.icontains | regex | h(?:i|ello|ey)\b |
regex.icontains | regex | (?:errors?|report|issues|website|repair|redesign|upgrade|Google\s+.{0,15}find it|glitch|send you|SEO|broken) |
regex.icontains | regex | (?:site|website|page|package|SEO) |
regex.icontains | regex | mailto:*[++unsubscribe@] |
4 more
regex.icontains | regex | (?:screenshot|error list|plan|quote|rank|professional|price|mistake) |
regex.icontains | regex | (?:h(?:i|ello|ey)|morning)\b |
regex.icontains | regex | (?:error|report|issues|website|repair|redesign|upgrade|Google\s+.{0,15}find it|send you|SEO) |
regex.icontains | regex | (?:\berror(?:\s+list)?\b|screenshot|report|plan) |
Stages and Predicates
Stage 1: mql_rule
and
or
and
or
any(map(...))
and
macro "(length(body.current_thread.text) - length(map(...)[])) < 500"
macro "20 < (length(body.current_thread.text) - length(map(...)[]))"
and
body.current_thread.text length_compare "20"
body.current_thread.text length_compare "500"
body.previous_threads length_compare "0"
filter(body.current_thread.links, not .href_url.scheme == 'mailto' and .parser == 'plain') length_compare "0"
strings.replace_confusables(body.current_thread.text) regex_match "(?:errors?|report|issues|website|repair|redesign|upgrade|Google\\s+.{0,15}find it|glitch|send you|SEO|broken)"
strings.replace_confusables(body.current_thread.text) regex_match "(?:screenshot|errors? (?:list|report)|plan|quote|rank|professional|price|mistake|visibility|improvement|review|emailed.{0,10}more details|(?:may|can|shall|should) i (?:email|send|share|forward|show)(?:\\s+you)?.{0,15}(?:the|more|those|these|some)?\\s*(?:details|info(?:rmation)?|report|screenshots?|list))"
strings.replace_confusables(body.current_thread.text) regex_match "(?:site|website|page|package|SEO)"
strings.replace_confusables(body.current_thread.text) regex_match "h(?:i|ello|ey)\\b"
and
any(body.previous_threads)
and
body.previous_threads.text length_compare "400"
ml.nlu_classifier func_call "ml.nlu_classifier(body.previous_threads[].text).language == english"
strings.replace_confusables(body.previous_threads[].text) regex_match "(?:\\berror(?:\\s+list)?\\b|screenshot|report|plan)"
strings.replace_confusables(body.previous_threads[].text) regex_match "(?:h(?:i|ello|ey)|morning)\\b"
body.links length_compare "0"
body.previous_threads length_compare "5"
and
or
any(body.links)
macro "body.links[].href_url.domain.root_domain in org_domains"
body.html.raw regex_match "mailto:*[++unsubscribe@]"
body.current_thread.text length_compare "20"
body.current_thread.text length_compare "500"
body.links length_compare "3"
body.previous_threads length_compare "0"
strings.replace_confusables(body.current_thread.text) regex_match "(?:error|report|issues|website|repair|redesign|upgrade|Google\\s+.{0,15}find it|send you|SEO)"
strings.replace_confusables(body.current_thread.text) regex_match "(?:h(?:i|ello|ey)|morning)\\b"
strings.replace_confusables(body.current_thread.text) regex_match "(?:screenshot|error list|plan|quote|rank|professional|price|mistake)"
strings.replace_confusables(body.current_thread.text) regex_match "(?:site|website|page|package|SEO)"
or
and
any(body.previous_threads)
strings.replace_confusables(body.previous_threads[].text) regex_match "(?:screenshot|website)"
or
subject.base length_compare "5"
subject.is_forward eq "true"
subject.is_reply eq "true"
and
strings.replace_confusables(body.current_thread.text) regex_match "(?:free|send you|can i send|may i send|let me know|interested|get back to me|reply back|just reply)"
strings.replace_confusables(subject.subject) contains "report"
strings.replace_confusables(subject.subject) regex_match "(?:proposal|cost|estimate|error|bug|audit|screenshot|strategy|rankings|issues|fix|website|design|review|price)"
subject.base length_compare "7"
subject.base regex_match "[.?!-]{4,}"
subject.base regex_match "[^\\x{2600}-\\x{27BF}\\x{1F300}-\\x{1F9FF}][\\x{2600}-\\x{27BF}\\x{1F300}-\\x{1F9FF}]\\x{FE0F}?$"
not
profile.by_sender func_call "profile.by_sender().solicited"
attachments length_compare "0"
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 value:"mailto:*[++unsubscribe@]" |
strings.replace_confusables(body.current_thread.text) | regex_match |
| field:"strings.replace_confusables(body.current_thread.text)" kind:regex_match |
strings.replace_confusables(subject.subject) | contains |
| field:"strings.replace_confusables(subject.subject)" kind:contains value:"report" |
strings.replace_confusables(subject.subject) | regex_match |
| field:"strings.replace_confusables(subject.subject)" kind:regex_match value:"(?:proposal|cost|estimate|error|bug|audit|screenshot|strategy|rankings|issues|fix|website|design|review|price)" |
subject.base | regex_match |
| field:"subject.base" kind:regex_match |
subject.is_forward | eq |
| field:"subject.is_forward" kind:eq value:"true" |
subject.is_reply | eq |
| field:"subject.is_reply" kind:eq value:"true" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |