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}]"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in alexa_1m"
subject.subject regex_match "[\\$£€¥₿]"
type.inbound eq "true"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), // 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
any of
body.linkswhere all hold:- ml.link_analysis(.).effective_url.domain.domain == .href_url.domain.domain
any of:
- any(ml.link_analysis(.).effective_url.query_params_decoded["q"], strings.icontains(., "IP provider is blacklisted!") )
- ml.link_analysis(.).final_dom.inner_text == "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
ml.link_analysis func_call "ml.link_analysis(.).final_dom.inner_text == \"Too Many Requests!\""
macro "any(ml.link_analysis(.).effective_url.query_params_decoded[\"q\"],\n strings.icontains(., \"IP provider is blacklisted!\")\n )"
ml.link_analysis func_call "ml.link_analysis(.).effective_url.domain.domain == .href_url.domain.domain"
length func_call "length(filter(distinct(body.links, .href_url.domain.root_domain),\n // filter out unrelated domains\n .href_url.domain.root_domain != sender.email.domain.root_domain\n and any(recipients.to,\n .email.domain.root_domain != ..href_url.domain.root_domain\n )\n and .href_url.domain.root_domain not in (\"aka.ms\")\n )\n) == 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(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") )
any of:
all of:
- ( 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?' ) ) )
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([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)') ) ) )
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
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)"
macro "(\n any([subject.subject, body.current_thread.text],\n (\n regex.icontains(.,\n '(?: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)'\n )\n and not (\n regex.icount(.,\n '(email|contact)(?:[[:punct:]]*s)?(?:\\s\\w*){0,9}list'\n ) == 1\n and regex.icontains(.,\n '(?: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])',\n 'email list(?:\\b|[^ei])[[:punct:]]*s?(\\s\\w*){0,5}(?:unsub|remove|safe|delete|leave|up to date|part of|be added)'\n )\n )\n )\n or regex.icontains(.,\n '\\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?'\n )\n )\n )"
and
macro "2 of (\n regex.icontains(body.current_thread.text, '(?:get|got|had) a chance'),\n regex.icontains(body.current_thread.text, '(take|move)(\\Wthis)?\\Wforward'),\n regex.icontains(body.current_thread.text,\n '(review|drop me a line about) (my|this|it)'\n ),\n regex.icontains(body.current_thread.text, 'missed it( the)? first time'),\n regex.icontains(body.current_thread.text,\n '(?:below|previous(ly)?|last|prior|earlier) (message|email|sent)'\n ),\n regex.icontains(body.current_thread.text,\n // \"the email I sent you earlier\"\n '(e?mail|message).{0,20}(sent).{0,20}(?:below|previous(ly)?|last|prior|earlier)'\n ),\n regex.icontains(body.current_thread.text,\n '(sent).{0,50}(e?mail|message) (?:below|previous(ly)?|last|prior|earlier)'\n ),\n regex.icontains(body.current_thread.text, 'follow(?:ing)?(-| )up'),\n regex.icontains(body.current_thread.text, '(?:contact|attendee)s? list'),\n regex.icontains(body.current_thread.text, '(any|get an) update.{0,50}\\?'),\n regex.icontains(body.current_thread.text, '(heard?|circling) back'),\n strings.icontains(body.current_thread.text, 'recently sent'),\n strings.icontains(body.current_thread.text, 'still interested'),\n regex.icontains(body.current_thread.text,\n 'did you (get|receive) (it|my (message|e?mail))'\n ),\n regex.icontains(body.current_thread.text, '(swift|quick|short) response'),\n regex.icontains(body.current_thread.text, 'kindly.{0,30}.interested'),\n )"
macro "any([body.html.display_text, body.plain.raw],\n (\n 3 of (\n strings.icontains(., \"from:\"),\n strings.icontains(., \"to:\"),\n strings.icontains(., \"sent:\"),\n strings.icontains(., \"date:\"),\n strings.icontains(., \"cc:\"),\n strings.icontains(., \"subject:\"),\n strings.icontains(., \"--Original Message--\")\n )\n or strings.icontains(.,\n strings.concat(sender.display_name,\n \" <\",\n sender.email.email,\n \"> wrote:\"\n )\n )\n )\n // match _after_ the previous thread indciators\n and (\n regex.icontains(.,\n '(?: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)'\n )\n or regex.icontains(.,\n '(?: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?'\n )\n or (\n 2 of (\n strings.icontains(., \"provide counts\"),\n regex.icontains(., \"(?:verified|fresh) data\"),\n strings.icontains(., \"precise targeting\"),\n strings.icontains(., \"deliverability\"),\n regex.icontains(., \"target (verticals|regions|criteria)\")\n )\n and regex.icontains(., '(?:list(?:\\b|[^ei])|database)')\n )\n )\n )"
not
any(body.links)
and
body.links.display_text eq "Zendesk"
body.links.href_url.domain.root_domain eq "zendesk.com"
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"
macro "any(ml.nlu_classifier(coalesce(body.html.display_text, body.plain.raw)).topics,\n .name in (\"Contact List Solicitation\", \"B2B Cold Outreach\")\n and .confidence in (\"medium\", \"high\")\n)"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match value:"(?:interest(s|ed)|accessing|purchas|obtain|acuir|sample|provide.{0,10}samples|counts|pricing)" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
body.links | array_any | excludes:body.links |
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) == 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) == 0
- regex.icontains(coalesce(body.html.inner_text, body.html.display_text), '([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
body.links.href_url.domain.domain macro "body.links[].href_url.domain.domain in free_file_hosts"
body.links.href_url.domain.root_domain 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"
regex.icontains func_call "regex.icontains(coalesce(body.html.inner_text, body.html.display_text),\n '([a-zA-Z\\d\\.]\\s){30,}'\n)"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.email.domain.valid | eq |
| field:"sender.email.domain.valid" kind:eq value:"false" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
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) == 2
- all(network.whois(sender.email.domain).name_servers, strings.iends_with(.subdomain, '.ns') and .root_domain == 'cloudflare.com' )
- any(ml.nlu_classifier(body.current_thread.text).topics, .name == '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
length func_call "length(network.whois(sender.email.domain).name_servers) == 2"
network.whois func_call "network.whois(sender.email.domain).days_old < 365"
type.inbound eq "true"
macro "all(network.whois(sender.email.domain).name_servers,\n strings.iends_with(.subdomain, '.ns')\n and .root_domain == 'cloudflare.com'\n)"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name == 'B2B Cold Outreach'\n)"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(html.xpath(body.html, "//div[contains(@style, 'BACKGROUND: URL')]").nodes, .raw is not null ) )
any of
body.linkswhere:- any([ "blob.core.windows.net", "click.email.formula1.com", "firmy-praha.eu" ], ..href_url.domain.domain == . or 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
- ( // 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 )
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.icontains(strings.replace_confusables(subject.base), "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, "*") == 2
- strings.count(sender.display_name, "*") == 2
all of:
- 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 )
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
and
or
length func_call "length(distinct(map(regex.extract(sender.display_name,\n '(?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}])'\n ),\n .full_match\n )\n )\n ) >= 2"
sender.display_name regex_match "#[a-z0-9]{5,}?"
subject.base starts_with "."
subject.base regex_match "#[a-z0-9]{5,}?"
and
not
regex.count func_call "regex.count(subject.base, ':') > 5"
macro "any(regex.extract(subject.base, '(?:-{1,2}|\\s)([a-zA-Z0-9]{11,})'),\n regex.contains(.full_match, '[A-Z]')\n and regex.contains(.full_match, '[a-z]')\n and regex.contains(.full_match, '[0-9]')\n // some matches are legit but they are 35+ characters\n and length(.full_match) <= 30\n )"
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.icontains func_call "strings.icontains(strings.replace_confusables(subject.base), \"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"
length func_call "(\n // Subject contains at least 2 emojias\n length(distinct(map(regex.extract(subject.base,\n '(?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}])'\n ),\n .full_match\n )\n )\n ) >= 2\n )"
or
any(body.links)
macro "any([\n \"blob.core.windows.net\",\n \"click.email.formula1.com\",\n \"firmy-praha.eu\"\n ],\n ..href_url.domain.domain == .\n or strings.ends_with(..href_url.domain.domain, .)\n )"
macro "(\n any(html.xpath(body.html, \"//div[contains(@style, 'BACKGROUND: URL')]\").nodes,\n .raw is not null\n )\n )"
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 |
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(ml.nlu_classifier(body.current_thread.text).topics, .name in ("Financial Communications") )
not:
- any(ml.nlu_classifier(body.current_thread.text).topics, .name in ( 'Newsletters and Digests', 'News and Current Events', 'Legal and Compliance' ) )
not:
- any(ml.nlu_classifier(body.current_thread.text).intents, .name == "benign" and .confidence == "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
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"]
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"
not
macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n .name == \"benign\" and .confidence == \"high\"\n)"
not
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n 'Newsletters and Digests',\n 'News and Current Events',\n 'Legal and Compliance'\n )\n)"
type.inbound eq "true"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\"Financial Communications\")\n)"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
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" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | binance.com, bloomberg.com, ethereum.org, gemini.com, kraken.com, ledger.com, metamask.com, solana.com, trezor.io | excludes:sender.email.domain.root_domain |
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)" |
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, ".", sender.email.domain.tld ) 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, false)
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
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.dmarc.pass is_not_null
sender.email.domain.domain 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, .href_url.domain.root_domain == \"microsoft.com\")"
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,\n \".\",\n sender.email.domain.tld\n) in $recipient_domains"
body.links length_compare "0"
recipients.to length_compare "2"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
Exclusions
The rule actively suppresses these predicates.
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) == 0
all of:
- (0) < (length(distinct(body.current_thread.links, .href_url.domain.root_domain) ))
- (length(distinct(body.current_thread.links, .href_url.domain.root_domain) )) <= (3)
any of
body.linkswhere any holds:- ( any(values(.href_url.query_params_decoded), any(., strings.parse_email(.).email in map(recipients.to, .email.email ) ) ) )
- .display_text matches '(?:(open|view|read|private).{0,15}message)'
- any([.href_url.path, .display_text], any((ml.nlu_classifier(.).topics), .name in ("Romance", "Sexually Explicit Messages") ) )
- any(values(ml.link_analysis(.).effective_url.query_params_decoded), any(., strings.parse_email(.).email in map(recipients.to, .email.email ) ) )
any of:
- any(ml.nlu_classifier(body.current_thread.text).entities, .name == "org" and strings.ilike(.text, "*Flirt*", "*Singles*", "*Date*", "*Dating*", "*Girls*", "*Love*", "*Hook*up*" ) )
- any(ml.nlu_classifier(body.current_thread.text).topics, .name == "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
body.links.display_text regex_match "(?:(open|view|read|private).{0,15}message)"
macro "(\n any(values(.href_url.query_params_decoded),\n any(.,\n strings.parse_email(.).email in map(recipients.to,\n .email.email\n )\n )\n )\n )"
macro "any([.href_url.path, .display_text],\n any((ml.nlu_classifier(.).topics),\n .name in (\"Romance\", \"Sexually Explicit Messages\")\n )\n )"
macro "any(values(ml.link_analysis(.).effective_url.query_params_decoded),\n any(.,\n strings.parse_email(.).email in map(recipients.to,\n .email.email\n )\n )\n )"
or
macro "any(ml.nlu_classifier(body.current_thread.text).entities,\n .name == \"org\"\n and strings.ilike(.text,\n \"*Flirt*\",\n \"*Singles*\",\n \"*Date*\",\n \"*Dating*\",\n \"*Girls*\",\n \"*Love*\",\n \"*Hook*up*\"\n )\n )"
macro "any(ml.nlu_classifier(body.current_thread.text).topics, .name == \"Romance\")"
headers.references length_compare "0"
length func_call "(0) < (length(distinct(body.current_thread.links, .href_url.domain.root_domain)\n))"
length func_call "(length(distinct(body.current_thread.links, .href_url.domain.root_domain)\n)) <= (3)"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in free_email_providers"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
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 ) ) == 1
any of
body.linkswhere all hold:- .href_url.domain.domain is sender.email.domain.domain
- .href_url.path is '/__/auth/action'
- any(.href_url.query_params_decoded["mode"], . == "resetPassword")
any of:
all of:
not:
- profile.by_sender().solicited
- profile.by_sender().prevalence == "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
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"
any(body.links)
and
body.links.href_url.domain.domain cross_field_compare "sender.email.domain.domain"
body.links.href_url.path eq "/__/auth/action"
macro "any(.href_url.query_params_decoded[\"mode\"], . == \"resetPassword\")"
length func_call "length(filter(body.links,\n .href_url.domain.root_domain not in (\"aka.ms\")\n and .href_url.path is not null\n )\n) == 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(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" ) )
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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
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"
not
macro "(\n any(ml.nlu_classifier(body.current_thread.text).topics,\n .name in (\n \"Newsletters and Digests\",\n \"Events and Webinars\",\n \"Educational and Research\",\n \"Financial Communications\",\n \"Advertising and Promotions\",\n \"Legal and Compliance\",\n \"Professional and Career Development\"\n )\n and .confidence == \"high\"\n )\n)"
body.current_thread.text length_compare "1500"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
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([body.html.display_text, subject.base], regex.icontains(., '\$\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
network.whois func_call "network.whois(sender.email.domain).days_old < 180"
type.inbound eq "true"
macro "any([body.html.display_text, subject.base],\n regex.icontains(., '\\$\\d\\p{Pd}\\$\\d{1,2}(?:m\\b|million)')\n)"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) == 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)
recipients.to.email.domain.root_domain 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) == 0
not:
- subject.is_forward
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics, .name == "Financial Communications" )
- any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics, .name == "Advertising and Promotions" )
- strings.icontains(beta.ocr(file.message_screenshot()).text, "mastercard")
not:
- strings.icontains(beta.ocr(file.message_screenshot()).text, "paying with mastercard" )
- ( length(beta.ocr(file.message_screenshot()).text) / length(body.current_thread.text ) ) > 10
- length(body.previous_threads) == 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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
sender.email.domain.root_domain macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
not
strings.icontains func_call "strings.icontains(beta.ocr(file.message_screenshot()).text,\n \"paying with mastercard\"\n)"
not
subject.is_forward eq "true"
attachments length_compare "0"
body.previous_threads length_compare "0"
strings.icontains func_call "strings.icontains(beta.ocr(file.message_screenshot()).text, \"mastercard\")"
type.inbound eq "true"
macro "(\n length(beta.ocr(file.message_screenshot()).text) / length(body.current_thread.text\n )\n) > 10"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name == \"Advertising and Promotions\"\n)"
macro "any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,\n .name == \"Financial Communications\"\n)"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
subject.is_forward | eq | true | excludes:subject.is_forward field:"subject.is_forward" 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) == 1
- any([body.current_thread.text, subject.subject], regex.icontains(., '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(ml.nlu_classifier(body.current_thread.text).topics, .name == "B2B Cold Outreach" and .confidence != "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"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name == \"B2B Cold Outreach\" and .confidence != \"low\"\n )"
not
profile.by_sender func_call "profile.by_sender().solicited"
recipients.to length_compare "1"
type.inbound eq "true"
macro "any([body.current_thread.text, subject.subject],\n regex.icontains(., 'congrat(?:ulation)?s on the new (?:job|gig|role)')\n)"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(.href_url.domain).days_old < 10"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in free_email_providers"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
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) == 1
- 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"] ) ) ) )
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>"
body.previous_threads length_compare "1"
type.inbound eq "true"
macro "any(regex.iextract(subject.base, '(?:^|: )(?P<first_name>[A-Z][a-z]+)$'),\n // the current thread starts with \"Hi <extracted from subject>\n strings.istarts_with(body.current_thread.text,\n strings.concat('Hi ', .named_groups[\"first_name\"])\n )\n // the previous thread starts with \"Hi <extracted from subject>\n and any(body.previous_threads,\n strings.istarts_with(.text,\n strings.concat('Hi ',\n ..named_groups[\"first_name\"]\n )\n )\n )\n)"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(ml.nlu_classifier(body.current_thread.text).topics, .name == "Financial Communications" and .confidence != "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(headers.domains)
headers.domains.root_domain eq "sendersrv.com"
body.current_thread.text contains "unsubscribe"
type.inbound eq "true"
macro "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name == \"Financial Communications\" and .confidence != \"low\"\n)"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains 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(ml.nlu_classifier(body.current_thread.text).topics, .name == '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
sender.email.domain.root_domain macro "sender.email.domain.root_domain in free_email_providers"
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 "any(ml.nlu_classifier(body.current_thread.text).topics,\n .name == 'Sexually Explicit Messages'\n)"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($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 ') ) )
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}$"
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 "
not
macro "any($org_domains,\n strings.icontains(body.current_thread.text,\n strings.concat('@',\n .,\n ' invited you to join the '\n )\n )\n or strings.icontains(body.current_thread.text,\n strings.concat('@', ., ' added you to the ')\n )\n)"
sender.email.email eq "noreply@groups.google.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
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([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)' ) )
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
sender.email.email eq "looker-studio-noreply@google.com"
type.inbound eq "true"
macro "all(headers.reply_to,\n .email.domain.domain not in $org_domains\n and .email.email not in $recipient_emails\n and .email.email not in $sender_emails\n)"
macro "any([subject.subject, body.current_thread.text],\n // this regex should be kept in sync between the Google Group, Google Drive Share, and Looker Studio rules\n regex.icontains(.,\n '(?: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)'\n )\n)"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) == 1
- length(recipients.cc) == 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" ) ) ) ) == length(body.links) )
all of:
- subject.subject matches '(\\[[^\\]]+\\]\\s?){0,3}(re|fwd?)\\s?:.*'
any of:
all of:
- length(headers.references) == 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 "(\n length(filter(body.links,\n (\n (\n .display_text is null\n and .href_url.domain.root_domain != sender.email.domain.root_domain\n )\n or .href_url.domain.root_domain in (\n \"aka.ms\",\n \"mimecast.com\",\n \"mimecastprotect.com\",\n \"cisco.com\"\n )\n )\n )\n ) == length(body.links)\n )"
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) == 0
all of:
- (1) < (length(body.links))
- (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) == 1
any of
attachmentswhere all hold:- .file_type is 'unknown'
- .file_name ends with 'pdf'
- any(file.explode(.), .flavors.mime in ( "application/octet-stream", "application/marc" ) and .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
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(attachments)
and
attachments.file_name ends_with "pdf"
attachments.file_type eq "unknown"
macro "any(file.explode(.),\n .flavors.mime in (\n \"application/octet-stream\",\n \"application/marc\"\n )\n and .scan.entropy.entropy >= 6\n )"
any(body.links)
and
body.links.display_text is_null
body.links.href_url.url 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"
length func_call "length(filter(recipients.to,\n .email.domain.root_domain in $free_email_providers\n )\n) >= 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(.href_url.query_params_decoded["key"], . is not null)
- any(.href_url.query_params_decoded["login"], any(recipients.to, .email.local_part != .. and .email.email != .. ) )
any of:
all of:
not:
- profile.by_sender().solicited
- profile.by_sender().prevalence == "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
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"
any(body.links)
and
body.links.href_url.path eq "/wp-login.php"
macro "any(.href_url.query_params_decoded[\"key\"], . is not null)"
macro "any(.href_url.query_params_decoded[\"login\"],\n any(recipients.to,\n .email.local_part != .. and .email.email != ..\n )\n )"
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
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain in social_landing_hosts"
body.links.href_url.domain.root_domain macro "body.links[].href_url.domain.root_domain 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"
sender.email.domain.root_domain macro "sender.email.domain.root_domain in free_email_providers"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
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) == 0
any of:
any of:
- regex.icontains(strings.replace_confusables(subject.subject), '(?: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.icontains(strings.replace_confusables(subject.subject), "report")
- 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)" )
- 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:- regex.icontains(strings.replace_confusables(.text), "(?:screenshot|website)" )
any of:
all of:
- length(filter(body.current_thread.links, not (.href_url.scheme == "mailto" and .parser == "plain") ) ) == 0
- length(body.previous_threads) == 0
any of:
all of:
- (20) < (length(body.current_thread.text))
- (length(body.current_thread.text)) < (500)
- any(map(filter(ml.nlu_classifier(body.current_thread.text).entities, .name == "disclaimer" ), .text ), 20 < (length(body.current_thread.text) - length(.)) < 500 )
- 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))' )
- regex.icontains(strings.replace_confusables(body.current_thread.text), 'h(?:i|ello|ey)\b' )
- 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)' )
- regex.icontains(strings.replace_confusables(body.current_thread.text), "(?: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) == 0
all of:
- (20) < (length(body.current_thread.text))
- (length(body.current_thread.text)) < (500)
- regex.icontains(strings.replace_confusables(body.current_thread.text), "(?:screenshot|error list|plan|quote|rank|professional|price|mistake)" )
- regex.icontains(strings.replace_confusables(body.current_thread.text), '(?:h(?:i|ello|ey)|morning)\b' )
- 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)' )
- regex.icontains(strings.replace_confusables(body.current_thread.text), "(?:site|website|page|package|SEO)" )
all of:
- length(body.links) == 0
- length(body.previous_threads) < 5
any of
body.previous_threadswhere all hold:- length(.text) < 400
all of:
- regex.icontains(strings.replace_confusables(.text), '(?:h(?:i|ello|ey)|morning)\b' )
- regex.icontains(strings.replace_confusables(.text), '(?:\berror(?:\s+list)?\b|screenshot|report|plan)' )
- ml.nlu_classifier(.text).language == "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
and
body.current_thread.text length_compare "20"
body.current_thread.text length_compare "500"
macro "any(map(filter(ml.nlu_classifier(body.current_thread.text).entities,\n .name == \"disclaimer\"\n ),\n .text\n ),\n 20 < (length(body.current_thread.text) - length(.)) < 500\n )"
body.previous_threads length_compare "0"
length func_call "length(filter(body.current_thread.links,\n not (.href_url.scheme == \"mailto\" and .parser == \"plain\")\n )\n ) == 0"
regex.icontains func_call "regex.icontains(strings.replace_confusables(body.current_thread.text),\n '(?:errors?|report|issues|website|repair|redesign|upgrade|Google\\s+.{0,15}find it|glitch|send you|SEO|broken)'\n )"
regex.icontains func_call "regex.icontains(strings.replace_confusables(body.current_thread.text),\n '(?: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))'\n )"
regex.icontains func_call "regex.icontains(strings.replace_confusables(body.current_thread.text),\n 'h(?:i|ello|ey)\\b'\n )"
regex.icontains func_call "regex.icontains(strings.replace_confusables(body.current_thread.text),\n \"(?:site|website|page|package|SEO)\"\n )"
and
or
any(body.links)
body.links.href_url.domain.root_domain 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"
regex.icontains func_call "regex.icontains(strings.replace_confusables(body.current_thread.text),\n '(?:error|report|issues|website|repair|redesign|upgrade|Google\\s+.{0,15}find it|send you|SEO)'\n )"
regex.icontains func_call "regex.icontains(strings.replace_confusables(body.current_thread.text),\n '(?:h(?:i|ello|ey)|morning)\\b'\n )"
regex.icontains func_call "regex.icontains(strings.replace_confusables(body.current_thread.text),\n \"(?:screenshot|error list|plan|quote|rank|professional|price|mistake)\"\n )"
regex.icontains func_call "regex.icontains(strings.replace_confusables(body.current_thread.text),\n \"(?:site|website|page|package|SEO)\"\n )"
and
any(body.previous_threads)
and
body.previous_threads.text length_compare "400"
ml.nlu_classifier func_call "ml.nlu_classifier(.text).language == \"english\""
regex.icontains func_call "regex.icontains(strings.replace_confusables(.text),\n '(?:\\berror(?:\\s+list)?\\b|screenshot|report|plan)'\n )"
regex.icontains func_call "regex.icontains(strings.replace_confusables(.text),\n '(?:h(?:i|ello|ey)|morning)\\b'\n )"
body.links length_compare "0"
body.previous_threads length_compare "5"
or
and
any(body.previous_threads)
regex.icontains func_call "regex.icontains(strings.replace_confusables(.text),\n \"(?:screenshot|website)\"\n )"
or
subject.base length_compare "5"
subject.is_forward eq "true"
subject.is_reply eq "true"
and
regex.icontains func_call "regex.icontains(strings.replace_confusables(body.current_thread.text),\n \"(?:free|send you|can i send|may i send|let me know|interested|get back to me|reply back|just reply)\"\n )"
strings.icontains func_call "strings.icontains(strings.replace_confusables(subject.subject), \"report\")"
regex.icontains func_call "regex.icontains(strings.replace_confusables(subject.subject),\n '(?:proposal|cost|estimate|error|bug|audit|screenshot|strategy|rankings|issues|fix|website|design|review|price)'\n )"
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@]" |
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" |