Detection rules › Sublime MQL
Impersonation: Recipient organization in sender display name with credential theft image
Sender display name contains the recipient's organization domain while the actual email address differs. Message includes a single image attachment with OCR-detected credential theft language referencing the recipient's domain, and has no body text.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Image as content, Impersonation: Brand, Social engineering |
Event coverage
Rule body MQL
type.inbound
and length(body.links) <= 1
and length(attachments) == 1
and strings.icontains(sender.display_name, recipients.to[0].email.domain.sld)
and length(recipients.to) == 1
and recipients.to[0].email.domain.root_domain in $org_domains
and
// No body text
(
length(body.current_thread.text) == 0 or body.current_thread.text is null
)
and all(attachments,
.file_type in $file_types_images
//
// 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
//
and strings.icontains(beta.ocr(.).text,
recipients.to[0].email.domain.sld
)
and any(ml.nlu_classifier(beta.ocr(.).text).intents,
.name == "cred_theft" and .confidence == "high"
)
)
Detection logic
Scope: inbound message.
Sender display name contains the recipient's organization domain while the actual email address differs. Message includes a single image attachment with OCR-detected credential theft language referencing the recipient's domain, and has no body text.
- inbound message
- length(body.links) ≤ 1
- length(attachments) is 1
- strings.icontains(sender.display_name)
- length(recipients.to) is 1
- recipients.to[0].email.domain.root_domain in $org_domains
any of:
- length(body.current_thread.text) is 0
- body.current_thread.text is missing
all of
attachmentswhere all hold:- .file_type in $file_types_images
- strings.icontains(beta.ocr(.).text)
any of
ml.nlu_classifier(beta.ocr(.).text).intentswhere all hold:- .name is 'cred_theft'
- .confidence is 'high'
Inspects: attachments[].file_type, body.current_thread.text, body.links, recipients.to, recipients.to[0].email.domain.root_domain, recipients.to[0].email.domain.sld, sender.display_name, type.inbound. Sensors: beta.ocr, ml.nlu_classifier, strings.icontains. Reference lists: $file_types_images, $org_domains.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
ml.nlu_classifier(beta.ocr(attachments[]).text).intents[].name | equals | cred_theft |
ml.nlu_classifier(beta.ocr(attachments[]).text).intents[].confidence | equals | high |