Detection rules › Sublime MQL
Suspicious request for financial information
Email is from a suspicious sender and contains a request for financial information, such as AR reports.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Free email provider, Impersonation: Employee, Impersonation: VIP, Social engineering |
Event coverage
Rule body MQL
type.inbound
and length(attachments) <= 1
and length(recipients.to) <= 2
// suspicious sender
and (
(
length(headers.reply_to) > 0
and all(headers.reply_to,
.email.domain.root_domain != sender.email.domain.root_domain
and .email.domain.root_domain not in $org_domains
)
)
or sender.email.domain.root_domain in $free_email_providers
or profile.by_sender().days_known < 3
)
// specific financial language
and (
regex.icontains(subject.subject,
'\b(Aged|Age?ing) (Payables|Receivables|Report)',
'reconcill?iation (report|statement).*(issued (settlement|advice)s?)|billing records?'
)
or (
regex.icontains(body.current_thread.text,
'\b(Aged|Age?ing) (Payables|Receivables|Report)',
'(updated|recent) (\bAR\b|\b\AP\b|\bAR\b \& \bAP\b|accounts?) (Payables|Receivables|Reports)',
'(shared?|send|forward|provide).*remittance (advice|receipts?|statements?)'
)
or strings.icontains(body.current_thread.text,
"copy of a current statement"
)
or (
strings.icontains(body.current_thread.text, "please send all past due")
and strings.icontains(body.current_thread.text, "current invoices")
)
)
// suspicious link display text
or (
any(body.links,
regex.icontains(.display_text,
'(Payment|Remittance|Settlement|Transfer) ?Batch',
)
)
)
// suspicious sender display name
or (
regex.icontains(sender.display_name,
'Accounts? (?:Payable (?:Dep(\.|t\.?|artment)|e?Receipt)|(Co[[:punct:]]?ordinator|Admin|Manager|Payee))'
)
// sender email listed as a recipient or recipients undisclosed/null
and (
(
sender.email.email in map(recipients.to, .email.email)
or (length(recipients.to) == 0 or length(recipients.to) is null)
)
// non-benign nlu intent
or any(ml.nlu_classifier(body.current_thread.text).intents,
.name != "benign"
)
)
)
or (
any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "cred_theft" and .confidence == "high"
)
and any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "financial" and .text =~ "remittance"
)
)
)
// negate resume related/job inquiry outreach
and not (
any(ml.nlu_classifier(body.current_thread.text).topics,
.name == "Professional and Career Development" and .confidence == "high"
)
and any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "benign" and .confidence != "low"
)
)
and (
(
sender.email.domain.root_domain in $high_trust_sender_root_domains
and not headers.auth_summary.dmarc.pass
)
or sender.email.domain.root_domain not in $high_trust_sender_root_domains
)
and not profile.by_sender().any_messages_benign
Detection logic
Scope: inbound message.
Email is from a suspicious sender and contains a request for financial information, such as AR reports.
- inbound message
- length(attachments) ≤ 1
- length(recipients.to) ≤ 2
any of:
all of:
- length(headers.reply_to) > 0
all of
headers.reply_towhere all hold:- .email.domain.root_domain is not sender.email.domain.root_domain
- .email.domain.root_domain not in $org_domains
- sender.email.domain.root_domain in $free_email_providers
- profile.by_sender().days_known < 3
any of:
subject.subject matches any of 2 patterns
\b(Aged|Age?ing) (Payables|Receivables|Report)reconcill?iation (report|statement).*(issued (settlement|advice)s?)|billing records?
any of:
body.current_thread.text matches any of 3 patterns
\b(Aged|Age?ing) (Payables|Receivables|Report)(updated|recent) (\bAR\b|\b\AP\b|\bAR\b \& \bAP\b|accounts?) (Payables|Receivables|Reports)(shared?|send|forward|provide).*remittance (advice|receipts?|statements?)
- body.current_thread.text contains 'copy of a current statement'
all of:
- body.current_thread.text contains 'please send all past due'
- body.current_thread.text contains 'current invoices'
any of
body.linkswhere:- .display_text matches '(Payment|Remittance|Settlement|Transfer) ?Batch'
all of:
- sender.display_name matches 'Accounts? (?:Payable (?:Dep(\\.|t\\.?|artment)|e?Receipt)|(Co[[:punct:]]?ordinator|Admin|Manager|Payee))'
any of:
any of:
- sender.email.email in map(recipients.to, .email.email)
any of:
- length(recipients.to) is 0
- length(recipients.to) is missing
any of
ml.nlu_classifier(body.current_thread.text).intentswhere:- .name is not 'benign'
all of:
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name is 'cred_theft'
- .confidence is 'high'
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name is 'financial'
- .text is 'remittance'
not:
all of:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name is 'Professional and Career Development'
- .confidence is 'high'
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name is 'benign'
- .confidence is not 'low'
any of:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
not:
- headers.auth_summary.dmarc.pass
- sender.email.domain.root_domain not in $high_trust_sender_root_domains
not:
- profile.by_sender().any_messages_benign
Inspects: body.current_thread.text, body.links, body.links[].display_text, headers.auth_summary.dmarc.pass, headers.reply_to, headers.reply_to[].email.domain.root_domain, recipients.to, recipients.to[].email.email, sender.display_name, sender.email.domain.root_domain, sender.email.email, subject.subject, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender, regex.icontains, strings.icontains. Reference lists: $free_email_providers, $high_trust_sender_root_domains, $org_domains.
Indicators matched (16)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | \b(Aged|Age?ing) (Payables|Receivables|Report) |
regex.icontains | regex | reconcill?iation (report|statement).*(issued (settlement|advice)s?)|billing records? |
regex.icontains | regex | (updated|recent) (\bAR\b|\b\AP\b|\bAR\b \& \bAP\b|accounts?) (Payables|Receivables|Reports) |
regex.icontains | regex | (shared?|send|forward|provide).*remittance (advice|receipts?|statements?) |
strings.icontains | substring | copy of a current statement |
strings.icontains | substring | please send all past due |
strings.icontains | substring | current invoices |
regex.icontains | regex | (Payment|Remittance|Settlement|Transfer) ?Batch |
regex.icontains | regex | Accounts? (?:Payable (?:Dep(\.|t\.?|artment)|e?Receipt)|(Co[[:punct:]]?ordinator|Admin|Manager|Payee)) |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | equals | high |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | financial |
4 more
ml.nlu_classifier(body.current_thread.text).entities[].text | equals | remittance |
ml.nlu_classifier(body.current_thread.text).topics[].name | equals | Professional and Career Development |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | equals | high |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | benign |