Detection rules › Sublime MQL
Sublime MQL rules: abuse
Abuse: Cloudflare Workers Hosted EvilTokens Domain Structure
#Detects messages containing links to Cloudflare Workers domains that follow naming patterns designed to impersonate legitimate services such as Adobe, DocuSign, OneDrive, SharePoint, and voicemail systems. These domains use suspicious alphanumeric identifiers and may be used to deceive recipients into believing they are accessing trusted services.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Evasion, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(recipients.to) == 1
and recipients.to[0].email.domain.valid
and any(body.links,
// eviltokens cloudflare workers domain struct
(
strings.iends_with(.href_url.domain.domain, '-account.workers.dev')
and regex.icontains(.href_url.domain.domain,
'^(?:(?:page-)?adobe|calendar_invite|(?:page-)?docusign|fax|quarantine|onedrive|page-password|sharepoint|voicemail|index)-[a-z0-9]{3}\.[a-z0-9-]{3,}'
)
)
)
Detection logic
Scope: inbound message.
Detects messages containing links to Cloudflare Workers domains that follow naming patterns designed to impersonate legitimate services such as Adobe, DocuSign, OneDrive, SharePoint, and voicemail systems. These domains use suspicious alphanumeric identifiers and may be used to deceive recipients into believing they are accessing trusted services.
- inbound message
- length(recipients.to) is 1
- recipients.to[0].email.domain.valid
any of
body.linkswhere all hold:- .href_url.domain.domain ends with '-account.workers.dev'
- .href_url.domain.domain matches '^(?:(?:page-)?adobe|calendar_invite|(?:page-)?docusign|fax|quarantine|onedrive|page-password|sharepoint|voicemail|index)-[a-z0-9]{3}\\.[a-z0-9-]{3,}'
Inspects: body.links, body.links[].href_url.domain.domain, recipients.to, recipients.to[0].email.domain.valid, type.inbound. Sensors: regex.icontains, strings.iends_with.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
strings.iends_with | suffix | -account.workers.dev |
regex.icontains | regex | ^(?:(?:page-)?adobe|calendar_invite|(?:page-)?docusign|fax|quarantine|onedrive|page-password|sharepoint|voicemail|index)-[a-z0-9]{3}\.[a-z0-9-]{3,} |
Stages and Predicates
Stage 1: mql_rule
and
any(body.links)
and
body.links.href_url.domain.domain ends_with "-account.workers.dev"
body.links.href_url.domain.domain regex_match "^(?:(?:page-)?adobe|calendar_invite|(?:page-)?docusign|fax|quarantine|onedrive|page-password|sharepoint|voicemail|index)-[a-z0-9]{3}\\.[a-z0-9-]{3,}"
recipients.to length_compare "1"
recipients.to[0].email.domain.valid eq "true"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
Abuse: Robinhood injected content
#Detects messages from Robinhood with injected HTML into one of the list fields, often the 'Device' field.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and sender.email.email == "noreply@robinhood.com"
and any(html.xpath(body.html, '//div/ul[count(li) = 4]/li').nodes,
length(.raw) > 500 and strings.count(.raw, "</") > 10
)
Detection logic
Scope: inbound message.
Detects messages from Robinhood with injected HTML into one of the list fields, often the 'Device' field.
- inbound message
- sender.email.email is 'noreply@robinhood.com'
any of
html.xpath(body.html, '//div/ul[count(li) = 4]/li').nodeswhere all hold:- length(.raw) > 500
- strings.count(.raw, '</') > 10
Inspects: body.html, sender.email.email, type.inbound. Sensors: html.xpath, strings.count.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | noreply@robinhood.com |
Stages and Predicates
Stage 1: mql_rule
and
any(html.xpath(body.html, '//div/ul[count(li) = 4]/li').nodes)
and
html.xpath(body.html, '//div/ul[count(li) = 4]/li').nodes.raw length_compare "500"
strings.count func_call "strings.count(html.xpath(body.html, '//div/ul[count(li) = 4]/li').nodes[].raw, \"</\") > 10"
sender.email.email eq "noreply@robinhood.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.email.email | eq |
| field:"sender.email.email" kind:eq value:"noreply@robinhood.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Brand impersonation: QuickBooks notification from Intuit themed company name
#This detection rule matches on QuickBooks notifications that feature company names impersonating Intuit and QuickBooks.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, Credential Phishing, BEC/Fraud |
| Tactics and techniques | Evasion, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Legitimate Intuit sending infratructure
and sender.email.email == "quickbooks@notification.intuit.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and strings.ends_with(headers.auth_summary.spf.details.designator,
'.intuit.com'
)
and (
// the reply-to contains Inuit Themes
any(headers.reply_to,
(
strings.icontains(.email.email, 'intuit')
or strings.icontains(.email.domain.domain, 'quickbooks')
)
and not (.email.domain.root_domain in ('intuit.com', 'quickbooks.com'))
)
// the "company" part of the message
or regex.icontains(body.html.raw,
'<(?:div|p) class="company(?:Name|Details)[^\"]*\"[^\>]*\>[^\<]*(?:Intuit|Quickbooks).*</(?:p|div)>'
)
)
Detection logic
Scope: inbound message.
This detection rule matches on QuickBooks notifications that feature company names impersonating Intuit and QuickBooks.
- inbound message
- sender.email.email is 'quickbooks@notification.intuit.com'
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
- headers.auth_summary.spf.details.designator ends with '.intuit.com'
any of:
any of
headers.reply_towhere all hold:any of:
- .email.email contains 'intuit'
- .email.domain.domain contains 'quickbooks'
not:
- .email.domain.root_domain in ('intuit.com', 'quickbooks.com')
- body.html.raw matches '<(?:div|p) class="company(?:Name|Details)[^\\"]*\\"[^\\>]*\\>[^\\<]*(?:Intuit|Quickbooks).*</(?:p|div)>'
Inspects: body.html.raw, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.details.designator, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain.domain, headers.reply_to[].email.domain.root_domain, headers.reply_to[].email.email, sender.email.email, type.inbound. Sensors: regex.icontains, strings.ends_with, strings.icontains.
Indicators matched (5)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | quickbooks@notification.intuit.com |
strings.ends_with | suffix | .intuit.com |
strings.icontains | substring | intuit |
strings.icontains | substring | quickbooks |
regex.icontains | regex | <(?:div|p) class="company(?:Name|Details)[^\"]*\"[^\>]*\>[^\<]*(?:Intuit|Quickbooks).*</(?:p|div)> |
Stages and Predicates
Stage 1: mql_rule
and
or
any(headers.reply_to)
and
or
headers.reply_to.email.domain.domain contains "quickbooks"
headers.reply_to.email.email contains "intuit"
not
headers.reply_to.email.domain.root_domain in ["intuit.com", "quickbooks.com"]
body.html.raw regex_match "<(?:div|p) class=\"company(?:Name|Details)[^\\\"]*\\\"[^\\>]*\\>[^\\<]*(?:Intuit|Quickbooks).*</(?:p|div)>"
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.details.designator ends_with ".intuit.com"
headers.auth_summary.spf.pass eq "true"
sender.email.email eq "quickbooks@notification.intuit.com"
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 |
headers.auth_summary.dmarc.pass | eq |
| field:"headers.auth_summary.dmarc.pass" kind:eq value:"true" |
headers.auth_summary.spf.details.designator | ends_with |
| field:"headers.auth_summary.spf.details.designator" kind:ends_with value:".intuit.com" |
headers.auth_summary.spf.pass | eq |
| field:"headers.auth_summary.spf.pass" kind:eq value:"true" |
sender.email.email | eq |
| field:"sender.email.email" kind:eq value:"quickbooks@notification.intuit.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Google services using g.co shortlinks
#Identifies messages from authenticated Google domains containing g.co shortened URLs with a subdomain in either the message body links or thread text.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Evasion, Free email provider |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// allow for multiple google TLDs
and sender.email.domain.sld == "google"
and headers.auth_summary.spf.pass
// g.co url shortner in links or the current thread to identify the workspace name
and (
any(body.links,
.href_url.domain.root_domain == 'g.co'
and .href_url.domain.subdomain is not null
)
or (
strings.icontains(body.current_thread.text, '.g.co')
and regex.icontains(body.current_thread.text, '[^\s]+\.g\.co\b')
)
)
Detection logic
Scope: inbound message.
Identifies messages from authenticated Google domains containing g.co shortened URLs with a subdomain in either the message body links or thread text.
- inbound message
- sender.email.domain.sld is 'google'
- headers.auth_summary.spf.pass
any of:
any of
body.linkswhere all hold:- .href_url.domain.root_domain is 'g.co'
- .href_url.domain.subdomain is set
all of:
- body.current_thread.text contains '.g.co'
- body.current_thread.text matches '[^\\s]+\\.g\\.co\\b'
Inspects: body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, body.links[].href_url.domain.subdomain, headers.auth_summary.spf.pass, sender.email.domain.sld, type.inbound. Sensors: regex.icontains, strings.icontains.
Indicators matched (4)
| Field | Match | Value |
|---|---|---|
sender.email.domain.sld | equals | google |
body.links[].href_url.domain.root_domain | equals | g.co |
strings.icontains | substring | .g.co |
regex.icontains | regex | [^\s]+\.g\.co\b |
Stages and Predicates
Stage 1: mql_rule
and
or
any(body.links)
and
body.links.href_url.domain.root_domain eq "g.co"
body.links.href_url.domain.subdomain is_not_null
and
body.current_thread.text contains ".g.co"
body.current_thread.text regex_match "[^\\s]+\\.g\\.co\\b"
headers.auth_summary.spf.pass eq "true"
sender.email.domain.sld eq "google"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
Service abuse: Adobe Sign notification from an unsolicited reply-to address
#Identifies messages appearing to come from Adobe Sign signature notifications that contain a reply-to address not previously seen in organizational communications. This tactic exploits trust in legitimate Adobe services while attempting to establish unauthorized communication channels.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Callback Phishing, Spam |
| Tactics and techniques | Social engineering, Impersonation: Brand |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Legitimate Adobe Sign sending infratructure
and sender.email.email == "adobesign@adobesign.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and strings.icontains(subject.subject, 'signature requested')
//
// This rule makes use of a beta feature and is subject to change without notice
// using the beta feature in custom rules is not suggested until it has been formally released
//
// reply-to address has never sent an email to the org
and beta.profile.by_reply_to().prevalence == "new"
// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited
// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign
Detection logic
Scope: inbound message.
Identifies messages appearing to come from Adobe Sign signature notifications that contain a reply-to address not previously seen in organizational communications. This tactic exploits trust in legitimate Adobe services while attempting to establish unauthorized communication channels.
- inbound message
- sender.email.email is 'adobesign@adobesign.com'
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
- subject.subject contains 'signature requested'
- beta.profile.by_reply_to().prevalence is 'new'
not:
- beta.profile.by_reply_to().solicited
not:
- beta.profile.by_reply_to().any_messages_benign
Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, sender.email.email, subject.subject, type.inbound. Sensors: beta.profile.by_reply_to, strings.icontains.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | adobesign@adobesign.com |
strings.icontains | substring | signature requested |
Stages and Predicates
Stage 1: mql_rule
and
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().prevalence == new"
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.pass eq "true"
sender.email.email eq "adobesign@adobesign.com"
subject.subject contains "signature requested"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
Service abuse: Amazon invitation with suspected callback phishing
#Detects Amazon's no-reply address with a subject about invitation sending, containing phone numbers within HTML header elements. This pattern is commonly used to trick recipients into calling fraudulent customer service numbers.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing |
| Tactics and techniques | Out of band pivot, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and sender.email.email == 'no-reply@amazon.com'
and subject.base == 'Your invitation has been sent'
and any(html.xpath(body.html, "//h2[contains(@class, 'rio-header')]").nodes,
// phone number regex
regex.icontains(strings.replace_confusables(.display_text),
'\+?(?:[ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}',
'\+?(?:[ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4}'
)
)
Detection logic
Scope: inbound message.
Detects Amazon's no-reply address with a subject about invitation sending, containing phone numbers within HTML header elements. This pattern is commonly used to trick recipients into calling fraudulent customer service numbers.
- inbound message
- sender.email.email is 'no-reply@amazon.com'
- subject.base is 'Your invitation has been sent'
any of
html.xpath(body.html, "//h2[contains(@class, 'rio-header')]").nodeswhere:strings.replace_confusables(.display_text) matches any of 2 patterns
\+?(?:[ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}\+?(?:[ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4}
Inspects: body.html, sender.email.email, subject.base, type.inbound. Sensors: html.xpath, regex.icontains, strings.replace_confusables.
Indicators matched (4)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | no-reply@amazon.com |
subject.base | equals | Your invitation has been sent |
regex.icontains | regex | \+?(?:[ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4} |
regex.icontains | regex | \+?(?:[ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4} |
Stages and Predicates
Stage 1: mql_rule
and
any(html.xpath(body.html, "//h2[contains(@class, 'rio-header')]").nodes)
or
strings.replace_confusables(html.xpath(body.html, "//h2[contains(@class, 'rio-header')]").nodes[].display_text) regex_match "\\+?(?:[ilo0-9]{1,2})?\\s?\\(?\\d{3}\\)?[\\s\\.\\-⋅]{0,5}[ilo0-9]{3}[\\s\\.\\-⋅]{0,5}[ilo0-9]{4}"
strings.replace_confusables(html.xpath(body.html, "//h2[contains(@class, 'rio-header')]").nodes[].display_text) regex_match "\\+?(?:[ilo0-9]{1}.)?\\(?[ilo0-9]{3}?\\)?.[ilo0-9]{3}.?[ilo0-9]{4}"
sender.email.email eq "no-reply@amazon.com"
subject.base eq "Your invitation has been sent"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.email.email | eq |
| field:"sender.email.email" kind:eq value:"no-reply@amazon.com" |
subject.base | eq |
| field:"subject.base" kind:eq value:"Your invitation has been sent" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Behance document sharing with suspicious language
#Detects messages containing document sharing language with a single Behance gallery link, potentially indicating abuse of the legitimate Adobe Behance platform for malicious purposes.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Free file host, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(body.current_thread.text) < 10000
and strings.ilike(body.current_thread.text,
"*proposal*",
"*specified link*",
"*secure*"
)
and length(filter(body.current_thread.links,
.href_url.domain.root_domain == 'behance.net'
and strings.icontains(.href_url.path, '/gallery/')
and .display_url.domain.root_domain == 'behance.net'
and strings.icontains(.display_url.path, '/gallery/')
)
) == 1
and not (
sender.email.domain.root_domain in $high_trust_sender_root_domains
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
Detects messages containing document sharing language with a single Behance gallery link, potentially indicating abuse of the legitimate Adobe Behance platform for malicious purposes.
- inbound message
- length(body.current_thread.text) < 10000
body.current_thread.text matches any of 3 patterns
*proposal**specified link**secure*
- length(filter(body.current_thread.links, .href_url.domain.root_domain == 'behance.net' and strings.icontains(.href_url.path, '/gallery/') and .display_url.domain.root_domain == 'behance.net' and strings.icontains(.display_url.path, '/gallery/'))) is 1
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass)
Inspects: body.current_thread.links, body.current_thread.links[].display_url.domain.root_domain, body.current_thread.links[].display_url.path, body.current_thread.links[].href_url.domain.root_domain, body.current_thread.links[].href_url.path, body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: strings.icontains, strings.ilike. Reference lists: $high_trust_sender_root_domains.
Indicators matched (6)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *proposal* |
strings.ilike | substring | *specified link* |
strings.ilike | substring | *secure* |
body.current_thread.links[].href_url.domain.root_domain | equals | behance.net |
strings.icontains | substring | /gallery/ |
body.current_thread.links[].display_url.domain.root_domain | equals | behance.net |
Stages and Predicates
Stage 1: mql_rule
and
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
or
body.current_thread.text match "proposal"
body.current_thread.text match "secure"
body.current_thread.text match "specified link"
body.current_thread.text length_compare "10000"
filter(body.current_thread.links, .href_url.domain.root_domain == 'behance.net' and strings.icontains(.href_url.path, '/gallery/') and .display_url.domain.root_domain == 'behance.net' and strings.icontains(.display_url.path, '/gallery/')) length_compare "1"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | wildcard |
| field:"body.current_thread.text" kind:wildcard |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service Abuse: Box file sharing with credential phishing intent
#Detects abuse of Box's legitimate infrastructure for credential phishing attacks.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, BEC/Fraud, Callback Phishing |
| Tactics and techniques | Evasion, Social engineering, Impersonation: Employee, Impersonation: VIP |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Legitimate Box sending infrastructure
and sender.email.domain.root_domain == "box.com"
// ML classification indicates credential theft with high confidence
and (
any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "cred_theft" and .confidence == "high"
)
// Link analysis for credential phishing detection
or any(filter(body.links,
// target the box link
(
.href_url.domain.domain == "app.box.com"
)
),
ml.link_analysis(., mode="aggressive").credphish.disposition == "phishing"
and ml.link_analysis(., mode="aggressive").credphish.confidence in (
"medium",
"high"
)
)
)
// Box file sharing patterns
and (
strings.icontains(subject.subject, 'invited you to')
or strings.icontains(subject.subject, 'shared')
or strings.icontains(subject.subject, 'has sent you')
or strings.icontains(body.current_thread.text, 'Go to File')
or any(body.links, strings.icontains(.display_text, 'Go to File'))
)
// Suspicious document patterns or VIP impersonation
and (
// Financial document patterns
(
regex.icontains(subject.subject,
'\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\b'
)
or regex.icontains(body.current_thread.text,
'\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\b'
)
or any(body.links,
regex.icontains(.display_text,
'\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\b'
)
)
)
// Corporate document patterns
or (
regex.icontains(subject.subject,
'\b(urgent|important|confidential|secure|encrypted|document|file)\b'
)
and regex.icontains(subject.subject,
'\b(review|approval|signature|verification|validation)\b'
)
)
)
Detection logic
Scope: inbound message.
Detects abuse of Box's legitimate infrastructure for credential phishing attacks.
- inbound message
- sender.email.domain.root_domain is 'box.com'
any of:
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name is 'cred_theft'
- .confidence is 'high'
any of
filter(body.links)where all hold:- ml.link_analysis(.).credphish.disposition is 'phishing'
- ml.link_analysis(.).credphish.confidence in ('medium', 'high')
any of:
- subject.subject contains 'invited you to'
- subject.subject contains 'shared'
- subject.subject contains 'has sent you'
- body.current_thread.text contains 'Go to File'
any of
body.linkswhere:- .display_text contains 'Go to File'
any of:
any of:
- subject.subject matches '\\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\\b'
- body.current_thread.text matches '\\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\\b'
any of
body.linkswhere:- .display_text matches '\\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\\b'
all of:
- subject.subject matches '\\b(urgent|important|confidential|secure|encrypted|document|file)\\b'
- subject.subject matches '\\b(review|approval|signature|verification|validation)\\b'
Inspects: body.current_thread.text, body.links, body.links[].display_text, body.links[].href_url.domain.domain, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: ml.link_analysis, ml.nlu_classifier, regex.icontains, strings.icontains.
Indicators matched (11)
| Field | Match | Value |
|---|---|---|
sender.email.domain.root_domain | equals | box.com |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | equals | high |
body.links[].href_url.domain.domain | equals | app.box.com |
strings.icontains | substring | invited you to |
strings.icontains | substring | shared |
strings.icontains | substring | has sent you |
strings.icontains | substring | Go to File |
regex.icontains | regex | \b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\b |
regex.icontains | regex | \b(urgent|important|confidential|secure|encrypted|document|file)\b |
regex.icontains | regex | \b(review|approval|signature|verification|validation)\b |
Stages and Predicates
Stage 1: mql_rule
and
or
any(filter(body.links))
and
ml.link_analysis func_call "ml.link_analysis(filter(body.links)[]).credphish.confidence in (medium, high)"
ml.link_analysis func_call "ml.link_analysis(filter(body.links)[]).credphish.disposition == phishing"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
or
any(body.links)
body.links.display_text contains "Go to File"
body.current_thread.text contains "Go to File"
subject.subject contains "has sent you"
subject.subject contains "invited you to"
subject.subject contains "shared"
or
any(body.links)
body.links.display_text regex_match "\\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\\b"
and
subject.subject regex_match "\\b(review|approval|signature|verification|validation)\\b"
subject.subject regex_match "\\b(urgent|important|confidential|secure|encrypted|document|file)\\b"
body.current_thread.text regex_match "\\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\\b"
subject.subject regex_match "\\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\\b"
sender.email.domain.root_domain eq "box.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains value:"Go to File" |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match value:"\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\b" |
sender.email.domain.root_domain | eq |
| field:"sender.email.domain.root_domain" kind:eq value:"box.com" |
subject.subject | contains |
| field:"subject.subject" kind:contains |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Demio notifications with suspicious content patterns
#Detects messages from Demio notifications service containing suspicious patterns including phone numbers, monetary amounts, suspicious domain references, explicit content lures, or lengthy action-oriented subjects designed to manipulate recipients.
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
//
// Warning: This rule contains sexually explicit keywords
//
and sender.email.email == 'notifications@demio.com'
and (
// phone number regex
regex.icontains(subject.base,
'\+?(?:[ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}',
'\+?(?:[ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4}'
)
// dollar amounts
or regex.icontains(subject.base, '(?:USD|\$)\s?\d')
or regex.icontains(subject.base, '\d+\.\d{2}\s?(?:USD|usd)')
// suspicious TLDs
or regex.icontains(subject.base,
'\.(?:ac\.th|biz\.id|co\.(?:cl|id|za)|com\.(?:ge|py)|my\.id|ne\.jp|net\.ms|nom\.za|web\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\b'
)
// dating/spam/explicit content lures
or regex.icontains(strings.replace_confusables(subject.base),
'(?:\bs\s?e\s?x\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)'
)
// action verbs + length
or (
strings.count(subject.base, " ") > 8
and regex.icontains(strings.replace_confusables(subject.base),
'(?:call|dial|speak to|contact \d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))'
)
)
)
Detection logic
Scope: inbound message.
Detects messages from Demio notifications service containing suspicious patterns including phone numbers, monetary amounts, suspicious domain references, explicit content lures, or lengthy action-oriented subjects designed to manipulate recipients.
- inbound message
- sender.email.email is 'notifications@demio.com'
any of:
subject.base matches any of 2 patterns
\+?(?:[ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}\+?(?:[ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4}
- subject.base matches '(?:USD|\\$)\\s?\\d'
- subject.base matches '\\d+\\.\\d{2}\\s?(?:USD|usd)'
- subject.base matches '\\.(?:ac\\.th|biz\\.id|co\\.(?:cl|id|za)|com\\.(?:ge|py)|my\\.id|ne\\.jp|net\\.ms|nom\\.za|web\\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\\b'
- strings.replace_confusables(subject.base) matches '(?:\\bs\\s?e\\s?x\\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)'
all of:
- strings.count(subject.base, ' ') > 8
- strings.replace_confusables(subject.base) matches '(?:call|dial|speak to|contact \\d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))'
Inspects: sender.email.email, subject.base, type.inbound. Sensors: regex.icontains, strings.count, strings.replace_confusables.
Indicators matched (8)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | notifications@demio.com |
regex.icontains | regex | \+?(?:[ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4} |
regex.icontains | regex | \+?(?:[ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4} |
regex.icontains | regex | (?:USD|\$)\s?\d |
regex.icontains | regex | \d+\.\d{2}\s?(?:USD|usd) |
regex.icontains | regex | \.(?:ac\.th|biz\.id|co\.(?:cl|id|za)|com\.(?:ge|py)|my\.id|ne\.jp|net\.ms|nom\.za|web\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\b |
regex.icontains | regex | (?:\bs\s?e\s?x\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner) |
regex.icontains | regex | (?:call|dial|speak to|contact \d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze)) |
Stages and Predicates
Stage 1: mql_rule
and
or
and
strings.count func_call "strings.count(subject.base, \" \") > 8"
strings.replace_confusables(subject.base) regex_match "(?:call|dial|speak to|contact \\d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))"
strings.replace_confusables(subject.base) regex_match "(?:\\bs\\s?e\\s?x\\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)"
subject.base regex_match "(?:USD|\\$)\\s?\\d"
subject.base regex_match "\\+?(?:[ilo0-9]{1,2})?\\s?\\(?\\d{3}\\)?[\\s\\.\\-⋅]{0,5}[ilo0-9]{3}[\\s\\.\\-⋅]{0,5}[ilo0-9]{4}"
subject.base regex_match "\\+?(?:[ilo0-9]{1}.)?\\(?[ilo0-9]{3}?\\)?.[ilo0-9]{3}.?[ilo0-9]{4}"
subject.base regex_match "\\.(?:ac\\.th|biz\\.id|co\\.(?:cl|id|za)|com\\.(?:ge|py)|my\\.id|ne\\.jp|net\\.ms|nom\\.za|web\\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\\b"
subject.base regex_match "\\d+\\.\\d{2}\\s?(?:USD|usd)"
sender.email.email eq "notifications@demio.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.email.email | eq |
| field:"sender.email.email" kind:eq value:"notifications@demio.com" |
strings.replace_confusables(subject.base) | regex_match |
| field:"strings.replace_confusables(subject.base)" kind:regex_match |
subject.base | regex_match |
| field:"subject.base" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: DocSend share from an unsolicited reply-to address
#DocSend shares which contain a reply-to address or domain that has not been previously observed by the recipient organization.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Evasion, Free file host, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Legitimate DocSend sending infratructure
and sender.email.email == "no-reply@docsend.com"
//
// This rule makes use of a beta feature and is subject to change without notice
// using the beta feature in custom rules is not suggested until it has been formally released
//
// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited
// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign
Detection logic
Scope: inbound message.
DocSend shares which contain a reply-to address or domain that has not been previously observed by the recipient organization.
- inbound message
- sender.email.email is 'no-reply@docsend.com'
not:
- beta.profile.by_reply_to().solicited
not:
- beta.profile.by_reply_to().any_messages_benign
Inspects: sender.email.email, type.inbound. Sensors: beta.profile.by_reply_to.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | no-reply@docsend.com |
Stages and Predicates
Stage 1: mql_rule
and
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
sender.email.email eq "no-reply@docsend.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.email.email | eq |
| field:"sender.email.email" kind:eq value:"no-reply@docsend.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: DocSend share from newly registered domain
#This Attack Surface Reduction (ASR) rule matches on DocSend notifications with recently registered reply-to domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Credential Phishing |
| Tactics and techniques | Evasion, Free file host, Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Legitimate DocSend sending infratructure
and sender.email.email == "no-reply@docsend.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
// the message needs to have a reply-to address
and length(headers.reply_to) > 0
// reply-to email address has never received an email from your org
and not any(headers.reply_to, .email.email in $recipient_emails)
// new reply-to
and any(headers.reply_to, network.whois(.email.domain).days_old < 30)
Detection logic
Scope: inbound message.
This Attack Surface Reduction (ASR) rule matches on DocSend notifications with recently registered reply-to domains.
- inbound message
- sender.email.email is 'no-reply@docsend.com'
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
- length(headers.reply_to) > 0
not:
any of
headers.reply_towhere:- .email.email in $recipient_emails
any of
headers.reply_towhere:- network.whois(.email.domain).days_old < 30
Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain, headers.reply_to[].email.email, sender.email.email, type.inbound. Sensors: network.whois. Reference lists: $recipient_emails.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | no-reply@docsend.com |
Stages and Predicates
Stage 1: mql_rule
and
not
any(headers.reply_to)
macro "headers.reply_to[].email.email in recipient_emails"
any(headers.reply_to)
network.whois func_call "network.whois(headers.reply_to[].email.domain).days_old < 30"
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.pass eq "true"
headers.reply_to length_compare "0"
sender.email.email eq "no-reply@docsend.com"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.reply_to | array_any | excludes:headers.reply_to |
Indicators
These rows show field, operator, and value matches.
Service abuse: DocuSign notification with suspicious sender or document name
#The detection rule is intended to match on messages sent from Docusign from a newly observed reply-to address which contains suspicious content within the document or sender display name.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, BEC/Fraud |
| Tactics and techniques | Evasion, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and length(attachments) == 0
// Legitimate Docusign sending infratructure
and sender.email.domain.root_domain == 'docusign.net'
and (headers.auth_summary.spf.pass or headers.auth_summary.dmarc.pass)
and length(headers.reply_to) > 0
and not any(headers.reply_to,
.email.domain.domain in $org_domains
or .email.domain.root_domain in $high_trust_sender_root_domains
or .email.domain.root_domain in ("docusign.net", "docusign.com")
)
//
// This rule makes use of a beta feature and is subject to change without notice
// using the beta feature in custom rules is not suggested until it has been formally released
//
// reply-to address has never sent an email to the org
and beta.profile.by_reply_to().prevalence == "new"
// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited
// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign
// not a completed DocuSign
// reminders are sent automatically and can be just as malicious as the initial
// users often decline malicious ones
and not strings.istarts_with(subject.subject, "Completed: ")
and not strings.istarts_with(subject.subject, "Here is your signed document: ")
and not strings.istarts_with(subject.subject, "Voided: ")
and (
// contains the word docusign before the `via Docusign` part
regex.icontains(sender.display_name, 'Docusign.*via Docusign$')
or strings.icontains(subject.subject, 'sharefile')
or strings.icontains(subject.subject, 'helloshare')
// sender names part of the subject
or (
// Billing Accounting
regex.icontains(sender.display_name,
'Accounts? (?:Payable|Receivable).*via Docusign$',
'Billing Support.*via Docusign$'
)
// HR/Payroll/Legal/etc
or regex.icontains(sender.display_name, 'Compliance HR.*via Docusign$')
or regex.icontains(sender.display_name,
'(?:Compliance|Executive|Finance|\bHR\b|Human Resources|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*(?:Department|Team)?.*via Docusign$'
)
or regex.icontains(sender.display_name,
'Corporate Communications.*via Docusign$'
)
or regex.icontains(sender.display_name, 'Employee Relations.*via Docusign$')
or regex.icontains(sender.display_name, 'Office Manager.*via Docusign$')
or regex.icontains(sender.display_name, 'Risk Management.*via Docusign$')
or regex.icontains(sender.display_name,
'Payroll Admin(?:istrator).*via Docusign$'
)
// IT related
or regex.icontains(sender.display_name,
'IT Support.*via Docusign$',
'Information Technology.*via Docusign$',
'(?:Network|System)? Admin(?:istrator).*via Docusign$',
'Help Desk.*via Docusign$',
'Tech(?:nical) Support.*via Docusign$'
)
)
// filename analysis
// the filename is also contained in the subject line
or (
// scanner themed
regex.icontains(subject.subject, 'scanne[rd]')
// image theme
or regex.icontains(subject.subject, '_IMG_')
or regex.icontains(subject.subject, 'IMG[_-](?:\d|\W)+')
// Invoice Themes
or regex.icontains(subject.subject, 'Invoice')
or regex.icontains(subject.subject, 'INV\b')
or regex.icontains(subject.subject, 'Payment')
or regex.icontains(subject.subject, '\bACH\b')
or regex.icontains(subject.subject, 'Wire Confirmation')
or regex.icontains(subject.subject, 'P[O0]\W+?\d+\"')
or regex.icontains(subject.subject, 'P[O0](?:\W+?|\d+)')
or regex.icontains(subject.subject, 'receipt')
or regex.icontains(subject.subject, 'Billing')
or regex.icontains(subject.subject, 'statement')
or regex.icontains(subject.subject, 'Past Due')
or regex.icontains(subject.subject, 'Remit(?:tance)?')
or regex.icontains(subject.subject, 'Purchase Order')
or regex.icontains(subject.subject, 'Settlementt')
// contract language
or regex.icontains(subject.subject, 'Pr[0o]p[0o]sal')
or regex.icontains(subject.subject, 'Claim Doc')
// Payroll/HR
or regex.icontains(subject.subject, 'Payroll')
or regex.icontains(subject.subject, 'Employee Pay\b')
or regex.icontains(subject.subject, 'Salary')
or regex.icontains(subject.subject, 'Benefit Enrollment')
or regex.icontains(subject.subject, 'Employee Handbook')
or regex.icontains(subject.subject, 'Reimbursement Approved')
//
// shared files/extenstion/urgency/CTA
or regex.icontains(subject.subject, 'Urgent')
or regex.icontains(subject.subject, 'Important')
or regex.icontains(subject.subject, 'Secure')
or regex.icontains(subject.subject, 'Encrypt')
or regex.icontains(subject.subject, 'shared')
or regex.icontains(subject.subject, 'protected')
or regex.icontains(subject.subject, 'Validate')
or regex.icontains(subject.subject, 'Action Required')
or regex.icontains(subject.subject, 'Final Notice')
or regex.icontains(subject.subject, 'Review(?: and| & |\s+)?Sign')
or regex.icontains(subject.subject, 'Download PDF')
// MFA theme
or regex.icontains(subject.subject, 'Verification Code')
or regex.icontains(subject.subject, '\bMFA\b')
)
)
Detection logic
Scope: inbound message.
The detection rule is intended to match on messages sent from Docusign from a newly observed reply-to address which contains suspicious content within the document or sender display name.
- inbound message
- length(attachments) is 0
- sender.email.domain.root_domain is 'docusign.net'
any of:
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
- length(headers.reply_to) > 0
not:
any of
headers.reply_towhere any holds:- .email.domain.domain in $org_domains
- .email.domain.root_domain in $high_trust_sender_root_domains
- .email.domain.root_domain in ('docusign.net', 'docusign.com')
- beta.profile.by_reply_to().prevalence is 'new'
not:
- beta.profile.by_reply_to().solicited
not:
- beta.profile.by_reply_to().any_messages_benign
not:
- subject.subject starts with 'Completed: '
not:
- subject.subject starts with 'Here is your signed document: '
not:
- subject.subject starts with 'Voided: '
any of:
- sender.display_name matches 'Docusign.*via Docusign$'
- subject.subject contains 'sharefile'
- subject.subject contains 'helloshare'
sender.display_name matches any of 14 patterns
Accounts? (?:Payable|Receivable).*via Docusign$Billing Support.*via Docusign$Compliance HR.*via Docusign$(?:Compliance|Executive|Finance|\bHR\b|Human Resources|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*(?:Department|Team)?.*via Docusign$Corporate Communications.*via Docusign$Employee Relations.*via Docusign$Office Manager.*via Docusign$Risk Management.*via Docusign$Payroll Admin(?:istrator).*via Docusign$IT Support.*via Docusign$Information Technology.*via Docusign$(?:Network|System)? Admin(?:istrator).*via Docusign$Help Desk.*via Docusign$Tech(?:nical) Support.*via Docusign$
subject.subject matches any of 38 patterns
scanne[rd]_IMG_IMG[_-](?:\d|\W)+InvoiceINV\bPayment\bACH\bWire ConfirmationP[O0]\W+?\d+\"P[O0](?:\W+?|\d+)receiptBillingstatementPast DueRemit(?:tance)?Purchase OrderSettlementtPr[0o]p[0o]salClaim DocPayrollEmployee Pay\bSalaryBenefit EnrollmentEmployee HandbookReimbursement ApprovedUrgentImportantSecureEncryptsharedprotectedValidateAction RequiredFinal NoticeReview(?: and| & |\s+)?SignDownload PDFVerification Code\bMFA\b
Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain.domain, headers.reply_to[].email.domain.root_domain, sender.display_name, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: beta.profile.by_reply_to, regex.icontains, strings.icontains, strings.istarts_with. Reference lists: $high_trust_sender_root_domains, $org_domains.
Indicators matched (56)
| Field | Match | Value |
|---|---|---|
sender.email.domain.root_domain | equals | docusign.net |
regex.icontains | regex | Docusign.*via Docusign$ |
strings.icontains | substring | sharefile |
strings.icontains | substring | helloshare |
regex.icontains | regex | Accounts? (?:Payable|Receivable).*via Docusign$ |
regex.icontains | regex | Billing Support.*via Docusign$ |
regex.icontains | regex | Compliance HR.*via Docusign$ |
regex.icontains | regex | (?:Compliance|Executive|Finance|\bHR\b|Human Resources|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*(?:Department|Team)?.*via Docusign$ |
regex.icontains | regex | Corporate Communications.*via Docusign$ |
regex.icontains | regex | Employee Relations.*via Docusign$ |
regex.icontains | regex | Office Manager.*via Docusign$ |
regex.icontains | regex | Risk Management.*via Docusign$ |
44 more
regex.icontains | regex | Payroll Admin(?:istrator).*via Docusign$ |
regex.icontains | regex | IT Support.*via Docusign$ |
regex.icontains | regex | Information Technology.*via Docusign$ |
regex.icontains | regex | (?:Network|System)? Admin(?:istrator).*via Docusign$ |
regex.icontains | regex | Help Desk.*via Docusign$ |
regex.icontains | regex | Tech(?:nical) Support.*via Docusign$ |
regex.icontains | regex | scanne[rd] |
regex.icontains | regex | _IMG_ |
regex.icontains | regex | IMG[_-](?:\d|\W)+ |
regex.icontains | regex | Invoice |
regex.icontains | regex | INV\b |
regex.icontains | regex | Payment |
regex.icontains | regex | \bACH\b |
regex.icontains | regex | Wire Confirmation |
regex.icontains | regex | P[O0]\W+?\d+\" |
regex.icontains | regex | P[O0](?:\W+?|\d+) |
regex.icontains | regex | receipt |
regex.icontains | regex | Billing |
regex.icontains | regex | statement |
regex.icontains | regex | Past Due |
regex.icontains | regex | Remit(?:tance)? |
regex.icontains | regex | Purchase Order |
regex.icontains | regex | Settlementt |
regex.icontains | regex | Pr[0o]p[0o]sal |
regex.icontains | regex | Claim Doc |
regex.icontains | regex | Payroll |
regex.icontains | regex | Employee Pay\b |
regex.icontains | regex | Salary |
regex.icontains | regex | Benefit Enrollment |
regex.icontains | regex | Employee Handbook |
regex.icontains | regex | Reimbursement Approved |
regex.icontains | regex | Urgent |
regex.icontains | regex | Important |
regex.icontains | regex | Secure |
regex.icontains | regex | Encrypt |
regex.icontains | regex | shared |
regex.icontains | regex | protected |
regex.icontains | regex | Validate |
regex.icontains | regex | Action Required |
regex.icontains | regex | Final Notice |
regex.icontains | regex | Review(?: and| & |\s+)?Sign |
regex.icontains | regex | Download PDF |
regex.icontains | regex | Verification Code |
regex.icontains | regex | \bMFA\b |
Stages and Predicates
Stage 1: mql_rule
and
not
any(headers.reply_to)
or
headers.reply_to.email.domain.root_domain in ["docusign.com", "docusign.net"]
macro "headers.reply_to[].email.domain.domain in org_domains"
macro "headers.reply_to[].email.domain.root_domain in high_trust_sender_root_domains"
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
or
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.pass eq "true"
or
sender.display_name regex_match "(?:Compliance|Executive|Finance|\\bHR\\b|Human Resources|\\bIT\\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*(?:Department|Team)?.*via Docusign$"
sender.display_name regex_match "(?:Network|System)? Admin(?:istrator).*via Docusign$"
sender.display_name regex_match "Accounts? (?:Payable|Receivable).*via Docusign$"
sender.display_name regex_match "Billing Support.*via Docusign$"
sender.display_name regex_match "Compliance HR.*via Docusign$"
sender.display_name regex_match "Corporate Communications.*via Docusign$"
sender.display_name regex_match "Docusign.*via Docusign$"
sender.display_name regex_match "Employee Relations.*via Docusign$"
sender.display_name regex_match "Help Desk.*via Docusign$"
sender.display_name regex_match "IT Support.*via Docusign$"
sender.display_name regex_match "Information Technology.*via Docusign$"
sender.display_name regex_match "Office Manager.*via Docusign$"
sender.display_name regex_match "Payroll Admin(?:istrator).*via Docusign$"
sender.display_name regex_match "Risk Management.*via Docusign$"
sender.display_name regex_match "Tech(?:nical) Support.*via Docusign$"
subject.subject contains "helloshare"
subject.subject contains "sharefile"
subject.subject regex_match "Action Required"
subject.subject regex_match "Benefit Enrollment"
subject.subject regex_match "Billing"
subject.subject regex_match "Claim Doc"
subject.subject regex_match "Download PDF"
subject.subject regex_match "Employee Handbook"
subject.subject regex_match "Employee Pay\\b"
subject.subject regex_match "Encrypt"
subject.subject regex_match "Final Notice"
subject.subject regex_match "IMG[_-](?:\\d|\\W)+"
subject.subject regex_match "INV\\b"
subject.subject regex_match "Important"
subject.subject regex_match "Invoice"
subject.subject regex_match "P[O0](?:\\W+?|\\d+)"
subject.subject regex_match "P[O0]\\W+?\\d+\\\""
subject.subject regex_match "Past Due"
subject.subject regex_match "Payment"
subject.subject regex_match "Payroll"
subject.subject regex_match "Pr[0o]p[0o]sal"
subject.subject regex_match "Purchase Order"
subject.subject regex_match "Reimbursement Approved"
subject.subject regex_match "Remit(?:tance)?"
subject.subject regex_match "Review(?: and| & |\\s+)?Sign"
subject.subject regex_match "Salary"
subject.subject regex_match "Secure"
subject.subject regex_match "Settlementt"
subject.subject regex_match "Urgent"
subject.subject regex_match "Validate"
subject.subject regex_match "Verification Code"
subject.subject regex_match "Wire Confirmation"
subject.subject regex_match "\\bACH\\b"
subject.subject regex_match "\\bMFA\\b"
subject.subject regex_match "_IMG_"
subject.subject regex_match "protected"
subject.subject regex_match "receipt"
subject.subject regex_match "scanne[rd]"
subject.subject regex_match "shared"
subject.subject regex_match "statement"
not
subject.subject starts_with "Completed: "
not
subject.subject starts_with "Here is your signed document: "
not
subject.subject starts_with "Voided: "
attachments length_compare "0"
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().prevalence == new"
headers.reply_to length_compare "0"
sender.email.domain.root_domain eq "docusign.net"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.reply_to | array_any | excludes:headers.reply_to | |
subject.subject | starts_with | Completed: | excludes:subject.subject field:"subject.subject" value:"Completed: " |
subject.subject | starts_with | Here is your signed document: | excludes:subject.subject field:"subject.subject" value:"Here is your signed document: " |
subject.subject | starts_with | Voided: | excludes:subject.subject field:"subject.subject" value:"Voided: " |
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:"true" |
headers.auth_summary.spf.pass | eq |
| field:"headers.auth_summary.spf.pass" kind:eq value:"true" |
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match |
sender.email.domain.root_domain | eq |
| field:"sender.email.domain.root_domain" kind:eq value:"docusign.net" |
subject.subject | contains |
| field:"subject.subject" kind:contains |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: DocuSign share from an unsolicited reply-to address
#DocuSign shares which contain a reply-to address or domain that has not been previously observed by the recipient organization.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Evasion, Free file host, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// message is from docusign actual
and sender.email.domain.root_domain == 'docusign.net'
and not any(headers.reply_to, .email.domain.domain == 'docusign.com')
and (headers.auth_summary.spf.pass or headers.auth_summary.dmarc.pass)
// not a completed DocuSign
// reminders are sent automatically and can be just as malicious as the initial
// users often decline malicious ones
and not strings.istarts_with(subject.subject, "Completed: ")
and not strings.istarts_with(subject.subject, "Here is your signed document: ")
and not strings.istarts_with(subject.subject, "Voided: ")
//
// This rule makes use of a beta feature and is subject to change without notice
// using the beta feature in custom rules is not suggested until it has been formally released
//
// reply-to address rarely seen in org
and beta.profile.by_reply_to().prevalence in~ ("new", "rare")
// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited
// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign
Detection logic
Scope: inbound message.
DocuSign shares which contain a reply-to address or domain that has not been previously observed by the recipient organization.
- inbound message
- sender.email.domain.root_domain is 'docusign.net'
not:
any of
headers.reply_towhere:- .email.domain.domain is 'docusign.com'
any of:
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
not:
- subject.subject starts with 'Completed: '
not:
- subject.subject starts with 'Here is your signed document: '
not:
- subject.subject starts with 'Voided: '
- beta.profile.by_reply_to().prevalence in ('new', 'rare')
not:
- beta.profile.by_reply_to().solicited
not:
- beta.profile.by_reply_to().any_messages_benign
Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain.domain, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: beta.profile.by_reply_to, strings.istarts_with.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
sender.email.domain.root_domain | equals | docusign.net |
Stages and Predicates
Stage 1: mql_rule
and
not
any(headers.reply_to)
headers.reply_to.email.domain.domain eq "docusign.com"
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
or
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.pass eq "true"
not
subject.subject starts_with "Completed: "
not
subject.subject starts_with "Here is your signed document: "
not
subject.subject starts_with "Voided: "
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().prevalence in~ (new, rare)"
sender.email.domain.root_domain eq "docusign.net"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.reply_to | array_any | excludes:headers.reply_to | |
subject.subject | starts_with | Completed: | excludes:subject.subject field:"subject.subject" value:"Completed: " |
subject.subject | starts_with | Here is your signed document: | excludes:subject.subject field:"subject.subject" value:"Here is your signed document: " |
subject.subject | starts_with | Voided: | excludes:subject.subject field:"subject.subject" value:"Voided: " |
Indicators
These rows show field, operator, and value matches.
Service abuse: Domains By Proxy sender
#Message originates from a sender using Domains By Proxy's domain privacy service, commonly used to hide domain ownership information.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam, Credential Phishing, BEC/Fraud |
| 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 == 'domainsbyproxy.com'
Detection logic
Scope: inbound message.
Message originates from a sender using Domains By Proxy's domain privacy service, commonly used to hide domain ownership information.
- inbound message
- sender.email.domain.root_domain is 'domainsbyproxy.com'
Inspects: sender.email.domain.root_domain, type.inbound.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
sender.email.domain.root_domain | equals | domainsbyproxy.com |
Stages and Predicates
Stage 1: mql_rule
and
sender.email.domain.root_domain eq "domainsbyproxy.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:"domainsbyproxy.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Dropbox share from an unsolicited reply-to address
#This rule detects Dropbox share notifications which contain a reply-to address or domain that has not been previously observed sending messages to or receiving messages from the recipient organization.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, BEC/Fraud |
| Tactics and techniques | Evasion, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Legitimate Dropbox sending infratructure
and sender.email.email == "no-reply@dropbox.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and strings.ends_with(headers.auth_summary.spf.details.designator,
'.dropbox.com'
)
and strings.icontains(subject.subject, 'shared')
and strings.icontains(subject.subject, 'with you')
//
// This rule makes use of a beta feature and is subject to change without notice
// using the beta feature in custom rules is not suggested until it has been formally released
//
// reply-to address has never sent an email to the org
and beta.profile.by_reply_to().prevalence == "new"
// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited
// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign
Detection logic
Scope: inbound message.
This rule detects Dropbox share notifications which contain a reply-to address or domain that has not been previously observed sending messages to or receiving messages from the recipient organization.
- inbound message
- sender.email.email is 'no-reply@dropbox.com'
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
- headers.auth_summary.spf.details.designator ends with '.dropbox.com'
- subject.subject contains 'shared'
- subject.subject contains 'with you'
- beta.profile.by_reply_to().prevalence is 'new'
not:
- beta.profile.by_reply_to().solicited
not:
- beta.profile.by_reply_to().any_messages_benign
Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.details.designator, headers.auth_summary.spf.pass, sender.email.email, subject.subject, type.inbound. Sensors: beta.profile.by_reply_to, strings.ends_with, strings.icontains.
Indicators matched (4)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | no-reply@dropbox.com |
strings.ends_with | suffix | .dropbox.com |
strings.icontains | substring | shared |
strings.icontains | substring | with you |
Stages and Predicates
Stage 1: mql_rule
and
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().prevalence == new"
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.details.designator ends_with ".dropbox.com"
headers.auth_summary.spf.pass eq "true"
sender.email.email eq "no-reply@dropbox.com"
subject.subject contains "shared"
subject.subject contains "with you"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
Service abuse: Dropbox share from new domain
#This Attack Surface Reduction (ASR) rule matches on Dropbox notifications with recently registered reply-to domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, Credential Phishing, BEC/Fraud |
| Tactics and techniques | Evasion, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Dropbox actual sending infrastructure
and sender.email.email == "no-reply@dropbox.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and strings.ends_with(headers.auth_summary.spf.details.designator,
'.dropbox.com'
)
// the message needs to have a reply-to address
and length(headers.reply_to) > 0
//
// This rule makes use of a beta feature and is subject to change without notice
// using the beta feature in custom rules is not suggested until it has been formally released
//
// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited
// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign
// new reply-to domain
and any(headers.reply_to, network.whois(.email.domain).days_old < 30)
Detection logic
Scope: inbound message.
This Attack Surface Reduction (ASR) rule matches on Dropbox notifications with recently registered reply-to domains.
- inbound message
- sender.email.email is 'no-reply@dropbox.com'
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
- headers.auth_summary.spf.details.designator ends with '.dropbox.com'
- length(headers.reply_to) > 0
not:
- beta.profile.by_reply_to().solicited
not:
- beta.profile.by_reply_to().any_messages_benign
any of
headers.reply_towhere:- network.whois(.email.domain).days_old < 30
Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.details.designator, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain, sender.email.email, type.inbound. Sensors: beta.profile.by_reply_to, network.whois, strings.ends_with.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | no-reply@dropbox.com |
strings.ends_with | suffix | .dropbox.com |
Stages and Predicates
Stage 1: mql_rule
and
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
any(headers.reply_to)
network.whois func_call "network.whois(headers.reply_to[].email.domain).days_old < 30"
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.details.designator ends_with ".dropbox.com"
headers.auth_summary.spf.pass eq "true"
headers.reply_to length_compare "0"
sender.email.email eq "no-reply@dropbox.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
Service abuse: Dropbox share with suspicious sender or document name
#The detection rule is intended to match on messages sent from DropBox indicating a shared file to the recipient which contains suspicious content within the document or sender display name.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, BEC/Fraud |
| Tactics and techniques | Evasion, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Legitimate Dropbox sending infratructure
and sender.email.email == "no-reply@dropbox.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and strings.ends_with(headers.auth_summary.spf.details.designator,
'.dropbox.com'
)
and strings.icontains(subject.subject, 'shared')
and strings.icontains(subject.subject, 'with you')
and (
// contains the word dropbox
// everything not "shared" and "with you" is actor controlled
strings.icontains(subject.subject, 'dropbox')
or strings.icontains(subject.subject, 'sharefile')
// sender names part of the subject
or (
// Billing Accounting
regex.icontains(subject.subject,
'Accounts? (?:Payable|Receivable).*shared',
'Billing Support.*shared'
)
// HR/Payroll/Legal/etc
or regex.icontains(subject.subject, 'Compliance HR.*shared')
or regex.icontains(subject.subject,
'(?:Compliance|Executive|Finance|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*shared'
)
or regex.icontains(subject.subject, '(?:Department|Team).*shared')
or regex.icontains(subject.subject, 'Corporate Communications.*shared')
or regex.icontains(subject.subject, 'Employee Relations.*shared')
or regex.icontains(subject.subject, 'Office Manager.*shared')
or regex.icontains(subject.subject, 'Risk Management.*shared')
or regex.icontains(subject.subject, 'Payroll Admin(?:istrator).*shared')
or regex.icontains(subject.subject, 'Human Resources.*shared')
or regex.icontains(subject.subject, 'HR.*shared')
// IT related
or regex.icontains(subject.subject,
'IT Support.*shared',
'Information Technology.*shared',
'(?:Network|System)? Admin(?:istrator).*shared',
'Help Desk.*shared',
'Tech(?:nical) Support.*shared'
)
// an email address in the subject is also interesting
or regex.icontains(subject.subject, '\w+@\w+\.\w+.*shared')
)
// filename analysis
// the filename is also contianed in the subject line
or (
// untitled.paper
regex.icontains(subject.subject, 'shared.*\"Untitled.paper')
// scanner themed
or regex.icontains(subject.subject, 'shared.*\".*scanne[rd]')
// image theme
or regex.icontains(subject.subject, 'shared.*\".*_IMG_')
or regex.icontains(subject.subject, 'shared.*\".*IMG[_-](?:\d|\W)+\"')
// ondrive theme
or regex.icontains(subject.subject, 'shared.*\".*one_docx')
or regex.icontains(subject.subject, 'shared.*\".*One.?Drive')
or regex.icontains(subject.subject, 'shared.*\".*click here')
or regex.icontains(subject.subject, 'shared.*\".*Download PDF')
or regex.icontains(subject.subject, 'shared.*\".*Validate')
// Invoice Themes
or regex.icontains(subject.subject, 'shared.*\".*Invoice')
or regex.icontains(subject.subject, 'shared.*\".*INV\b')
or regex.icontains(subject.subject, 'shared.*\".*Payment')
or regex.icontains(subject.subject, 'shared.*\".*ACH')
or regex.icontains(subject.subject, 'shared.*\".*Wire Confirmation')
or regex.icontains(subject.subject, 'shared.*\".*P[O0]\W+?\d+\"')
or regex.icontains(subject.subject, 'shared.*\"P[O0](?:\W+?|\d+)')
or regex.icontains(subject.subject, 'shared.*\".*receipt')
or regex.icontains(subject.subject, 'shared.*\".*Billing')
or regex.icontains(subject.subject, 'shared.*\".*statement')
or regex.icontains(subject.subject, 'shared.*\".*Past Due')
or regex.icontains(subject.subject, 'shared.*\".*Remit(?:tance)?')
or regex.icontains(subject.subject, 'shared.*\".*Purchase Order')
or regex.icontains(subject.subject, 'shared.*\".*Settlement')
// contract language
or regex.icontains(subject.subject, 'shared.*\".*Contract Agreement')
or regex.icontains(subject.subject, 'shared.*\".*Pr[0o]p[0o]sal')
or regex.icontains(subject.subject, 'shared.*\".*Contract Doc')
or regex.icontains(subject.subject, 'shared.*\".*Claim Doc')
// Payroll/HR
// section also used in link_sharepoint_sus_name.yml with modified input
or regex.icontains(subject.subject, 'shared.*\".*Payroll')
or regex.icontains(subject.subject, 'shared.*\".*Employee Pay\b')
or regex.icontains(subject.subject, 'shared.*\".*Salary')
or regex.icontains(subject.subject, 'shared.*\".*Benefit Enrollment')
or regex.icontains(subject.subject, 'shared.*\".*Employee Handbook')
or regex.icontains(subject.subject, 'shared.*\".*Reimbursement Approved')
or regex.icontains(subject.subject,
'shared.*\".*(?:Faculty|Staff)\s*(?:\w+\s+){0,3}\s*Eval(?:uation)?'
)
// shared files/extenstion
or regex.icontains(subject.subject, 'shared.*\".*Shared.?File')
or regex.icontains(subject.subject, 'shared.*\".*Urgent')
or regex.icontains(subject.subject, 'shared.*\".*Important')
or regex.icontains(subject.subject, 'shared.*\".*Secure')
or regex.icontains(subject.subject, 'shared.*\".*Encrypt')
or regex.icontains(subject.subject, 'shared.*\".*shared')
or regex.icontains(subject.subject, 'shared.*\".*protected')
or regex.icontains(subject.subject, 'shared.*\".*\.docx?\.pdf')
or regex.icontains(subject.subject, 'shared.*\".*\.docx?\.paper')
// all caps filename allowing for numbers, punct and spaces, and an optional file extenstion
or regex.contains(subject.subject,
'shared \"[A-Z0-9[:punct:]\s]+(?:\.[a-zA-Z]{3,5})\"'
)
or regex.icontains(subject.subject,
'shared \".*(?:shared|sent).*\" with you'
)
// MFA theme
or regex.icontains(subject.subject, 'shared.*\".*Verification Code')
or regex.icontains(subject.subject, 'shared.*\".*\bMFA\b')
// the reply-to address is within the subject
or any(headers.reply_to,
strings.icontains(subject.subject, .email.domain.domain)
)
)
)
Detection logic
Scope: inbound message.
The detection rule is intended to match on messages sent from DropBox indicating a shared file to the recipient which contains suspicious content within the document or sender display name.
- inbound message
- sender.email.email is 'no-reply@dropbox.com'
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
- headers.auth_summary.spf.details.designator ends with '.dropbox.com'
- subject.subject contains 'shared'
- subject.subject contains 'with you'
any of:
- subject.subject contains 'dropbox'
- subject.subject contains 'sharefile'
subject.subject matches any of 18 patterns
Accounts? (?:Payable|Receivable).*sharedBilling Support.*sharedCompliance HR.*shared(?:Compliance|Executive|Finance|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*shared(?:Department|Team).*sharedCorporate Communications.*sharedEmployee Relations.*sharedOffice Manager.*sharedRisk Management.*sharedPayroll Admin(?:istrator).*sharedHuman Resources.*sharedHR.*sharedIT Support.*sharedInformation Technology.*shared(?:Network|System)? Admin(?:istrator).*sharedHelp Desk.*sharedTech(?:nical) Support.*shared\w+@\w+\.\w+.*shared
any of:
- subject.subject matches 'shared.*\\"Untitled.paper'
- subject.subject matches 'shared.*\\".*scanne[rd]'
- subject.subject matches 'shared.*\\".*_IMG_'
- subject.subject matches 'shared.*\\".*IMG[_-](?:\\d|\\W)+\\"'
- subject.subject matches 'shared.*\\".*one_docx'
- subject.subject matches 'shared.*\\".*One.?Drive'
- subject.subject matches 'shared.*\\".*click here'
- subject.subject matches 'shared.*\\".*Download PDF'
- subject.subject matches 'shared.*\\".*Validate'
- subject.subject matches 'shared.*\\".*Invoice'
- subject.subject matches 'shared.*\\".*INV\\b'
- subject.subject matches 'shared.*\\".*Payment'
- subject.subject matches 'shared.*\\".*ACH'
- subject.subject matches 'shared.*\\".*Wire Confirmation'
- subject.subject matches 'shared.*\\".*P[O0]\\W+?\\d+\\"'
- subject.subject matches 'shared.*\\"P[O0](?:\\W+?|\\d+)'
- subject.subject matches 'shared.*\\".*receipt'
- subject.subject matches 'shared.*\\".*Billing'
- subject.subject matches 'shared.*\\".*statement'
- subject.subject matches 'shared.*\\".*Past Due'
- subject.subject matches 'shared.*\\".*Remit(?:tance)?'
- subject.subject matches 'shared.*\\".*Purchase Order'
- subject.subject matches 'shared.*\\".*Settlement'
- subject.subject matches 'shared.*\\".*Contract Agreement'
- subject.subject matches 'shared.*\\".*Pr[0o]p[0o]sal'
- subject.subject matches 'shared.*\\".*Contract Doc'
- subject.subject matches 'shared.*\\".*Claim Doc'
- subject.subject matches 'shared.*\\".*Payroll'
- subject.subject matches 'shared.*\\".*Employee Pay\\b'
- subject.subject matches 'shared.*\\".*Salary'
- subject.subject matches 'shared.*\\".*Benefit Enrollment'
- subject.subject matches 'shared.*\\".*Employee Handbook'
- subject.subject matches 'shared.*\\".*Reimbursement Approved'
- subject.subject matches 'shared.*\\".*(?:Faculty|Staff)\\s*(?:\\w+\\s+){0,3}\\s*Eval(?:uation)?'
- subject.subject matches 'shared.*\\".*Shared.?File'
- subject.subject matches 'shared.*\\".*Urgent'
- subject.subject matches 'shared.*\\".*Important'
- subject.subject matches 'shared.*\\".*Secure'
- subject.subject matches 'shared.*\\".*Encrypt'
- subject.subject matches 'shared.*\\".*shared'
- subject.subject matches 'shared.*\\".*protected'
- subject.subject matches 'shared.*\\".*\\.docx?\\.pdf'
- subject.subject matches 'shared.*\\".*\\.docx?\\.paper'
- subject.subject matches 'shared \\"[A-Z0-9[:punct:]\\s]+(?:\\.[a-zA-Z]{3,5})\\"'
- subject.subject matches 'shared \\".*(?:shared|sent).*\\" with you'
- subject.subject matches 'shared.*\\".*Verification Code'
- subject.subject matches 'shared.*\\".*\\bMFA\\b'
any of
headers.reply_towhere:- strings.icontains(subject.subject)
Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.details.designator, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain.domain, sender.email.email, subject.subject, type.inbound. Sensors: regex.contains, regex.icontains, strings.ends_with, strings.icontains.
Indicators matched (71)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | no-reply@dropbox.com |
strings.ends_with | suffix | .dropbox.com |
strings.icontains | substring | shared |
strings.icontains | substring | with you |
strings.icontains | substring | dropbox |
strings.icontains | substring | sharefile |
regex.icontains | regex | Accounts? (?:Payable|Receivable).*shared |
regex.icontains | regex | Billing Support.*shared |
regex.icontains | regex | Compliance HR.*shared |
regex.icontains | regex | (?:Compliance|Executive|Finance|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*shared |
regex.icontains | regex | (?:Department|Team).*shared |
regex.icontains | regex | Corporate Communications.*shared |
59 more
regex.icontains | regex | Employee Relations.*shared |
regex.icontains | regex | Office Manager.*shared |
regex.icontains | regex | Risk Management.*shared |
regex.icontains | regex | Payroll Admin(?:istrator).*shared |
regex.icontains | regex | Human Resources.*shared |
regex.icontains | regex | HR.*shared |
regex.icontains | regex | IT Support.*shared |
regex.icontains | regex | Information Technology.*shared |
regex.icontains | regex | (?:Network|System)? Admin(?:istrator).*shared |
regex.icontains | regex | Help Desk.*shared |
regex.icontains | regex | Tech(?:nical) Support.*shared |
regex.icontains | regex | \w+@\w+\.\w+.*shared |
regex.icontains | regex | shared.*\"Untitled.paper |
regex.icontains | regex | shared.*\".*scanne[rd] |
regex.icontains | regex | shared.*\".*_IMG_ |
regex.icontains | regex | shared.*\".*IMG[_-](?:\d|\W)+\" |
regex.icontains | regex | shared.*\".*one_docx |
regex.icontains | regex | shared.*\".*One.?Drive |
regex.icontains | regex | shared.*\".*click here |
regex.icontains | regex | shared.*\".*Download PDF |
regex.icontains | regex | shared.*\".*Validate |
regex.icontains | regex | shared.*\".*Invoice |
regex.icontains | regex | shared.*\".*INV\b |
regex.icontains | regex | shared.*\".*Payment |
regex.icontains | regex | shared.*\".*ACH |
regex.icontains | regex | shared.*\".*Wire Confirmation |
regex.icontains | regex | shared.*\".*P[O0]\W+?\d+\" |
regex.icontains | regex | shared.*\"P[O0](?:\W+?|\d+) |
regex.icontains | regex | shared.*\".*receipt |
regex.icontains | regex | shared.*\".*Billing |
regex.icontains | regex | shared.*\".*statement |
regex.icontains | regex | shared.*\".*Past Due |
regex.icontains | regex | shared.*\".*Remit(?:tance)? |
regex.icontains | regex | shared.*\".*Purchase Order |
regex.icontains | regex | shared.*\".*Settlement |
regex.icontains | regex | shared.*\".*Contract Agreement |
regex.icontains | regex | shared.*\".*Pr[0o]p[0o]sal |
regex.icontains | regex | shared.*\".*Contract Doc |
regex.icontains | regex | shared.*\".*Claim Doc |
regex.icontains | regex | shared.*\".*Payroll |
regex.icontains | regex | shared.*\".*Employee Pay\b |
regex.icontains | regex | shared.*\".*Salary |
regex.icontains | regex | shared.*\".*Benefit Enrollment |
regex.icontains | regex | shared.*\".*Employee Handbook |
regex.icontains | regex | shared.*\".*Reimbursement Approved |
regex.icontains | regex | shared.*\".*(?:Faculty|Staff)\s*(?:\w+\s+){0,3}\s*Eval(?:uation)? |
regex.icontains | regex | shared.*\".*Shared.?File |
regex.icontains | regex | shared.*\".*Urgent |
regex.icontains | regex | shared.*\".*Important |
regex.icontains | regex | shared.*\".*Secure |
regex.icontains | regex | shared.*\".*Encrypt |
regex.icontains | regex | shared.*\".*shared |
regex.icontains | regex | shared.*\".*protected |
regex.icontains | regex | shared.*\".*\.docx?\.pdf |
regex.icontains | regex | shared.*\".*\.docx?\.paper |
regex.contains | regex | shared \"[A-Z0-9[:punct:]\s]+(?:\.[a-zA-Z]{3,5})\" |
regex.icontains | regex | shared \".*(?:shared|sent).*\" with you |
regex.icontains | regex | shared.*\".*Verification Code |
regex.icontains | regex | shared.*\".*\bMFA\b |
Stages and Predicates
Stage 1: mql_rule
and
or
any(headers.reply_to)
strings.icontains func_call "strings.icontains(subject.subject)"
subject.subject contains "dropbox"
subject.subject contains "sharefile"
subject.subject regex_match "(?:Compliance|Executive|Finance|\\bHR\\b|\\bIT\\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*shared"
subject.subject regex_match "(?:Department|Team).*shared"
subject.subject regex_match "(?:Network|System)? Admin(?:istrator).*shared"
subject.subject regex_match "Accounts? (?:Payable|Receivable).*shared"
subject.subject regex_match "Billing Support.*shared"
subject.subject regex_match "Compliance HR.*shared"
subject.subject regex_match "Corporate Communications.*shared"
subject.subject regex_match "Employee Relations.*shared"
subject.subject regex_match "HR.*shared"
subject.subject regex_match "Help Desk.*shared"
subject.subject regex_match "Human Resources.*shared"
subject.subject regex_match "IT Support.*shared"
subject.subject regex_match "Information Technology.*shared"
subject.subject regex_match "Office Manager.*shared"
subject.subject regex_match "Payroll Admin(?:istrator).*shared"
subject.subject regex_match "Risk Management.*shared"
subject.subject regex_match "Tech(?:nical) Support.*shared"
subject.subject regex_match "\\w+@\\w+\\.\\w+.*shared"
subject.subject regex_match "shared \\\".*(?:shared|sent).*\\\" with you"
subject.subject regex_match "shared \\\"[A-Z0-9[:punct:]\\s]+(?:\\.[a-zA-Z]{3,5})\\\""
subject.subject regex_match "shared.*\\\".*(?:Faculty|Staff)\\s*(?:\\w+\\s+){0,3}\\s*Eval(?:uation)?"
subject.subject regex_match "shared.*\\\".*ACH"
subject.subject regex_match "shared.*\\\".*Benefit Enrollment"
subject.subject regex_match "shared.*\\\".*Billing"
subject.subject regex_match "shared.*\\\".*Claim Doc"
subject.subject regex_match "shared.*\\\".*Contract Agreement"
subject.subject regex_match "shared.*\\\".*Contract Doc"
subject.subject regex_match "shared.*\\\".*Download PDF"
subject.subject regex_match "shared.*\\\".*Employee Handbook"
subject.subject regex_match "shared.*\\\".*Employee Pay\\b"
subject.subject regex_match "shared.*\\\".*Encrypt"
subject.subject regex_match "shared.*\\\".*IMG[_-](?:\\d|\\W)+\\\""
subject.subject regex_match "shared.*\\\".*INV\\b"
subject.subject regex_match "shared.*\\\".*Important"
subject.subject regex_match "shared.*\\\".*Invoice"
subject.subject regex_match "shared.*\\\".*One.?Drive"
subject.subject regex_match "shared.*\\\".*P[O0]\\W+?\\d+\\\""
subject.subject regex_match "shared.*\\\".*Past Due"
subject.subject regex_match "shared.*\\\".*Payment"
subject.subject regex_match "shared.*\\\".*Payroll"
subject.subject regex_match "shared.*\\\".*Pr[0o]p[0o]sal"
subject.subject regex_match "shared.*\\\".*Purchase Order"
subject.subject regex_match "shared.*\\\".*Reimbursement Approved"
subject.subject regex_match "shared.*\\\".*Remit(?:tance)?"
subject.subject regex_match "shared.*\\\".*Salary"
subject.subject regex_match "shared.*\\\".*Secure"
subject.subject regex_match "shared.*\\\".*Settlement"
subject.subject regex_match "shared.*\\\".*Shared.?File"
subject.subject regex_match "shared.*\\\".*Urgent"
subject.subject regex_match "shared.*\\\".*Validate"
subject.subject regex_match "shared.*\\\".*Verification Code"
subject.subject regex_match "shared.*\\\".*Wire Confirmation"
subject.subject regex_match "shared.*\\\".*\\.docx?\\.paper"
subject.subject regex_match "shared.*\\\".*\\.docx?\\.pdf"
subject.subject regex_match "shared.*\\\".*\\bMFA\\b"
subject.subject regex_match "shared.*\\\".*_IMG_"
subject.subject regex_match "shared.*\\\".*click here"
subject.subject regex_match "shared.*\\\".*one_docx"
subject.subject regex_match "shared.*\\\".*protected"
subject.subject regex_match "shared.*\\\".*receipt"
subject.subject regex_match "shared.*\\\".*scanne[rd]"
subject.subject regex_match "shared.*\\\".*shared"
subject.subject regex_match "shared.*\\\".*statement"
subject.subject regex_match "shared.*\\\"P[O0](?:\\W+?|\\d+)"
subject.subject regex_match "shared.*\\\"Untitled.paper"
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.details.designator ends_with ".dropbox.com"
headers.auth_summary.spf.pass eq "true"
sender.email.email eq "no-reply@dropbox.com"
subject.subject contains "shared"
subject.subject contains "with you"
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:"true" |
headers.auth_summary.spf.details.designator | ends_with |
| field:"headers.auth_summary.spf.details.designator" kind:ends_with value:".dropbox.com" |
headers.auth_summary.spf.pass | eq |
| field:"headers.auth_summary.spf.pass" kind:eq value:"true" |
sender.email.email | eq |
| field:"sender.email.email" kind:eq value:"no-reply@dropbox.com" |
subject.subject | contains |
| field:"subject.subject" kind:contains |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Evernote link
#Detects inbound messages containing a link whose effective destination resolves to evernote.com, where the link text uses document-sharing or e-signature language (e.g., view, open, download, review) and the sender is not from evernote.com. The message body is also classified by an NLU model as exhibiting credential theft or business email compromise intent, indicating abuse of Evernote's legitimate hosting infrastructure to deliver malicious content.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, BEC/Fraud |
| Tactics and techniques | Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// a link whose effective destination is evernote
and any(body.current_thread.links,
(
.href_url.domain.root_domain == "evernote.com"
or .display_url.domain.root_domain == "evernote.com"
or any(.href_url.query_params_decoded["domain"],
strings.iends_with(., "evernote.com")
)
)
and (
any(ml.nlu_classifier(.display_text).topics, .name == 'E-Signature')
or regex.icontains(.display_text,
'\b(?:view|open|review|access|download|see|shared?)\b[^\n]{0,30}\b(?:document|doc|file|contract|invoice|statement|agreement|draft|attachment|folder)\b'
)
)
)
and any(ml.nlu_classifier(body.current_thread.text).intents,
.name in ('cred_theft', 'bec') and .confidence != 'low'
)
and not (
sender.email.domain.root_domain == 'evernote.com'
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
Detects inbound messages containing a link whose effective destination resolves to evernote.com, where the link text uses document-sharing or e-signature language (e.g., view, open, download, review) and the sender is not from evernote.com. The message body is also classified by an NLU model as exhibiting credential theft or business email compromise intent, indicating abuse of Evernote's legitimate hosting infrastructure to deliver malicious content.
- inbound message
any of
body.current_thread.linkswhere all hold:any of:
- .href_url.domain.root_domain is 'evernote.com'
- .display_url.domain.root_domain is 'evernote.com'
any of
.href_url.query_params_decoded['domain']where:- . ends with 'evernote.com'
any of:
any of
ml.nlu_classifier(.display_text).topicswhere:- .name is 'E-Signature'
- .display_text matches '\\b(?:view|open|review|access|download|see|shared?)\\b[^\\n]{0,30}\\b(?:document|doc|file|contract|invoice|statement|agreement|draft|attachment|folder)\\b'
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name in ('cred_theft', 'bec')
- .confidence is not 'low'
not:
all of:
- sender.email.domain.root_domain is 'evernote.com'
- coalesce(headers.auth_summary.dmarc.pass)
Inspects: body.current_thread.links, body.current_thread.links[].display_text, body.current_thread.links[].display_url.domain.root_domain, body.current_thread.links[].href_url.domain.root_domain, body.current_thread.links[].href_url.query_params_decoded['domain'], body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.iends_with.
Indicators matched (7)
| Field | Match | Value |
|---|---|---|
body.current_thread.links[].href_url.domain.root_domain | equals | evernote.com |
body.current_thread.links[].display_url.domain.root_domain | equals | evernote.com |
strings.iends_with | suffix | evernote.com |
ml.nlu_classifier(body.current_thread.links[].display_text).topics[].name | equals | E-Signature |
regex.icontains | regex | \b(?:view|open|review|access|download|see|shared?)\b[^\n]{0,30}\b(?:document|doc|file|contract|invoice|statement|agreement|draft|attachment|folder)\b |
ml.nlu_classifier(body.current_thread.text).intents[].name | member | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].name | member | bec |
Stages and Predicates
Stage 1: mql_rule
and
any(body.current_thread.links)
and
or
any(body.current_thread.links.href_url.query_params_decoded['domain'])
body.current_thread.links.href_url.query_params_decoded['domain'] ends_with "evernote.com"
body.current_thread.links.display_url.domain.root_domain eq "evernote.com"
body.current_thread.links.href_url.domain.root_domain eq "evernote.com"
or
any(ml.nlu_classifier(body.current_thread.links.display_text).topics)
ml.nlu_classifier(body.current_thread.links.display_text).topics.name eq "E-Signature"
body.current_thread.links.display_text regex_match "\\b(?:view|open|review|access|download|see|shared?)\\b[^\\n]{0,30}\\b(?:document|doc|file|contract|invoice|statement|agreement|draft|attachment|folder)\\b"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
sender.email.domain.root_domain eq "evernote.com"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).intents.name in ["bec", "cred_theft"]
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.email.domain.root_domain | eq | evernote.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"evernote.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service Abuse: ExactTarget with suspicious sender indicators
#Message originates from ExactTarget infrastructure but uses a suspicious sender domain, including overly long salesforce.com domains, awsapps.com domains, domains containing UTF-8 encoding characters, or a suspicious sender display name.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, BEC/Fraud |
| 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 == 'exacttarget.com')
and (
(
length(sender.email.email) >= 50
and sender.email.domain.root_domain == "salesforce.com"
)
or sender.email.domain.root_domain == "awsapps.com"
or strings.icontains(sender.email.domain.domain, '?utf-8')
or regex.icontains(sender.display_name,
'.*\|.*(Manager|Careers|Recruitment|Specialist|Global)'
)
)
Detection logic
Scope: inbound message.
Message originates from ExactTarget infrastructure but uses a suspicious sender domain, including overly long salesforce.com domains, awsapps.com domains, domains containing UTF-8 encoding characters, or a suspicious sender display name.
- inbound message
any of
headers.domainswhere:- .root_domain is 'exacttarget.com'
any of:
all of:
- length(sender.email.email) ≥ 50
- sender.email.domain.root_domain is 'salesforce.com'
- sender.email.domain.root_domain is 'awsapps.com'
- sender.email.domain.domain contains '?utf-8'
- sender.display_name matches '.*\\|.*(Manager|Careers|Recruitment|Specialist|Global)'
Inspects: headers.domains, headers.domains[].root_domain, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, sender.email.email, type.inbound. Sensors: regex.icontains, strings.icontains.
Indicators matched (5)
| Field | Match | Value |
|---|---|---|
headers.domains[].root_domain | equals | exacttarget.com |
sender.email.domain.root_domain | equals | salesforce.com |
sender.email.domain.root_domain | equals | awsapps.com |
strings.icontains | substring | ?utf-8 |
regex.icontains | regex | .*\|.*(Manager|Careers|Recruitment|Specialist|Global) |
Stages and Predicates
Stage 1: mql_rule
and
or
and
sender.email.domain.root_domain eq "salesforce.com"
sender.email.email length_compare "50"
sender.display_name regex_match ".*\\|.*(Manager|Careers|Recruitment|Specialist|Global)"
sender.email.domain.domain contains "?utf-8"
sender.email.domain.root_domain eq "awsapps.com"
any(headers.domains)
headers.domains.root_domain eq "exacttarget.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match value:".*|.*(Manager|Careers|Recruitment|Specialist|Global)" |
sender.email.domain.domain | contains |
| field:"sender.email.domain.domain" kind:contains value:"?utf-8" |
sender.email.domain.root_domain | eq |
| field:"sender.email.domain.root_domain" kind:eq |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: FlipHTML5 with attachment deception and credential theft language
#Detects messages that reference attachments without including any, contain links to FlipHTML5 services, and exhibit high-confidence credential theft language patterns.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Social engineering, Free file host, Evasion |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// messages contain wording to "see attached" but contains no attachments
and (
regex.icontains(body.current_thread.text,
"attached|see.*attached|find.*attached|please{0,10}attached"
)
and length(attachments) == 0
)
// and the link goes to fliphtml5 and contains suspect "click me" language
and any(body.links, .href_url.domain.root_domain == "fliphtml5.com")
// and we have confidence its cred theft
and any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "cred_theft" and .confidence != "low"
)
Detection logic
Scope: inbound message.
Detects messages that reference attachments without including any, contain links to FlipHTML5 services, and exhibit high-confidence credential theft language patterns.
- inbound message
all of:
- body.current_thread.text matches 'attached|see.*attached|find.*attached|please{0,10}attached'
- length(attachments) is 0
any of
body.linkswhere:- .href_url.domain.root_domain is 'fliphtml5.com'
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name is 'cred_theft'
- .confidence is not 'low'
Inspects: body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | attached|see.*attached|find.*attached|please{0,10}attached |
body.links[].href_url.domain.root_domain | equals | fliphtml5.com |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
Stages and Predicates
Stage 1: mql_rule
and
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
any(body.links)
body.links.href_url.domain.root_domain eq "fliphtml5.com"
attachments length_compare "0"
body.current_thread.text regex_match "attached|see.*attached|find.*attached|please{0,10}attached"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Formester with suspicious link behavior
#Detects abuse of the Formester form service where links either redirect to credential phishing pages, contain suspicious top-level domains in the final DOM and/or redirect history, or display 'secure message' text indicating potential credential theft.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, BEC/Fraud |
| Tactics and techniques | Open redirect, Social engineering, Free file host |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// LA invokes page first before scanning additional links.
and (
any(filter(body.links, .href_url.domain.root_domain == 'formester.com'),
(
ml.link_analysis(., mode="aggressive").credphish.disposition == "phishing"
)
// any links in the final dom lead to a suspicious tld.
or any(ml.link_analysis(.).final_dom.links,
.href_url.domain.tld in $suspicious_tlds
or ml.link_analysis(.href_url).effective_url.domain.tld in $suspicious_tlds
)
// link redirects to a suspicious TLD.
or any(ml.link_analysis(., mode="aggressive").redirect_history,
.domain.tld in $suspicious_tlds
)
// suspicious landing verbiage. Keywords can be expanded.
or strings.icontains(ml.link_analysis(., mode="aggressive").final_dom.display_text,
"secure message"
)
// suspicious link verbiage.
or regex.icontains(.display_text,
"(view|show|download).{0,20}(Doc(ument)?(s)?|files(s)?|attached)"
)
)
// suspicious keywords/phrasing in body.
or (
any(body.links, .href_url.domain.root_domain == 'formester.com')
and strings.icontains(body.current_thread.text,
"use of Microsoft 365 and may contain content"
)
)
)
Detection logic
Scope: inbound message.
Detects abuse of the Formester form service where links either redirect to credential phishing pages, contain suspicious top-level domains in the final DOM and/or redirect history, or display 'secure message' text indicating potential credential theft.
- inbound message
any of:
any of
filter(body.links)where any holds:- ml.link_analysis(.).credphish.disposition is 'phishing'
any of
ml.link_analysis(.).final_dom.linkswhere any holds:- .href_url.domain.tld in $suspicious_tlds
- ml.link_analysis(.href_url).effective_url.domain.tld in $suspicious_tlds
any of
ml.link_analysis(., mode='aggressive').redirect_historywhere:- .domain.tld in $suspicious_tlds
- ml.link_analysis(., mode='aggressive').final_dom.display_text contains 'secure message'
- .display_text matches '(view|show|download).{0,20}(Doc(ument)?(s)?|files(s)?|attached)'
all of:
any of
body.linkswhere:- .href_url.domain.root_domain is 'formester.com'
- body.current_thread.text contains 'use of Microsoft 365 and may contain content'
Inspects: body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, type.inbound. Sensors: ml.link_analysis, regex.icontains, strings.icontains. Reference lists: $suspicious_tlds.
Indicators matched (4)
| Field | Match | Value |
|---|---|---|
body.links[].href_url.domain.root_domain | equals | formester.com |
strings.icontains | substring | secure message |
regex.icontains | regex | (view|show|download).{0,20}(Doc(ument)?(s)?|files(s)?|attached) |
strings.icontains | substring | use of Microsoft 365 and may contain content |
Stages and Predicates
Stage 1: mql_rule
and
or
any(filter(body.links))
or
any(ml.link_analysis(filter(body.links)).final_dom.links)
or
ml.link_analysis func_call "ml.link_analysis(ml.link_analysis(filter(body.links)[]).final_dom.links[].href_url).effective_url.domain.tld in suspicious_tlds"
macro "ml.link_analysis(filter(body.links)[]).final_dom.links[].href_url.domain.tld in suspicious_tlds"
any(ml.link_analysis(filter(body.links), mode='aggressive').redirect_history)
macro "ml.link_analysis(filter(body.links)[], mode='aggressive').redirect_history[].domain.tld in suspicious_tlds"
filter(body.links).display_text regex_match "(view|show|download).{0,20}(Doc(ument)?(s)?|files(s)?|attached)"
ml.link_analysis func_call "ml.link_analysis(filter(body.links)[]).credphish.disposition == phishing"
ml.link_analysis(filter(body.links)[], mode='aggressive').final_dom.display_text contains "secure message"
and
any(body.links)
body.links.href_url.domain.root_domain eq "formester.com"
body.current_thread.text contains "use of Microsoft 365 and may contain content"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains value:"use of Microsoft 365 and may contain content" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Google account notification with links to free file host
#Detects messages impersonating Google Accounts that contain links redirecting to known file hosting services
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering, Free file host |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and sender.email.email == "no-reply@accounts.google.com"
and any(body.links, .href_url.domain.domain in $free_file_hosts)
Detection logic
Scope: inbound message.
Detects messages impersonating Google Accounts that contain links redirecting to known file hosting services
- inbound message
- sender.email.email is 'no-reply@accounts.google.com'
any of
body.linkswhere:- .href_url.domain.domain in $free_file_hosts
Inspects: body.links, body.links[].href_url.domain.domain, sender.email.email, type.inbound. Reference lists: $free_file_hosts.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | no-reply@accounts.google.com |
Stages and Predicates
Stage 1: mql_rule
and
any(body.links)
macro "body.links[].href_url.domain.domain in free_file_hosts"
sender.email.email eq "no-reply@accounts.google.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.email.email | eq |
| field:"sender.email.email" kind:eq value:"no-reply@accounts.google.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Google classroom solicitation
#Detects messages spoofing Google Classroom notifications that contain WhatsApp contact information, phone numbers, or sexually explicit content. The rule identifies emails from no-reply@classroom.google.com that include WhatsApp invitations, emojis in the subject line, or explicit sexual language, as well as phone numbers and WhatsApp references in message screenshots from first-time senders.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, BEC/Fraud |
| Tactics and techniques | Impersonation: Brand, Out of band pivot, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
//
// Warning: This rule contains sexually explicit keywords
//
and sender.email.email == "no-reply@classroom.google.com"
and any(regex.iextract(body.html.display_text,
'(?P<sender_email>(?P<sender_name>[a-zA-Z0-9._%+-]+)@(?P<sender_domain>[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}))'
),
.named_groups["sender_email"] not in $sender_emails
and .named_groups["sender_email"] not in $recipient_emails
)
and (
// check for a WhatsApp invitation in the currend_thread
(
regex.icontains(body.current_thread.text, '\bWhatsapp:?.[:0-9+ ]{7,20}\b')
or (
strings.icontains(body.current_thread.text, "WhatsApp")
and strings.icontains(body.current_thread.text, "invited")
)
// look for an emoji in the subject
or (
regex.icontains(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}]'
)
)
// look for sexually explicit subject titles
or regex.icontains(subject.subject,
'(?:give me|your satisfaction|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)'
)
)
// check for WhatsApp invitation within the OCR of an attachment.
or (
//
// This rule makes use of a beta feature and is subject to change without notice
// using the beta feature in custom rules is not suggested until it has been formally released
//
regex.icontains(beta.ocr(file.message_screenshot()).text,
// International format with OCR-friendly character classes
'\+?[ilo0-9]{1,3}[\s\.\-⋅]?\(?[ilo0-9]{3}\)?[\s\.\-⋅]{0,3}[ilo0-9]{3}[\s\.\-⋅]{0,3}[ilo0-9]{3,4}',
// US format
'\(?[ilo0-9]{3}\)?[\s\.\-⋅]{0,3}[ilo0-9]{3}[\s\.\-⋅]{0,3}[ilo0-9]{4}',
)
// and mentions of WhatsApp in the screenshot
and (
regex.icontains(beta.ocr(file.message_screenshot()).text,
'[Ww]hats[Aa]pp|[Ww]hatsapp'
)
or regex.icontains(beta.ocr(file.message_screenshot()).text, // WhatsApp-specific format
'[Ww]hats[Aa]pp:?[\s]*[+]?[ilo0-9\s\.\-⋅\(\)]{10,18}'
)
)
)
)
Detection logic
Scope: inbound message.
Detects messages spoofing Google Classroom notifications that contain WhatsApp contact information, phone numbers, or sexually explicit content. The rule identifies emails from no-reply@classroom.google.com that include WhatsApp invitations, emojis in the subject line, or explicit sexual language, as well as phone numbers and WhatsApp references in message screenshots from first-time senders.
- inbound message
- sender.email.email is 'no-reply@classroom.google.com'
any of
regex.iextract(body.html.display_text)where all hold:- .named_groups['sender_email'] not in $sender_emails
- .named_groups['sender_email'] not in $recipient_emails
any of:
any of:
- body.current_thread.text matches '\\bWhatsapp:?.[:0-9+ ]{7,20}\\b'
all of:
- body.current_thread.text contains 'WhatsApp'
- body.current_thread.text contains 'invited'
- 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}]'
- subject.subject matches '(?:give me|your satisfaction|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)'
all of:
beta.ocr(file.message_screenshot()).text matches any of 2 patterns
\+?[ilo0-9]{1,3}[\s\.\-⋅]?\(?[ilo0-9]{3}\)?[\s\.\-⋅]{0,3}[ilo0-9]{3}[\s\.\-⋅]{0,3}[ilo0-9]{3,4}\(?[ilo0-9]{3}\)?[\s\.\-⋅]{0,3}[ilo0-9]{3}[\s\.\-⋅]{0,3}[ilo0-9]{4}
any of:
- beta.ocr(file.message_screenshot()).text matches '[Ww]hats[Aa]pp|[Ww]hatsapp'
- beta.ocr(file.message_screenshot()).text matches '[Ww]hats[Aa]pp:?[\\s]*[+]?[ilo0-9\\s\\.\\-⋅\\(\\)]{10,18}'
Inspects: body.current_thread.text, body.html.display_text, sender.email.email, subject.subject, type.inbound. Sensors: beta.ocr, file.message_screenshot, regex.icontains, regex.iextract, strings.icontains. Reference lists: $recipient_emails, $sender_emails.
Indicators matched (11)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | no-reply@classroom.google.com |
regex.iextract | regex | (?P<sender_email>(?P<sender_name>[a-zA-Z0-9._%+-]+)@(?P<sender_domain>[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})) |
regex.icontains | regex | \bWhatsapp:?.[:0-9+ ]{7,20}\b |
strings.icontains | substring | WhatsApp |
strings.icontains | substring | invited |
regex.icontains | 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}] |
regex.icontains | regex | (?:give me|your satisfaction|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 | \+?[ilo0-9]{1,3}[\s\.\-⋅]?\(?[ilo0-9]{3}\)?[\s\.\-⋅]{0,3}[ilo0-9]{3}[\s\.\-⋅]{0,3}[ilo0-9]{3,4} |
regex.icontains | regex | \(?[ilo0-9]{3}\)?[\s\.\-⋅]{0,3}[ilo0-9]{3}[\s\.\-⋅]{0,3}[ilo0-9]{4} |
regex.icontains | regex | [Ww]hats[Aa]pp|[Ww]hatsapp |
regex.icontains | regex | [Ww]hats[Aa]pp:?[\s]*[+]?[ilo0-9\s\.\-⋅\(\)]{10,18} |
Stages and Predicates
Stage 1: mql_rule
and
or
and
or
beta.ocr(file.message_screenshot()).text regex_match "[Ww]hats[Aa]pp:?[\\s]*[+]?[ilo0-9\\s\\.\\-⋅\\(\\)]{10,18}"
beta.ocr(file.message_screenshot()).text regex_match "[Ww]hats[Aa]pp|[Ww]hatsapp"
or
beta.ocr(file.message_screenshot()).text regex_match "\\(?[ilo0-9]{3}\\)?[\\s\\.\\-⋅]{0,3}[ilo0-9]{3}[\\s\\.\\-⋅]{0,3}[ilo0-9]{4}"
beta.ocr(file.message_screenshot()).text regex_match "\\+?[ilo0-9]{1,3}[\\s\\.\\-⋅]?\\(?[ilo0-9]{3}\\)?[\\s\\.\\-⋅]{0,3}[ilo0-9]{3}[\\s\\.\\-⋅]{0,3}[ilo0-9]{3,4}"
and
body.current_thread.text contains "WhatsApp"
body.current_thread.text contains "invited"
body.current_thread.text regex_match "\\bWhatsapp:?.[:0-9+ ]{7,20}\\b"
subject.subject regex_match "(?:give me|your satisfaction|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.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(regex.iextract(body.html.display_text))
and
macro "regex.iextract(body.html.display_text)[].named_groups['sender_email'] not in recipient_emails"
macro "regex.iextract(body.html.display_text)[].named_groups['sender_email'] not in sender_emails"
sender.email.email eq "no-reply@classroom.google.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
beta.ocr(file.message_screenshot()).text | regex_match |
| field:"beta.ocr(file.message_screenshot()).text" kind:regex_match |
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match value:"\bWhatsapp:?.[:0-9+ ]{7,20}\b" |
sender.email.email | eq |
| field:"sender.email.email" kind:eq value:"no-reply@classroom.google.com" |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Google Drive share from an unsolicited reply-to address
#Identifies messages appearing to come from Google Drive sharing notifications that contain a reply-to address not previously seen in organizational communications. This tactic exploits trust in legitimate Google services while attempting to establish unauthorized communication channels.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Callback Phishing, Credential Phishing |
| Tactics and techniques | Free email provider, Social engineering, Free file host |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and sender.email.email in (
'drive-shares-dm-noreply@google.com',
'drive-shares-noreply@google.com',
)
and not any(headers.reply_to, .email.domain.domain in $org_domains)
//
// This rule makes use of a beta feature and is subject to change without notice
// using the beta feature in custom rules is not suggested until it has been formally released
//
// reply-to address has never sent an email to the org
and beta.profile.by_reply_to().prevalence == "new"
// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited
// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign
Detection logic
Scope: inbound message.
Identifies messages appearing to come from Google Drive sharing notifications that contain a reply-to address not previously seen in organizational communications. This tactic exploits trust in legitimate Google services while attempting to establish unauthorized communication channels.
- inbound message
- sender.email.email in ('drive-shares-dm-noreply@google.com', 'drive-shares-noreply@google.com')
not:
any of
headers.reply_towhere:- .email.domain.domain in $org_domains
- beta.profile.by_reply_to().prevalence is 'new'
not:
- beta.profile.by_reply_to().solicited
not:
- beta.profile.by_reply_to().any_messages_benign
Inspects: headers.reply_to, headers.reply_to[].email.domain.domain, sender.email.email, type.inbound. Sensors: beta.profile.by_reply_to. Reference lists: $org_domains.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
sender.email.email | member | drive-shares-dm-noreply@google.com |
sender.email.email | member | drive-shares-noreply@google.com |
Stages and Predicates
Stage 1: mql_rule
and
not
any(headers.reply_to)
macro "headers.reply_to[].email.domain.domain in org_domains"
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().prevalence == new"
sender.email.email in ["drive-shares-dm-noreply@google.com", "drive-shares-noreply@google.com"]
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.reply_to | array_any | excludes:headers.reply_to |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.email.email | in |
| field:"sender.email.email" kind:in |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Google Drive share from new reply-to domain
#A Google Drive sharing notification containing a reply-to address from a recently registered domain (less than 30 days old). The reply-to domain does not match any organizational domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Callback Phishing, Credential Phishing |
| Tactics and techniques | Free email provider, Social engineering, Free file host |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and sender.email.email in (
'drive-shares-dm-noreply@google.com',
'drive-shares-noreply@google.com',
)
and not any(headers.reply_to, .email.domain.domain in $org_domains)
// the message needs to have a reply-to address
and length(headers.reply_to) > 0
// new reply-to
and any(headers.reply_to, network.whois(.email.domain).days_old < 30)
Detection logic
Scope: inbound message.
A Google Drive sharing notification containing a reply-to address from a recently registered domain (less than 30 days old). The reply-to domain does not match any organizational domains.
- inbound message
- sender.email.email in ('drive-shares-dm-noreply@google.com', 'drive-shares-noreply@google.com')
not:
any of
headers.reply_towhere:- .email.domain.domain in $org_domains
- length(headers.reply_to) > 0
any of
headers.reply_towhere:- network.whois(.email.domain).days_old < 30
Inspects: headers.reply_to, headers.reply_to[].email.domain, headers.reply_to[].email.domain.domain, sender.email.email, type.inbound. Sensors: network.whois. Reference lists: $org_domains.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
sender.email.email | member | drive-shares-dm-noreply@google.com |
sender.email.email | member | drive-shares-noreply@google.com |
Stages and Predicates
Stage 1: mql_rule
and
not
any(headers.reply_to)
macro "headers.reply_to[].email.domain.domain in org_domains"
any(headers.reply_to)
network.whois func_call "network.whois(headers.reply_to[].email.domain).days_old < 30"
headers.reply_to length_compare "0"
sender.email.email in ["drive-shares-dm-noreply@google.com", "drive-shares-noreply@google.com"]
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.reply_to | array_any | excludes:headers.reply_to |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.email.email | in |
| field:"sender.email.email" kind:in |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Google Firebase sender address with suspicious content
#Detects messages from Firebase hosted domains that contain suspicious indicators such as emojis, spam keywords, unusual link patterns, or freemail registrant information.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Spam, Credential Phishing |
| Tactics and techniques | Free subdomain host, 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(body.links) != 0
and 1 of (
// has an emoji in the subject or body
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}]'
),
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}]'
),
// spammy keywords
strings.ilike(body.current_thread.text,
"*congrat*",
"*win*",
"*expired*",
"*subscription*",
"*won*",
"*gift*",
"*CARTE CADEAU*",
"*Votre chance*",
"*survey*",
"*livraison*",
"*delivery*",
"*package*",
"*claim*",
"*reward*",
),
// entire body is an image with a link
length(body.current_thread.text) == 0
and length(body.links) == 1,
// HTML body starts with a link
strings.istarts_with(body.html.raw, '<a href='),
// known spammy HTML elements
any(html.xpath(body.html, '//*/@class').nodes,
strings.icontains(.raw, 'eb-drag-and-drop-builder')
),
// multiple links that are identical
length(body.links) > 1
and length(distinct(body.links, .href_url.url)) == 1,
// body link whois email is a freemail
any(body.links,
strings.parse_email(network.whois(.href_url.domain).registrant_email).domain.root_domain in $free_email_providers
or strings.parse_email(network.whois(.href_url.domain).administrative_email
).domain.root_domain in $free_email_providers
or strings.parse_email(network.whois(.href_url.domain).technical_email).domain.root_domain in $free_email_providers
),
// all links utilize a url shortener
all(body.links, .href_url.domain.root_domain in $url_shorteners),
// freemail reply-to
any(headers.reply_to, .email.domain.root_domain in $free_email_providers),
// link with display text, but no tracking info (unusual for legitimate marketing)
any(body.links, .display_text is not null and .href_url.path is null),
// presence of Javascript inside of the message
regex.contains(body.html.raw, '<script[\s>]')
)
Detection logic
Scope: inbound message.
Detects messages from Firebase hosted domains that contain suspicious indicators such as emojis, spam keywords, unusual link patterns, or freemail registrant information.
- inbound message
- sender.email.domain.root_domain is 'firebaseapp.com'
- length(body.links) is not 0
at least 1 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}]'
body.current_thread.text matches any of 14 patterns
*congrat**win**expired**subscription**won**gift**CARTE CADEAU**Votre chance**survey**livraison**delivery**package**claim**reward*
all of:
- length(body.current_thread.text) is 0
- length(body.links) is 1
- body.html.raw starts with '<a href='
any of
html.xpath(body.html, '//*/@class').nodeswhere:- .raw contains 'eb-drag-and-drop-builder'
all of:
- length(body.links) > 1
- length(distinct(body.links, .href_url.url)) is 1
any of
body.linkswhere any holds:- strings.parse_email(network.whois(.href_url.domain).registrant_email).domain.root_domain in $free_email_providers
- strings.parse_email(network.whois(.href_url.domain).administrative_email).domain.root_domain in $free_email_providers
- strings.parse_email(network.whois(.href_url.domain).technical_email).domain.root_domain in $free_email_providers
all of
body.linkswhere:- .href_url.domain.root_domain in $url_shorteners
any of
headers.reply_towhere:- .email.domain.root_domain in $free_email_providers
any of
body.linkswhere all hold:- .display_text is set
- .href_url.path is missing
- body.html.raw matches '<script[\\s>]'
Inspects: body.current_thread.text, body.html, body.html.raw, body.links, body.links[].display_text, body.links[].href_url.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.links[].href_url.url, body.plain.raw, headers.reply_to, headers.reply_to[].email.domain.root_domain, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: html.xpath, network.whois, regex.contains, strings.icontains, strings.ilike, strings.istarts_with, strings.parse_email. Reference lists: $free_email_providers, $url_shorteners.
Indicators matched (19)
| Field | Match | Value |
|---|---|---|
sender.email.domain.root_domain | equals | firebaseapp.com |
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}] |
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* |
7 more
strings.ilike | substring | *delivery* |
strings.ilike | substring | *package* |
strings.ilike | substring | *claim* |
strings.ilike | substring | *reward* |
strings.istarts_with | prefix | <a href= |
strings.icontains | substring | eb-drag-and-drop-builder |
regex.contains | regex | <script[\s>] |
Stages and Predicates
Stage 1: mql_rule
and
or
any(body.links)
and
body.links.display_text is_not_null
body.links.href_url.path is_null
any(body.links)
or
strings.parse_email func_call "strings.parse_email(network.whois(body.links[].href_url.domain).administrative_email).domain.root_domain in free_email_providers"
strings.parse_email func_call "strings.parse_email(network.whois(body.links[].href_url.domain).registrant_email).domain.root_domain in free_email_providers"
strings.parse_email func_call "strings.parse_email(network.whois(body.links[].href_url.domain).technical_email).domain.root_domain in free_email_providers"
and
body.current_thread.text length_compare "0"
body.links length_compare "1"
and
body.links length_compare "1"
distinct(body.links, .href_url.url) length_compare "1"
any(html.xpath(body.html, '//*/@class').nodes)
html.xpath(body.html, '//*/@class').nodes.raw contains "eb-drag-and-drop-builder"
any(headers.reply_to)
macro "headers.reply_to[].email.domain.root_domain in free_email_providers"
body.current_thread.text match "CARTE CADEAU"
body.current_thread.text match "Votre chance"
body.current_thread.text match "claim"
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 "reward"
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.html.raw regex_match "<script[\\s>]"
body.html.raw starts_with "<a href="
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}]"
macro "all(body.links)"
body.links length_compare "0"
sender.email.domain.root_domain eq "firebaseapp.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
Service abuse: HelloSign from an unsolicited sender address
#Detects messages from HelloSign in which the document originates from a newly observed email address. The email address is extracted from across multiple message components, including HTML body templates and email header fields.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Social engineering, Free file host, Evasion |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and sender.email.domain.domain == "mail.hellosign.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and (
// extract the sender out of the body html template
(
// if the sender_email is available in the body
regex.icontains(body.html.raw,
'<th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\)]+)\).*?</th>'
)
// check that the sender email has not been observed previously
and all(regex.iextract(body.html.raw,
'<th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\).*?</th>'
),
.named_groups["sender_domain"] not in $org_domains
and .named_groups["sender_email"] not in $recipient_emails
and .named_groups["sender_email"] not in $sender_emails
and not (
.named_groups["sender_domain"] not in $free_email_providers
and .named_groups["sender_domain"] in $recipient_domains
and .named_groups["sender_domain"] in $sender_domains
)
)
)
// extract the sender out of header hops if it's there
or any(headers.hops,
any(.fields,
.name == "X-Mailgun-Variables"
and strings.icontains(.value, 'on_behalf_of_email')
and all(regex.iextract(.value,
'\"on_behalf_of_email": \"(?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\",'
),
.named_groups["sender_domain"] not in $org_domains
and .named_groups["sender_email"] not in $recipient_emails
and .named_groups["sender_email"] not in $sender_emails
and not (
.named_groups["sender_domain"] not in $free_email_providers
and .named_groups["sender_domain"] in $recipient_domains
and .named_groups["sender_domain"] in $sender_domains
)
)
)
)
// extract the sender from the "reply to sender" element withn the body.html.raw
or (
regex.icontains(body.html.raw,
'<a href="mailto:[^\?]+\?[^\"]+\"[^\>]+\>(?:<img[^\>]+\>)?\s*Reply to sender<\/a>'
)
and all(regex.iextract(body.html.raw,
'<a href="mailto:(?P<sender_email>[^\?]+@(?P<sender_domain>[^\?]+))\?[^\"]+\"[^\>]+\>(?:<img[^\>]+\>)?\s*Reply to sender<\/a>'
),
.named_groups["sender_domain"] not in $org_domains
and .named_groups["sender_email"] not in $recipient_emails
and .named_groups["sender_email"] not in $sender_emails
and not (
.named_groups["sender_domain"] not in $free_email_providers
and .named_groups["sender_domain"] in $recipient_domains
and .named_groups["sender_domain"] in $sender_domains
)
)
)
)
Detection logic
Scope: inbound message.
Detects messages from HelloSign in which the document originates from a newly observed email address. The email address is extracted from across multiple message components, including HTML body templates and email header fields.
- inbound message
- sender.email.domain.domain is 'mail.hellosign.com'
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
any of:
all of:
- body.html.raw matches '<th class="action-item--action[^\\>]+\\>\\s*[^\\<]*\\((?P<sender_email>[^\\)]+)\\).*?</th>'
all of
regex.iextract(body.html.raw)where all hold:- .named_groups['sender_domain'] not in $org_domains
- .named_groups['sender_email'] not in $recipient_emails
- .named_groups['sender_email'] not in $sender_emails
not:
all of:
- .named_groups['sender_domain'] not in $free_email_providers
- .named_groups['sender_domain'] in $recipient_domains
- .named_groups['sender_domain'] in $sender_domains
any of
headers.hopswhere:any of
.fieldswhere all hold:- .name is 'X-Mailgun-Variables'
- .value contains 'on_behalf_of_email'
all of
regex.iextract(.value)where all hold:- .named_groups['sender_domain'] not in $org_domains
- .named_groups['sender_email'] not in $recipient_emails
- .named_groups['sender_email'] not in $sender_emails
not:
all of:
- .named_groups['sender_domain'] not in $free_email_providers
- .named_groups['sender_domain'] in $recipient_domains
- .named_groups['sender_domain'] in $sender_domains
all of:
- body.html.raw matches '<a href="mailto:[^\\?]+\\?[^\\"]+\\"[^\\>]+\\>(?:<img[^\\>]+\\>)?\\s*Reply to sender<\\/a>'
all of
regex.iextract(body.html.raw)where all hold:- .named_groups['sender_domain'] not in $org_domains
- .named_groups['sender_email'] not in $recipient_emails
- .named_groups['sender_email'] not in $sender_emails
not:
all of:
- .named_groups['sender_domain'] not in $free_email_providers
- .named_groups['sender_domain'] in $recipient_domains
- .named_groups['sender_domain'] in $sender_domains
Inspects: body.html.raw, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, sender.email.domain.domain, type.inbound. Sensors: regex.icontains, regex.iextract, strings.icontains. Reference lists: $free_email_providers, $org_domains, $recipient_domains, $recipient_emails, $sender_domains, $sender_emails.
Indicators matched (8)
| Field | Match | Value |
|---|---|---|
sender.email.domain.domain | equals | mail.hellosign.com |
regex.icontains | regex | <th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\)]+)\).*?</th> |
regex.iextract | regex | <th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\).*?</th> |
headers.hops[].fields[].name | equals | X-Mailgun-Variables |
strings.icontains | substring | on_behalf_of_email |
regex.iextract | regex | \"on_behalf_of_email": \"(?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\", |
regex.icontains | regex | <a href="mailto:[^\?]+\?[^\"]+\"[^\>]+\>(?:<img[^\>]+\>)?\s*Reply to sender<\/a> |
regex.iextract | regex | <a href="mailto:(?P<sender_email>[^\?]+@(?P<sender_domain>[^\?]+))\?[^\"]+\"[^\>]+\>(?:<img[^\>]+\>)?\s*Reply to sender<\/a> |
Stages and Predicates
Stage 1: mql_rule
and
or
any(headers.hops)
any(headers.hops.fields)
and
headers.hops.fields[].name eq "X-Mailgun-Variables"
headers.hops.fields[].value contains "on_behalf_of_email"
macro "all(regex.iextract(headers.hops[].fields[].value))"
and
body.html.raw regex_match "<a href=\"mailto:[^\\?]+\\?[^\\\"]+\\\"[^\\>]+\\>(?:<img[^\\>]+\\>)?\\s*Reply to sender<\\/a>"
macro "all(regex.iextract(body.html.raw))"
and
body.html.raw regex_match "<th class=\"action-item--action[^\\>]+\\>\\s*[^\\<]*\\((?P<sender_email>[^\\)]+)\\).*?</th>"
macro "all(regex.iextract(body.html.raw))"
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.pass eq "true"
sender.email.domain.domain eq "mail.hellosign.com"
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 |
headers.auth_summary.dmarc.pass | eq |
| field:"headers.auth_summary.dmarc.pass" kind:eq value:"true" |
headers.auth_summary.spf.pass | eq |
| field:"headers.auth_summary.spf.pass" kind:eq value:"true" |
sender.email.domain.domain | eq |
| field:"sender.email.domain.domain" kind:eq value:"mail.hellosign.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service Abuse: HelloSign share with suspicious sender or document name
#The detection rule is designed to identify messages sent from HelloSign that notify recipients about a shared file and contain suspicious content either in the document or the sender's display name.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, BEC/Fraud |
| Tactics and techniques | Evasion, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Legitimate Dropbox sending infrastructure
and sender.email.email == "noreply@mail.hellosign.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and (
strings.icontains(subject.subject, ' - Signature Requested')
or (
strings.icontains(subject.subject, 'Reminder: ')
and strings.icontains(subject.subject, 'awaiting your signature')
)
)
and not strings.icontains(subject.subject, 'You just signed')
// negate CDP Esign which reuses hellosign
and not strings.contains(body.current_thread.text, '@cdpesign.com')
// negate messages where the "on_behalf_of_email" is within the org_domains
and not any(headers.hops,
any(.fields,
.name == "X-Mailgun-Variables"
and strings.icontains(.value, 'on_behalf_of_email')
and all(regex.iextract(.value,
'\"on_behalf_of_email": \"(?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\",'
),
.named_groups["sender_domain"] in $org_domains
)
)
)
// sometimes there isn't an on_behalf_of_email, so in those cases we can use the body to extract the sender
and not (
regex.icontains(body.html.raw,
'<th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\)]+)\).*?</th>'
)
// check that the sender email has not been observed previously
and all(regex.iextract(body.html.raw,
'<th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\).*?</th>'
),
.named_groups["sender_domain"] in $org_domains
)
)
and (
// contains the word dropbox
// the subject is in the format of "<actor controlled title>(?: - Signature Requested by| is awaiting your signature) <actor controlled name>"
(
strings.icontains(subject.subject, 'dropbox')
// negate where the sender is dropbox
and not any(headers.hops,
any(.fields,
.name == "X-Mailgun-Variables"
and regex.contains(.value,
'\"on_behalf_of_email": \"[^\"]+@dropbox.com\"'
)
)
)
)
or strings.icontains(subject.subject, 'sharefile')
or strings.icontains(subject.subject, 'helloshare')
// sender names part of the subject
or (
// Signature Terms in the Sender Display Name
strings.icontains(sender.display_name, 'Signature Requ')
// Billing Accounting
or regex.icontains(sender.display_name,
'Accounts? (?:Payable|Receivable)',
)
or strings.icontains(sender.display_name, 'Billing Support')
// HR/Payroll/Legal/etc
or strings.icontains(sender.display_name, 'Compliance HR')
or regex.icontains(sender.display_name,
'(?:Compliance|Executive|\bHR\b|Human Resources|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Support).*(?:Department|Dept|Team|Desk)?'
)
or strings.icontains(sender.display_name, 'Corporate Communications')
or strings.icontains(sender.display_name, 'Employee Relations')
or strings.icontains(sender.display_name, 'Office Manager')
or strings.icontains(sender.display_name, 'Risk Management')
or regex.icontains(sender.display_name, 'Payroll Admin(?:istrator)?')
// IT related
or regex.icontains(sender.display_name,
'IT Support',
'Information Technology',
'(?:Network|System) Admin(?:istrator)?',
'Help Desk',
'Tech(?:nical) Support'
)
)
// NLU/Logo Detection on message from the sender/message body
or any(html.xpath(body.html,
'//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th'
).nodes,
any(ml.nlu_classifier(.display_text).intents,
.name == "callback_scam" and .confidence == "high"
)
)
// callback logos
or any(ml.logo_detect(file.message_screenshot()).brands,
.name in ("PayPal", "Norton", "GeekSquad", "Ebay", "McAfee", "AT&T")
)
// filename analysis
// the filename is also contianed in the subject line
or (
// scanner themed
regex.icontains(subject.subject,
'scanne[rd].*(?: - Signature Requested by| is awaiting your signature)'
)
// image theme
or regex.icontains(subject.subject,
'_IMG_.*(?: - Signature Requested by| is awaiting your signature)',
'IMG[_-](?:\d|\W)+.*(?: - Signature Requested by| is awaiting your signature)'
)
// Invoice Themes
or regex.icontains(subject.subject,
'(?:INV\b|\bACH\b|Wire Confirmation|\bP[O0]\W+?\d+\"|\bP[O0](?:\W+?|\d+)|Purchase Order|Past Due|Remit(?:tance)?).*(?: - Signature Requested by| is awaiting your signature)'
)
// Payment Themes
or regex.icontains(subject.subject,
'(?:payment.*(?:complete|confirmation|approved|recent|processing)|(complete|confirmation|approved|recent|processing).*payment).*(?: - Signature Requested by| is awaiting your signature)'
)
// Payroll/HR
or regex.icontains(subject.subject,
'(?:Payroll|Employee Pay\b|Salary|Benefit Enrollment|Payment.*Benefit|Benefit.*Update|Employee Handbook|Reimbursement Approved).*(?: - Signature Requested by| is awaiting your signature)'
)
// shared files/extenstion/urgency/CTA
or regex.icontains(subject.subject,
'(?:Urgent|Important|Immediate|Secure|Encrypt|shared|\bsent\b|protected|Validate|Final Notice|Review(?:and |& )?Sign|Download PDF).*(?: - Signature Requested by| is awaiting your signature)'
)
// MFA theme
or regex.icontains(subject.subject,
'(?:Verification Code|\bMFA\b).*(?: - Signature Requested by| is awaiting your signature)'
)
)
)
Detection logic
Scope: inbound message.
The detection rule is designed to identify messages sent from HelloSign that notify recipients about a shared file and contain suspicious content either in the document or the sender's display name.
- inbound message
- sender.email.email is 'noreply@mail.hellosign.com'
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
any of:
- subject.subject contains ' - Signature Requested'
all of:
- subject.subject contains 'Reminder: '
- subject.subject contains 'awaiting your signature'
not:
- subject.subject contains 'You just signed'
not:
- body.current_thread.text contains '@cdpesign.com'
not:
any of
headers.hopswhere:any of
.fieldswhere all hold:- .name is 'X-Mailgun-Variables'
- .value contains 'on_behalf_of_email'
all of
regex.iextract(.value)where:- .named_groups['sender_domain'] in $org_domains
not:
all of:
- body.html.raw matches '<th class="action-item--action[^\\>]+\\>\\s*[^\\<]*\\((?P<sender_email>[^\\)]+)\\).*?</th>'
all of
regex.iextract(body.html.raw)where:- .named_groups['sender_domain'] in $org_domains
any of:
all of:
- subject.subject contains 'dropbox'
not:
any of
headers.hopswhere:any of
.fieldswhere all hold:- .name is 'X-Mailgun-Variables'
- .value matches '\\"on_behalf_of_email": \\"[^\\"]+@dropbox.com\\"'
- subject.subject contains 'sharefile'
- subject.subject contains 'helloshare'
any of:
- sender.display_name contains 'Signature Requ'
- sender.display_name matches 'Accounts? (?:Payable|Receivable)'
- sender.display_name contains 'Billing Support'
- sender.display_name contains 'Compliance HR'
- sender.display_name matches '(?:Compliance|Executive|\\bHR\\b|Human Resources|\\bHR\\b|\\bIT\\b|Legal|Payroll|Purchasing|Operations|Security|Support).*(?:Department|Dept|Team|Desk)?'
- sender.display_name contains 'Corporate Communications'
- sender.display_name contains 'Employee Relations'
- sender.display_name contains 'Office Manager'
- sender.display_name contains 'Risk Management'
- sender.display_name matches 'Payroll Admin(?:istrator)?'
sender.display_name matches any of 5 patterns
IT SupportInformation Technology(?:Network|System) Admin(?:istrator)?Help DeskTech(?:nical) Support
any of
html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodeswhere:any of
ml.nlu_classifier(.display_text).intentswhere all hold:- .name is 'callback_scam'
- .confidence is 'high'
any of
ml.logo_detect(file.message_screenshot()).brandswhere:- .name in ('PayPal', 'Norton', 'GeekSquad', 'Ebay', 'McAfee', 'AT&T')
subject.subject matches any of 8 patterns
scanne[rd].*(?: - Signature Requested by| is awaiting your signature)_IMG_.*(?: - Signature Requested by| is awaiting your signature)IMG[_-](?:\d|\W)+.*(?: - Signature Requested by| is awaiting your signature)(?:INV\b|\bACH\b|Wire Confirmation|\bP[O0]\W+?\d+\"|\bP[O0](?:\W+?|\d+)|Purchase Order|Past Due|Remit(?:tance)?).*(?: - Signature Requested by| is awaiting your signature)(?:payment.*(?:complete|confirmation|approved|recent|processing)|(complete|confirmation|approved|recent|processing).*payment).*(?: - Signature Requested by| is awaiting your signature)(?:Payroll|Employee Pay\b|Salary|Benefit Enrollment|Payment.*Benefit|Benefit.*Update|Employee Handbook|Reimbursement Approved).*(?: - Signature Requested by| is awaiting your signature)(?:Urgent|Important|Immediate|Secure|Encrypt|shared|\bsent\b|protected|Validate|Final Notice|Review(?:and |& )?Sign|Download PDF).*(?: - Signature Requested by| is awaiting your signature)(?:Verification Code|\bMFA\b).*(?: - Signature Requested by| is awaiting your signature)
Inspects: body.current_thread.text, body.html, body.html.raw, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, sender.display_name, sender.email.email, subject.subject, type.inbound. Sensors: file.message_screenshot, html.xpath, ml.logo_detect, ml.nlu_classifier, regex.contains, regex.icontains, regex.iextract, strings.contains, strings.icontains. Reference lists: $org_domains.
Indicators matched (38)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | noreply@mail.hellosign.com |
strings.icontains | substring | - Signature Requested |
strings.icontains | substring | Reminder: |
strings.icontains | substring | awaiting your signature |
strings.icontains | substring | dropbox |
strings.icontains | substring | sharefile |
strings.icontains | substring | helloshare |
strings.icontains | substring | Signature Requ |
regex.icontains | regex | Accounts? (?:Payable|Receivable) |
strings.icontains | substring | Billing Support |
strings.icontains | substring | Compliance HR |
regex.icontains | regex | (?:Compliance|Executive|\bHR\b|Human Resources|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Support).*(?:Department|Dept|Team|Desk)? |
26 more
strings.icontains | substring | Corporate Communications |
strings.icontains | substring | Employee Relations |
strings.icontains | substring | Office Manager |
strings.icontains | substring | Risk Management |
regex.icontains | regex | Payroll Admin(?:istrator)? |
regex.icontains | regex | IT Support |
regex.icontains | regex | Information Technology |
regex.icontains | regex | (?:Network|System) Admin(?:istrator)? |
regex.icontains | regex | Help Desk |
regex.icontains | regex | Tech(?:nical) Support |
ml.nlu_classifier(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes[].display_text).intents[].name | equals | callback_scam |
ml.nlu_classifier(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes[].display_text).intents[].confidence | equals | high |
ml.logo_detect(file.message_screenshot()).brands[].name | member | PayPal |
ml.logo_detect(file.message_screenshot()).brands[].name | member | Norton |
ml.logo_detect(file.message_screenshot()).brands[].name | member | GeekSquad |
ml.logo_detect(file.message_screenshot()).brands[].name | member | Ebay |
ml.logo_detect(file.message_screenshot()).brands[].name | member | McAfee |
ml.logo_detect(file.message_screenshot()).brands[].name | member | AT&T |
regex.icontains | regex | scanne[rd].*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | _IMG_.*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | IMG[_-](?:\d|\W)+.*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | (?:INV\b|\bACH\b|Wire Confirmation|\bP[O0]\W+?\d+\"|\bP[O0](?:\W+?|\d+)|Purchase Order|Past Due|Remit(?:tance)?).*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | (?:payment.*(?:complete|confirmation|approved|recent|processing)|(complete|confirmation|approved|recent|processing).*payment).*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | (?:Payroll|Employee Pay\b|Salary|Benefit Enrollment|Payment.*Benefit|Benefit.*Update|Employee Handbook|Reimbursement Approved).*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | (?:Urgent|Important|Immediate|Secure|Encrypt|shared|\bsent\b|protected|Validate|Final Notice|Review(?:and |& )?Sign|Download PDF).*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | (?:Verification Code|\bMFA\b).*(?: - Signature Requested by| is awaiting your signature) |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
any(headers.hops)
any(headers.hops.fields)
and
headers.hops.fields[].name eq "X-Mailgun-Variables"
headers.hops.fields[].value regex_match "\\\"on_behalf_of_email\": \\\"[^\\\"]+@dropbox.com\\\""
subject.subject contains "dropbox"
any(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes)
any(ml.nlu_classifier(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes.display_text).intents)
and
ml.nlu_classifier(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes[].display_text).intents[].confidence eq "high"
ml.nlu_classifier(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes[].display_text).intents[].name eq "callback_scam"
any(ml.logo_detect(file.message_screenshot()).brands)
ml.logo_detect(file.message_screenshot()).brands.name in ["AT&T", "Ebay", "GeekSquad", "McAfee", "Norton", "PayPal"]
sender.display_name contains "Billing Support"
sender.display_name contains "Compliance HR"
sender.display_name contains "Corporate Communications"
sender.display_name contains "Employee Relations"
sender.display_name contains "Office Manager"
sender.display_name contains "Risk Management"
sender.display_name contains "Signature Requ"
sender.display_name regex_match "(?:Compliance|Executive|\\bHR\\b|Human Resources|\\bHR\\b|\\bIT\\b|Legal|Payroll|Purchasing|Operations|Security|Support).*(?:Department|Dept|Team|Desk)?"
sender.display_name regex_match "(?:Network|System) Admin(?:istrator)?"
sender.display_name regex_match "Accounts? (?:Payable|Receivable)"
sender.display_name regex_match "Help Desk"
sender.display_name regex_match "IT Support"
sender.display_name regex_match "Information Technology"
sender.display_name regex_match "Payroll Admin(?:istrator)?"
sender.display_name regex_match "Tech(?:nical) Support"
subject.subject contains "helloshare"
subject.subject contains "sharefile"
subject.subject regex_match "(?:INV\\b|\\bACH\\b|Wire Confirmation|\\bP[O0]\\W+?\\d+\\\"|\\bP[O0](?:\\W+?|\\d+)|Purchase Order|Past Due|Remit(?:tance)?).*(?: - Signature Requested by| is awaiting your signature)"
subject.subject regex_match "(?:Payroll|Employee Pay\\b|Salary|Benefit Enrollment|Payment.*Benefit|Benefit.*Update|Employee Handbook|Reimbursement Approved).*(?: - Signature Requested by| is awaiting your signature)"
subject.subject regex_match "(?:Urgent|Important|Immediate|Secure|Encrypt|shared|\\bsent\\b|protected|Validate|Final Notice|Review(?:and |& )?Sign|Download PDF).*(?: - Signature Requested by| is awaiting your signature)"
subject.subject regex_match "(?:Verification Code|\\bMFA\\b).*(?: - Signature Requested by| is awaiting your signature)"
subject.subject regex_match "(?:payment.*(?:complete|confirmation|approved|recent|processing)|(complete|confirmation|approved|recent|processing).*payment).*(?: - Signature Requested by| is awaiting your signature)"
subject.subject regex_match "IMG[_-](?:\\d|\\W)+.*(?: - Signature Requested by| is awaiting your signature)"
subject.subject regex_match "_IMG_.*(?: - Signature Requested by| is awaiting your signature)"
subject.subject regex_match "scanne[rd].*(?: - Signature Requested by| is awaiting your signature)"
not
any(headers.hops)
any(headers.hops.fields)
and
headers.hops.fields[].name eq "X-Mailgun-Variables"
headers.hops.fields[].value contains "on_behalf_of_email"
macro "all(regex.iextract(headers.hops[].fields[].value))"
not
and
body.html.raw regex_match "<th class=\"action-item--action[^\\>]+\\>\\s*[^\\<]*\\((?P<sender_email>[^\\)]+)\\).*?</th>"
macro "all(regex.iextract(body.html.raw))"
or
and
subject.subject contains "Reminder: "
subject.subject contains "awaiting your signature"
subject.subject contains " - Signature Requested"
not
body.current_thread.text contains "@cdpesign.com"
not
subject.subject contains "You just signed"
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.pass eq "true"
sender.email.email eq "noreply@mail.hellosign.com"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.hops | array_any | excludes:headers.hops | |
body.html.raw | regex_match | <th class="action-item--action[^\>]+\>\s*[^\<]*((?P<sender_email>[^)]+)).*?</th> | excludes:body.html.raw |
body.current_thread.text | contains | @cdpesign.com | excludes:body.current_thread.text field:"body.current_thread.text" value:"@cdpesign.com" |
subject.subject | contains | You just signed | excludes:subject.subject field:"subject.subject" value:"You just signed" |
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:"true" |
headers.auth_summary.spf.pass | eq |
| field:"headers.auth_summary.spf.pass" kind:eq value:"true" |
sender.display_name | contains |
| field:"sender.display_name" kind:contains |
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match |
sender.email.email | eq |
| field:"sender.email.email" kind:eq value:"noreply@mail.hellosign.com" |
subject.subject | contains |
| field:"subject.subject" kind:contains |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Meetup.com redirect with brand impersonation
#Detects messages abusing Meetup.com's click tracking service with lengthy redirect URLs while impersonating legitimate Meetup communications. The rule identifies suspicious links to clicks.meetup.com with URLs exceeding 300 characters, excludes legitimate Meetup emails by checking for their branding elements, and filters out high-trust authenticated senders.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Open redirect, Impersonation: Brand, Evasion |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// we check 'body links' as this campaign has been observed abusing fake threads
and any(body.links,
.href_url.domain.domain == "clicks.meetup.com"
// lengthy url hints at redirect the circus that occurs
and length(.href_url.url) > 300
)
// negate legit meetup.com by checking for their logo
and not any(html.xpath(body.html, '//img/@src').nodes,
strings.icontains(.raw, 'meetupstatic')
)
// negate high trust senders that pass auth
and not (
sender.email.domain.root_domain in $high_trust_sender_root_domains
and coalesce(headers.auth_summary.dmarc.pass, false)
)
Detection logic
Scope: inbound message.
Detects messages abusing Meetup.com's click tracking service with lengthy redirect URLs while impersonating legitimate Meetup communications. The rule identifies suspicious links to clicks.meetup.com with URLs exceeding 300 characters, excludes legitimate Meetup emails by checking for their branding elements, and filters out high-trust authenticated senders.
- inbound message
any of
body.linkswhere all hold:- .href_url.domain.domain is 'clicks.meetup.com'
- length(.href_url.url) > 300
not:
any of
html.xpath(body.html, '//img/@src').nodeswhere:- .raw contains 'meetupstatic'
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass)
Inspects: body.html, body.links, body.links[].href_url.domain.domain, body.links[].href_url.url, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: html.xpath, strings.icontains. Reference lists: $high_trust_sender_root_domains.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
body.links[].href_url.domain.domain | equals | clicks.meetup.com |
Stages and Predicates
Stage 1: mql_rule
and
any(body.links)
and
body.links.href_url.domain.domain eq "clicks.meetup.com"
body.links.href_url.url length_compare "300"
not
and
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
not
any(html.xpath(body.html, '//img/@src').nodes)
html.xpath(body.html, '//img/@src').nodes.raw contains "meetupstatic"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
html.xpath(body.html, '//img/@src').nodes | array_any | excludes:html.xpath(body.html, '//img/@src').nodes |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Microsoft with suspicious indicators in subject
#Detects messages impersonating Microsoft account verification that contain suspicious indicators in the subject line, including phone numbers, monetary amounts, suspicious domains, explicit content, or lengthy action-oriented phrases.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, Spam |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
//
// Warning: This rule contains sexually explicit keywords
//
and sender.email.domain.root_domain == "microsoftonline.com"
and strings.icontains(subject.subject, 'account email verification code')
and (
// phone number regex
regex.icontains(strings.replace_confusables(subject.base),
'\+?(?:[ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}',
'\+?(?:[ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4}',
'\(?[ilo0-9]{3}\)?[^ilo0-9]{0,3}\(?[ilo0-9]{3}\)?.?[ilo0-9]{4}'
)
// dollar amounts
or regex.icontains(subject.base, '(?:USD|\$)\s?\d')
or regex.icontains(subject.base, '\d+\.\d{2}\s?(?:USD|usd)')
// suspicious TLDs
or regex.icontains(subject.base,
'\.(?:ac\.th|biz\.id|co\.(?:cl|id|za)|com\.(?:ge|py)|my\.id|ne\.jp|net\.ms|nom\.za|web\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\b'
)
// dating/spam/explicit content lures
or regex.icontains(strings.replace_confusables(subject.base),
'(?:\bs\s?e\s?x\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)'
)
// action verbs + length
or (
strings.count(subject.base, " ") > 8
and regex.icontains(strings.replace_confusables(subject.base),
'(?:call|dial|speak to|contact \d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))'
)
)
)
Detection logic
Scope: inbound message.
Detects messages impersonating Microsoft account verification that contain suspicious indicators in the subject line, including phone numbers, monetary amounts, suspicious domains, explicit content, or lengthy action-oriented phrases.
- inbound message
- sender.email.domain.root_domain is 'microsoftonline.com'
- subject.subject contains 'account email verification code'
any of:
strings.replace_confusables(subject.base) matches any of 3 patterns
\+?(?:[ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}\+?(?:[ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4}\(?[ilo0-9]{3}\)?[^ilo0-9]{0,3}\(?[ilo0-9]{3}\)?.?[ilo0-9]{4}
- subject.base matches '(?:USD|\\$)\\s?\\d'
- subject.base matches '\\d+\\.\\d{2}\\s?(?:USD|usd)'
- subject.base matches '\\.(?:ac\\.th|biz\\.id|co\\.(?:cl|id|za)|com\\.(?:ge|py)|my\\.id|ne\\.jp|net\\.ms|nom\\.za|web\\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\\b'
- strings.replace_confusables(subject.base) matches '(?:\\bs\\s?e\\s?x\\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)'
all of:
- strings.count(subject.base, ' ') > 8
- strings.replace_confusables(subject.base) matches '(?:call|dial|speak to|contact \\d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))'
Inspects: sender.email.domain.root_domain, subject.base, subject.subject, type.inbound. Sensors: regex.icontains, strings.count, strings.icontains, strings.replace_confusables.
Indicators matched (10)
| Field | Match | Value |
|---|---|---|
sender.email.domain.root_domain | equals | microsoftonline.com |
strings.icontains | substring | account email verification code |
regex.icontains | regex | \+?(?:[ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4} |
regex.icontains | regex | \+?(?:[ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4} |
regex.icontains | regex | \(?[ilo0-9]{3}\)?[^ilo0-9]{0,3}\(?[ilo0-9]{3}\)?.?[ilo0-9]{4} |
regex.icontains | regex | (?:USD|\$)\s?\d |
regex.icontains | regex | \d+\.\d{2}\s?(?:USD|usd) |
regex.icontains | regex | \.(?:ac\.th|biz\.id|co\.(?:cl|id|za)|com\.(?:ge|py)|my\.id|ne\.jp|net\.ms|nom\.za|web\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\b |
regex.icontains | regex | (?:\bs\s?e\s?x\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner) |
regex.icontains | regex | (?:call|dial|speak to|contact \d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze)) |
Stages and Predicates
Stage 1: mql_rule
and
or
and
strings.count func_call "strings.count(subject.base, \" \") > 8"
strings.replace_confusables(subject.base) regex_match "(?:call|dial|speak to|contact \\d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))"
strings.replace_confusables(subject.base) regex_match "(?:\\bs\\s?e\\s?x\\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)"
strings.replace_confusables(subject.base) regex_match "\\(?[ilo0-9]{3}\\)?[^ilo0-9]{0,3}\\(?[ilo0-9]{3}\\)?.?[ilo0-9]{4}"
strings.replace_confusables(subject.base) regex_match "\\+?(?:[ilo0-9]{1,2})?\\s?\\(?\\d{3}\\)?[\\s\\.\\-⋅]{0,5}[ilo0-9]{3}[\\s\\.\\-⋅]{0,5}[ilo0-9]{4}"
strings.replace_confusables(subject.base) regex_match "\\+?(?:[ilo0-9]{1}.)?\\(?[ilo0-9]{3}?\\)?.[ilo0-9]{3}.?[ilo0-9]{4}"
subject.base regex_match "(?:USD|\\$)\\s?\\d"
subject.base regex_match "\\.(?:ac\\.th|biz\\.id|co\\.(?:cl|id|za)|com\\.(?:ge|py)|my\\.id|ne\\.jp|net\\.ms|nom\\.za|web\\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\\b"
subject.base regex_match "\\d+\\.\\d{2}\\s?(?:USD|usd)"
sender.email.domain.root_domain eq "microsoftonline.com"
subject.subject contains "account email verification code"
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:"microsoftonline.com" |
strings.replace_confusables(subject.base) | regex_match |
| field:"strings.replace_confusables(subject.base)" kind:regex_match |
subject.base | regex_match |
| field:"subject.base" kind:regex_match |
subject.subject | contains |
| field:"subject.subject" kind:contains value:"account email verification code" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: QuickBooks notification from new domain
#This Attack Surface Reduction (ASR) rule matches on QuickBooks notifications with recently registered reply-to domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, Credential Phishing, BEC/Fraud |
| Tactics and techniques | Evasion, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Legitimate Intuit sending infratructure
and sender.email.email == "quickbooks@notification.intuit.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and strings.ends_with(headers.auth_summary.spf.details.designator,
'.intuit.com'
)
// remove payment confirmation messages
and not strings.starts_with(subject.subject, 'Payment confirmation:')
// the message needs to have a reply-to address
and length(headers.reply_to) > 0
//
// This rule makes use of a beta feature and is subject to change without notice
// using the beta feature in custom rules is not suggested until it has been formally released
//
// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited
// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign
// new reply-to
and any(headers.reply_to, network.whois(.email.domain).days_old < 30)
Detection logic
Scope: inbound message.
This Attack Surface Reduction (ASR) rule matches on QuickBooks notifications with recently registered reply-to domains.
- inbound message
- sender.email.email is 'quickbooks@notification.intuit.com'
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
- headers.auth_summary.spf.details.designator ends with '.intuit.com'
not:
- subject.subject starts with 'Payment confirmation:'
- length(headers.reply_to) > 0
not:
- beta.profile.by_reply_to().solicited
not:
- beta.profile.by_reply_to().any_messages_benign
any of
headers.reply_towhere:- network.whois(.email.domain).days_old < 30
Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.details.designator, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain, sender.email.email, subject.subject, type.inbound. Sensors: beta.profile.by_reply_to, network.whois, strings.ends_with, strings.starts_with.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | quickbooks@notification.intuit.com |
strings.ends_with | suffix | .intuit.com |
Stages and Predicates
Stage 1: mql_rule
and
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
any(headers.reply_to)
network.whois func_call "network.whois(headers.reply_to[].email.domain).days_old < 30"
not
subject.subject starts_with "Payment confirmation:"
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.details.designator ends_with ".intuit.com"
headers.auth_summary.spf.pass eq "true"
headers.reply_to length_compare "0"
sender.email.email eq "quickbooks@notification.intuit.com"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
subject.subject | starts_with | Payment confirmation: | excludes:subject.subject field:"subject.subject" value:"Payment confirmation:" |
Indicators
These rows show field, operator, and value matches.
Service abuse: QuickBooks notification with suspicious comments
#This detection rule matches QuickBooks notifications that contain suspicious keywords within the comments section of the notification
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, Credential Phishing, BEC/Fraud |
| Tactics and techniques | Evasion, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Legitimate Intuit sending infratructure
and sender.email.email == "quickbooks@notification.intuit.com"
// remove payment confirmation messages
and not strings.starts_with(subject.subject, 'Payment confirmation:')
and body.html.raw is not null
// Comments contains suspicious phrases
and (
// several different templates where commonly observed, run regex for each template
any([
html.xpath(body.html,
'//span[@id="condensedEmailMessageSectionContentWebPlayer"]'
).nodes,
html.xpath(body.html, '//div[@id="emailContainer"]').nodes,
html.xpath(body.html, '//table[@width="700"][1]//tr/td').nodes,
html.xpath(body.html, '//tr[@class="email-header"]').nodes,
html.xpath(body.html, '//tr[@class="email-center"]').nodes,
html.xpath(body.html, '//div[@class="mlr22"]').nodes,
html.xpath(body.html, '//td[@class="itemDesc"]//div').nodes,
html.xpath(body.html, '//td[@class="shippingContent"]//div').nodes,
html.xpath(body.html,
'//table[@class="shippingAndCustomLayout width100"]'
).nodes
],
any(.,
regex.icontains(.inner_text,
// subscription, renewals, verificaitons, etc
'(?:your subscription renewal|couldn.?t be processed|trouble renewing subscription|update your details|just update your|continue your subscription|prefer to use EFT|change payment method|verify your account|suspended due to issue|payment declined notice|account needs verification|confirm your billing|immediate action required|failed payment notification|billing information update|service interruption warning|unable to process payment|subscription payment failed|action needed now|update banking information|subscription expiration notice|payment method change|bill\s+to\s+subscriber)',
// callback wording
'recognize this seller?|For more info.{0,25}Call|To cancel.{0,25}Call|did not authorize',
)
)
)
)
Detection logic
Scope: inbound message.
This detection rule matches QuickBooks notifications that contain suspicious keywords within the comments section of the notification
- inbound message
- sender.email.email is 'quickbooks@notification.intuit.com'
not:
- subject.subject starts with 'Payment confirmation:'
- body.html.raw is set
any of
[html.xpath(body.html, '//span[@id="condensedEmailMessageSectionContentWebPlayer"]').nodes, html.xpath(body.html, '//div[@id="emailContainer"]').nodes, html.xpath(body.html, '//table[@width="700"][1]//tr/td').nodes, html.xpath(body.html, '//tr[@class="email-header"]').nodes, html.xpath(body.html, '//tr[@class="email-center"]').nodes, html.xpath(body.html, '//div[@class="mlr22"]').nodes, html.xpath(body.html, '//td[@class="itemDesc"]//div').nodes, html.xpath(body.html, '//td[@class="shippingContent"]//div').nodes, html.xpath(body.html, '//table[@class="shippingAndCustomLayout width100"]').nodes]where:any of
.where:.inner_text matches any of 2 patterns
(?:your subscription renewal|couldn.?t be processed|trouble renewing subscription|update your details|just update your|continue your subscription|prefer to use EFT|change payment method|verify your account|suspended due to issue|payment declined notice|account needs verification|confirm your billing|immediate action required|failed payment notification|billing information update|service interruption warning|unable to process payment|subscription payment failed|action needed now|update banking information|subscription expiration notice|payment method change|bill\s+to\s+subscriber)recognize this seller?|For more info.{0,25}Call|To cancel.{0,25}Call|did not authorize
Inspects: body.html, body.html.raw, sender.email.email, subject.subject, type.inbound. Sensors: html.xpath, regex.icontains, strings.starts_with.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | quickbooks@notification.intuit.com |
regex.icontains | regex | (?:your subscription renewal|couldn.?t be processed|trouble renewing subscription|update your details|just update your|continue your subscription|prefer to use EFT|change payment method|verify your account|suspended due to issue|payment declined notice|account needs verification|confirm your billing|immediate action required|failed payment notification|billing information update|service interruption warning|unable to process payment|subscription payment failed|action needed now|update banking information|subscription expiration notice|payment method change|bill\s+to\s+subscriber) |
regex.icontains | regex | recognize this seller?|For more info.{0,25}Call|To cancel.{0,25}Call|did not authorize |
Stages and Predicates
Stage 1: mql_rule
and
any([html.xpath(body.html, '//span[@id="condensedEmailMessageSectionContentWebPlayer"]').nodes, html.xpath(body.html, '//div[@id="emailContainer"]').nodes, html.xpath(body.html, '//table[@width="700"][1]//tr/td').nodes, html.xpath(body.html, '//tr[@class="email-header"]').nodes, html.xpath(body.html, '//tr[@class="email-center"]').nodes, html.xpath(body.html, '//div[@class="mlr22"]').nodes, html.xpath(body.html, '//td[@class="itemDesc"]//div').nodes, html.xpath(body.html, '//td[@class="shippingContent"]//div').nodes, html.xpath(body.html, '//table[@class="shippingAndCustomLayout width100"]').nodes])
any([html.xpath(body.html, '//span[@id="condensedEmailMessageSectionContentWebPlayer"]').nodes, html.xpath(body.html, '//div[@id="emailContainer"]').nodes, html.xpath(body.html, '//table[@width="700"][1]//tr/td').nodes, html.xpath(body.html, '//tr[@class="email-header"]').nodes, html.xpath(body.html, '//tr[@class="email-center"]').nodes, html.xpath(body.html, '//div[@class="mlr22"]').nodes, html.xpath(body.html, '//td[@class="itemDesc"]//div').nodes, html.xpath(body.html, '//td[@class="shippingContent"]//div').nodes, html.xpath(body.html, '//table[@class="shippingAndCustomLayout width100"]').nodes])
or
[html.xpath(body.html, '//span[@id="condensedEmailMessageSectionContentWebPlayer"]').nodes, html.xpath(body.html, '//div[@id="emailContainer"]').nodes, html.xpath(body.html, '//table[@width="700"][1]//tr/td').nodes, html.xpath(body.html, '//tr[@class="email-header"]').nodes, html.xpath(body.html, '//tr[@class="email-center"]').nodes, html.xpath(body.html, '//div[@class="mlr22"]').nodes, html.xpath(body.html, '//td[@class="itemDesc"]//div').nodes, html.xpath(body.html, '//td[@class="shippingContent"]//div').nodes, html.xpath(body.html, '//table[@class="shippingAndCustomLayout width100"]').nodes].inner_text regex_match "(?:your subscription renewal|couldn.?t be processed|trouble renewing subscription|update your details|just update your|continue your subscription|prefer to use EFT|change payment method|verify your account|suspended due to issue|payment declined notice|account needs verification|confirm your billing|immediate action required|failed payment notification|billing information update|service interruption warning|unable to process payment|subscription payment failed|action needed now|update banking information|subscription expiration notice|payment method change|bill\\s+to\\s+subscriber)"
[html.xpath(body.html, '//span[@id="condensedEmailMessageSectionContentWebPlayer"]').nodes, html.xpath(body.html, '//div[@id="emailContainer"]').nodes, html.xpath(body.html, '//table[@width="700"][1]//tr/td').nodes, html.xpath(body.html, '//tr[@class="email-header"]').nodes, html.xpath(body.html, '//tr[@class="email-center"]').nodes, html.xpath(body.html, '//div[@class="mlr22"]').nodes, html.xpath(body.html, '//td[@class="itemDesc"]//div').nodes, html.xpath(body.html, '//td[@class="shippingContent"]//div').nodes, html.xpath(body.html, '//table[@class="shippingAndCustomLayout width100"]').nodes].inner_text regex_match "recognize this seller?|For more info.{0,25}Call|To cancel.{0,25}Call|did not authorize"
not
subject.subject starts_with "Payment confirmation:"
body.html.raw is_not_null
sender.email.email eq "quickbooks@notification.intuit.com"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
subject.subject | starts_with | Payment confirmation: | excludes:subject.subject field:"subject.subject" value:"Payment confirmation:" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.html.raw | is_not_null | field:"body.html.raw" kind:is_not_null | |
sender.email.email | eq |
| field:"sender.email.email" kind:eq value:"quickbooks@notification.intuit.com" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: SurveyMonkey survey from newly registered domain
#This Attack Surface Reduction (ASR) rule matches on SurveyMonkey Surveys with recently registered reply-to domains.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Evasion, Free file host, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// Legitimate SurveyMonkey sending infratructure
and sender.email.email == "member@surveymonkeyuser.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and any(headers.reply_to, network.whois(.email.domain).days_old < 30)
//
// This rule makes use of a beta feature and is subject to change without notice
// using the beta feature in custom rules is not suggested until it has been formally released
//
// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited
// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign
Detection logic
Scope: inbound message.
This Attack Surface Reduction (ASR) rule matches on SurveyMonkey Surveys with recently registered reply-to domains.
- inbound message
- sender.email.email is 'member@surveymonkeyuser.com'
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
any of
headers.reply_towhere:- network.whois(.email.domain).days_old < 30
not:
- beta.profile.by_reply_to().solicited
not:
- beta.profile.by_reply_to().any_messages_benign
Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain, sender.email.email, type.inbound. Sensors: beta.profile.by_reply_to, network.whois.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | member@surveymonkeyuser.com |
Stages and Predicates
Stage 1: mql_rule
and
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
not
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
any(headers.reply_to)
network.whois func_call "network.whois(headers.reply_to[].email.domain).days_old < 30"
headers.auth_summary.dmarc.pass eq "true"
headers.auth_summary.spf.pass eq "true"
sender.email.email eq "member@surveymonkeyuser.com"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
Service abuse: Suspicious Zoom Docs link
#Detects messages from Zoom Docs in which the document originates from a newly observed email address or contains suspicious indicators.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Social engineering, Free file host, Evasion |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and sender.email.domain.root_domain == "zoom.us"
and strings.ends_with(sender.display_name, "Zoom Docs")
and (
any(html.xpath(body.html, '//h2').nodes,
// extract the sender email out of the message body
any(regex.iextract(.display_text,
'^(?P<sender_display_name>[^\(]+)\((?P<sender_email>[^\)]+@(?P<sender_domain>[^\)]+))\)'
),
.named_groups["sender_domain"] not in $org_domains
and .named_groups["sender_email"] not in $recipient_emails
and .named_groups["sender_email"] not in $sender_emails
and not (
.named_groups["sender_domain"] not in $free_email_providers
and .named_groups["sender_domain"] in $recipient_domains
and .named_groups["sender_domain"] in $sender_domains
)
)
)
or any(body.links,
.href_url.domain.domain == "docs.zoom.us"
and any(filter(ml.link_analysis(., mode="aggressive").final_dom.links,
.href_url.domain.root_domain != 'zoom.us'
and .href_url.domain.domain != 'zoom.us'
),
(
// any of those links domains are new
network.whois(.href_url.domain).days_old < 30
// go to free file hosts
or .href_url.domain.root_domain in $free_file_hosts
or .href_url.domain.domain in $free_file_hosts
// go to free subdomains hosts
or (
.href_url.domain.root_domain in $free_subdomain_hosts
// where there is a subdomain
and .href_url.domain.subdomain is not null
and .href_url.domain.subdomain != "www"
)
// go to url shortners
or .href_url.domain.root_domain in $url_shorteners
or .href_url.domain.domain in $url_shorteners
or (
// find any links that mention common "action" words
regex.icontains(.display_text,
'(?:view|click|show|access|download|goto|Validate|Va[il]idar|login|verify|account)'
)
)
)
)
)
)
Detection logic
Scope: inbound message.
Detects messages from Zoom Docs in which the document originates from a newly observed email address or contains suspicious indicators.
- inbound message
- sender.email.domain.root_domain is 'zoom.us'
- sender.display_name ends with 'Zoom Docs'
any of:
any of
html.xpath(body.html, '//h2').nodeswhere:any of
regex.iextract(.display_text)where all hold:- .named_groups['sender_domain'] not in $org_domains
- .named_groups['sender_email'] not in $recipient_emails
- .named_groups['sender_email'] not in $sender_emails
not:
all of:
- .named_groups['sender_domain'] not in $free_email_providers
- .named_groups['sender_domain'] in $recipient_domains
- .named_groups['sender_domain'] in $sender_domains
any of
body.linkswhere all hold:- .href_url.domain.domain is 'docs.zoom.us'
any of
filter(...)where any holds:- network.whois(.href_url.domain).days_old < 30
- .href_url.domain.root_domain in $free_file_hosts
- .href_url.domain.domain in $free_file_hosts
all of:
- .href_url.domain.root_domain in $free_subdomain_hosts
- .href_url.domain.subdomain is set
- .href_url.domain.subdomain is not 'www'
- .href_url.domain.root_domain in $url_shorteners
- .href_url.domain.domain in $url_shorteners
- .display_text matches '(?:view|click|show|access|download|goto|Validate|Va[il]idar|login|verify|account)'
Inspects: body.html, body.links, body.links[].href_url.domain.domain, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: html.xpath, ml.link_analysis, network.whois, regex.icontains, regex.iextract, strings.ends_with. Reference lists: $free_email_providers, $free_file_hosts, $free_subdomain_hosts, $org_domains, $recipient_domains, $recipient_emails, $sender_domains, $sender_emails, $url_shorteners.
Indicators matched (5)
| Field | Match | Value |
|---|---|---|
sender.email.domain.root_domain | equals | zoom.us |
strings.ends_with | suffix | Zoom Docs |
regex.iextract | regex | ^(?P<sender_display_name>[^\(]+)\((?P<sender_email>[^\)]+@(?P<sender_domain>[^\)]+))\) |
body.links[].href_url.domain.domain | equals | docs.zoom.us |
regex.icontains | regex | (?:view|click|show|access|download|goto|Validate|Va[il]idar|login|verify|account) |
Stages and Predicates
Stage 1: mql_rule
and
or
any(body.links)
and
any(filter(...))
or
and
filter(...).href_url.domain.subdomain is_not_null
filter(...).href_url.domain.subdomain ne "www"
macro "filter(...)[].href_url.domain.root_domain in free_subdomain_hosts"
filter(...).display_text regex_match "(?:view|click|show|access|download|goto|Validate|Va[il]idar|login|verify|account)"
network.whois func_call "network.whois(filter(...)[].href_url.domain).days_old < 30"
macro "filter(...)[].href_url.domain.domain in free_file_hosts"
macro "filter(...)[].href_url.domain.domain in url_shorteners"
macro "filter(...)[].href_url.domain.root_domain in free_file_hosts"
macro "filter(...)[].href_url.domain.root_domain in url_shorteners"
body.links.href_url.domain.domain eq "docs.zoom.us"
any(html.xpath(body.html, '//h2').nodes)
any(regex.iextract(html.xpath(body.html, '//h2').nodes.display_text))
and
not
and
macro "regex.iextract(html.xpath(body.html, '//h2').nodes[].display_text)[].named_groups['sender_domain'] in recipient_domains"
macro "regex.iextract(html.xpath(body.html, '//h2').nodes[].display_text)[].named_groups['sender_domain'] in sender_domains"
macro "regex.iextract(html.xpath(body.html, '//h2').nodes[].display_text)[].named_groups['sender_domain'] not in free_email_providers"
macro "regex.iextract(html.xpath(body.html, '//h2').nodes[].display_text)[].named_groups['sender_domain'] not in org_domains"
macro "regex.iextract(html.xpath(body.html, '//h2').nodes[].display_text)[].named_groups['sender_email'] not in recipient_emails"
macro "regex.iextract(html.xpath(body.html, '//h2').nodes[].display_text)[].named_groups['sender_email'] not in sender_emails"
sender.display_name ends_with "Zoom Docs"
sender.email.domain.root_domain eq "zoom.us"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
Service abuse: Task management message sent via SendGrid
#Detects messages impersonating task or productivity applications by using 'todo list' in the subject line or body while utilizing SendGrid infrastructure. The sender claims to be task-related through display name or body content but originates from non-legitimate domains without proper DMARC authentication.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering, Evasion |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// subject contains "todo list"
and (
regex.icontains(subject.subject, "T[0o][-\\s]*D[o0][-\\s]*L[I1l]ST")
// or we can check the body for todo list content with high cred_theft intent
or (
regex.icontains(body.current_thread.text,
"T[0o][-\\s]*D[o0][-\\s]*L[I1l]ST"
)
and any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "cred_theft" and .confidence == "high"
)
)
)
// utilizing sendgrid infra
and headers.return_path.domain.domain == "sendgrid.net"
// negate highly trusted sender domains unless they fail DMARC authentication
and (
(
sender.email.domain.root_domain in $high_trust_sender_root_domains
and not headers.auth_summary.dmarc.pass
)
or sender.email.domain.root_domain not in $high_trust_sender_root_domains
)
and (
not profile.by_sender().solicited
or (
profile.by_sender().any_messages_malicious_or_spam
and not profile.by_sender().any_messages_benign
)
)
Detection logic
Scope: inbound message.
Detects messages impersonating task or productivity applications by using 'todo list' in the subject line or body while utilizing SendGrid infrastructure. The sender claims to be task-related through display name or body content but originates from non-legitimate domains without proper DMARC authentication.
- inbound message
any of:
- subject.subject matches 'T[0o][-\\\\s]*D[o0][-\\\\s]*L[I1l]ST'
all of:
- body.current_thread.text matches 'T[0o][-\\\\s]*D[o0][-\\\\s]*L[I1l]ST'
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name is 'cred_theft'
- .confidence is 'high'
- headers.return_path.domain.domain is 'sendgrid.net'
any of:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
not:
- headers.auth_summary.dmarc.pass
- sender.email.domain.root_domain not in $high_trust_sender_root_domains
any of:
not:
- profile.by_sender().solicited
all of:
- profile.by_sender().any_messages_malicious_or_spam
not:
- profile.by_sender().any_messages_benign
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.return_path.domain.domain, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender, regex.icontains. Reference lists: $high_trust_sender_root_domains.
Indicators matched (4)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | T[0o][-\\s]*D[o0][-\\s]*L[I1l]ST |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | equals | high |
headers.return_path.domain.domain | equals | sendgrid.net |
Stages and Predicates
Stage 1: mql_rule
and
or
and
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
body.current_thread.text regex_match "T[0o][-\\\\s]*D[o0][-\\\\s]*L[I1l]ST"
subject.subject regex_match "T[0o][-\\\\s]*D[o0][-\\\\s]*L[I1l]ST"
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
and
not
profile.by_sender func_call "profile.by_sender().any_messages_benign"
profile.by_sender func_call "profile.by_sender().any_messages_malicious_or_spam"
not
profile.by_sender func_call "profile.by_sender().solicited"
headers.return_path.domain.domain eq "sendgrid.net"
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:"T[0o][-\s]*D[o0][-\s]*L[I1l]ST" |
headers.return_path.domain.domain | eq |
| field:"headers.return_path.domain.domain" kind:eq value:"sendgrid.net" |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match value:"T[0o][-\s]*D[o0][-\s]*L[I1l]ST" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Vimeo with external plain-text links in message
#Detects messages absuing Vimeo notifications about received messages that contain plain-text links redirecting to domains other than Vimeo, potentially leading users to malicious websites.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and sender.email.domain.domain == 'vimeo.com'
and strings.ends_with(subject.base, 'sent you a message on Vimeo')
and (
// plain-text url that does not go to vimeo
any(filter(body.current_thread.links, .parser == "plain"),
.display_url.domain.root_domain != 'vimeo.com'
)
)
Detection logic
Scope: inbound message.
Detects messages absuing Vimeo notifications about received messages that contain plain-text links redirecting to domains other than Vimeo, potentially leading users to malicious websites.
- inbound message
- sender.email.domain.domain is 'vimeo.com'
- subject.base ends with 'sent you a message on Vimeo'
any of
filter(body.current_thread.links)where:- .display_url.domain.root_domain is not 'vimeo.com'
Inspects: body.current_thread.links, body.current_thread.links[].parser, sender.email.domain.domain, subject.base, type.inbound. Sensors: strings.ends_with.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
sender.email.domain.domain | equals | vimeo.com |
strings.ends_with | suffix | sent you a message on Vimeo |
body.current_thread.links[].parser | equals | plain |
Stages and Predicates
Stage 1: mql_rule
and
any(filter(body.current_thread.links))
filter(body.current_thread.links).display_url.domain.root_domain ne "vimeo.com"
sender.email.domain.domain eq "vimeo.com"
subject.base ends_with "sent you a message on Vimeo"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.email.domain.domain | eq |
| field:"sender.email.domain.domain" kind:eq value:"vimeo.com" |
subject.base | ends_with |
| field:"subject.base" kind:ends_with value:"sent you a message on Vimeo" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Service abuse: Wix redirect through bulk mailer domains
#Detects messages containing Wix-encoded links that redirect through bulk mailing service domains, potentially bypassing security controls through legitimate redirect services.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing, Malware/Ransomware |
| Tactics and techniques | Evasion, Open redirect |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and any(filter(body.links, 'wix' in .href_url.rewrite.encoders),
.href_url.domain.root_domain in $bulk_mailer_url_root_domains
)
Detection logic
Scope: inbound message.
Detects messages containing Wix-encoded links that redirect through bulk mailing service domains, potentially bypassing security controls through legitimate redirect services.
- inbound message
any of
filter(body.links)where:- .href_url.domain.root_domain in $bulk_mailer_url_root_domains
Inspects: body.links, body.links[].href_url.rewrite.encoders, type.inbound. Reference lists: $bulk_mailer_url_root_domains.
Indicators matched (1)
| Field | Match | Value |
|---|---|---|
body.links[].href_url.rewrite.encoders | contains | wix |
Stages and Predicates
Stage 1: mql_rule
and
any(filter(body.links))
macro "filter(body.links)[].href_url.domain.root_domain in bulk_mailer_url_root_domains"
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" |