Detection rules › Sublime MQL
Sublime MQL rules: hr
| Rule | Severity |
|---|---|
| HR impersonation via e-sign agreement comment | high |
HR impersonation via e-sign agreement comment
#This rule inspects messages originating from legitimate e-signature platform infrastructure, with engaging language in the body that matches HR Impersonation criteria.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Credential Phishing |
| Tactics and techniques | Evasion, Impersonation: Brand, Out of band pivot, 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 in (
'docusign.net',
'docusign.com',
'hellosign.com'
)
// docusing.com as a reply-to is used in updates to documents, such as views, signs, etc
and not any(headers.reply_to, .email.domain.domain == 'docusign.com')
// check for SPF or DMARC passed
and (headers.auth_summary.spf.pass or headers.auth_summary.dmarc.pass)
)
// HR Impersonation in body
and regex.icontains(body.current_thread.text,
(
'(\bh\W?r\W?\b|human\s?resources|hr depart(ment)?|employee relations)'
)
)
// Request and Urgency
and (
any(ml.nlu_classifier(body.current_thread.text).entities, .name == "request")
and (
any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "cred_theft" and .confidence == "high"
)
or any(ml.nlu_classifier(body.current_thread.text).entities,
.name in ("urgency", "financial")
)
)
)
and (
any(ml.nlu_classifier(body.current_thread.text).intents, .name != "benign")
or length(ml.nlu_classifier(body.current_thread.text).intents) == 0 // not benign but not malicious either
)
//
// 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
// Negate legitimate HR docusigns originating from within the org
and not (all(headers.reply_to, .email.domain.root_domain in $org_domains))
// Negate replies
and (length(headers.references) == 0 or headers.in_reply_to is null)
Detection logic
Scope: inbound message.
This rule inspects messages originating from legitimate e-signature platform infrastructure, with engaging language in the body that matches HR Impersonation criteria.
- inbound message
- length(attachments) is 0
all of:
- sender.email.domain.root_domain in ('docusign.net', 'docusign.com', 'hellosign.com')
not:
any of
headers.reply_towhere:- .email.domain.domain is 'docusign.com'
any of:
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
- body.current_thread.text matches '(\\bh\\W?r\\W?\\b|human\\s?resources|hr depart(ment)?|employee relations)'
all of:
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere:- .name is 'request'
any 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:- .name in ('urgency', 'financial')
any of:
any of
ml.nlu_classifier(body.current_thread.text).intentswhere:- .name is not 'benign'
- length(ml.nlu_classifier(body.current_thread.text).intents) is 0
- beta.profile.by_reply_to().prevalence is 'new'
not:
- beta.profile.by_reply_to().solicited
not:
all of
headers.reply_towhere:- .email.domain.root_domain in $org_domains
any of:
- length(headers.references) is 0
- headers.in_reply_to is missing
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.in_reply_to, headers.references, headers.reply_to, headers.reply_to[].email.domain.domain, headers.reply_to[].email.domain.root_domain, sender.email.domain.root_domain, type.inbound. Sensors: beta.profile.by_reply_to, ml.nlu_classifier, regex.icontains. Reference lists: $org_domains.
Indicators matched (9)
| Field | Match | Value |
|---|---|---|
sender.email.domain.root_domain | member | docusign.net |
sender.email.domain.root_domain | member | docusign.com |
sender.email.domain.root_domain | member | hellosign.com |
regex.icontains | regex | (\bh\W?r\W?\b|human\s?resources|hr depart(ment)?|employee relations) |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | request |
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 | member | urgency |
ml.nlu_classifier(body.current_thread.text).entities[].name | member | financial |
Stages and Predicates
Stage 1: mql_rule
and
or
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"
any(ml.nlu_classifier(body.current_thread.text).entities)
ml.nlu_classifier(body.current_thread.text).entities.name in ["financial", "urgency"]
not
any(headers.reply_to)
headers.reply_to.email.domain.domain eq "docusign.com"
or
any(ml.nlu_classifier(body.current_thread.text).intents)
ml.nlu_classifier(body.current_thread.text).intents.name ne "benign"
ml.nlu_classifier(body.current_thread.text).intents length_compare "0"
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
headers.in_reply_to is_null
headers.references length_compare "0"
any(ml.nlu_classifier(body.current_thread.text).entities)
ml.nlu_classifier(body.current_thread.text).entities.name eq "request"
not
macro "all(headers.reply_to)"
attachments length_compare "0"
beta.profile.by_reply_to func_call "beta.profile.by_reply_to().prevalence == new"
body.current_thread.text regex_match "(\\bh\\W?r\\W?\\b|human\\s?resources|hr depart(ment)?|employee relations)"
sender.email.domain.root_domain in ["docusign.com", "docusign.net", "hellosign.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 |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match value:"(\bh\W?r\W?\b|human\s?resources|hr depart(ment)?|employee relations)" |
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" |
headers.in_reply_to | is_null | field:"headers.in_reply_to" kind:is_null | |
sender.email.domain.root_domain | in |
| field:"sender.email.domain.root_domain" kind:in |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |