Detection rules › Sublime MQL
Brand impersonation: DocuSign branded attachment lure with no DocuSign links
Detects DocuSign phishing messages with no DocuSign links, a DocuSign logo or verbage within an image or PDF attachment, from an untrusted sender.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Event coverage
Rule body MQL
type.inbound
and (
(
0 < length(attachments) <= 8
and length(filter(attachments, .file_type in $file_types_images)) > 0
)
or (
length(attachments) > 0
and all(attachments,
.file_type in $file_types_images
or .file_type == 'pdf'
or (
.file_extension == "ics"
or .content_type in ("text/calendar", "application/ics")
)
)
)
)
and (
// if there are links, ensure they are not docusign links
(
length(body.links) != 0
and any(body.links,
not strings.ilike(.href_url.domain.root_domain, "docusign.*")
)
)
// sometimes there are no body links and it's all in the PDF attachment
or length(body.links) == 0
)
and (
// check the image or pdf attachments for Docusign
any(filter(attachments,
.file_type in $file_types_images or .file_type == 'pdf'
),
(
any(ml.logo_detect(.).brands, .name == "DocuSign")
or any(file.explode(.),
strings.ilike(.scan.ocr.raw, "*DocuSign*")
and (
any(ml.nlu_classifier(.scan.ocr.raw).intents,
.name == "cred_theft" and .confidence != "low"
)
or (
regex.icontains(.scan.ocr.raw,
"((re)?view|access|complete(d)?) document(s)?",
'[^d][^o][^cd][^ue]sign(?:\b|ature)',
"important edocs",
// German (Document (check|check|sign|sent))
"Dokument (überprüfen|prüfen|unterschreiben|geschickt)",
// German (important|urgent|immediate)
"(wichtig|dringend|sofort)"
)
and any(ml.nlu_classifier(.scan.ocr.raw).topics,
.name == "E-Signature"
)
and not strings.count(.scan.ocr.raw, "\n\n\n\n\n\n\n\n\n\n") > 3
)
)
)
)
and not any(file.explode(.),
strings.ilike(.scan.ocr.raw,
"*DocuSigned By*",
"*DocuSign Envelope ID*",
"*Certificate Of Completion*",
"*Adobe Sign*",
// Additional Adobe Acrobat Sign check
"*Powered by\nAdobe\nAcrobat Sign*"
)
or (
.depth == 0
and (
(
.scan.exiftool.page_count > 10
and length(.scan.strings.strings) > 8000
)
or (
.scan.exiftool.producer == "Acrobat Sign"
and any(.scan.exiftool.fields,
.key == "SigningReason"
and .value == "Certified by Adobe Acrobat Sign"
)
)
)
)
// negate resume related messages
or (
any(ml.nlu_classifier(body.current_thread.text).topics,
.name == "Professional and Career Development"
and .confidence == "high"
)
and any(ml.nlu_classifier(.scan.ocr.raw).intents,
.name == "benign" and .confidence != "low"
)
)
)
)
// accomidate truncated pngs and GIF files which can cause logodetect/OCR failures
or (
any(attachments,
.file_type =~ "gif"
//
// 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
//
or any(beta.parse_exif(.).fields,
.key == "Warning" and .value == "Truncated PNG image"
)
)
and (
any(ml.logo_detect(file.message_screenshot()).brands, .name == "DocuSign")
//
// 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
//
or strings.ilike(beta.ocr(file.message_screenshot()).text, "*DocuSign*")
)
and (
(
any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,
.name == "cred_theft" and .confidence != "low"
)
or regex.icontains(beta.ocr(file.message_screenshot()).text,
"((re)?view|access|complete(d)?) document(s)?",
"[^d][^o][^c][^u]sign",
"important edocs",
// German (Document (check|check|sign|sent))
"Dokument (überprüfen|prüfen|unterschreiben|geschickt)",
// German (important|urgent|immediate)
"(wichtig|dringend|sofort)"
)
)
)
and not strings.ilike(beta.ocr(file.message_screenshot()).text,
"*DocuSigned By*",
"*DocuSign Envelope ID*",
"*Certificate Of Completion*",
"*Adobe Sign*"
)
)
)
and (
not profile.by_sender_email().solicited
or profile.by_sender_email().prevalence == "new"
or (
profile.by_sender_email().any_messages_malicious_or_spam
and not profile.by_sender_email().any_messages_benign
)
)
and not profile.by_sender_email().any_messages_benign
// negate docusign 'via' messages
and not (
any(headers.hops,
any(.fields,
.name == "X-Api-Host" and strings.ends_with(.value, "docusign.net")
)
)
and strings.contains(sender.display_name, "via")
)
// negate docusign originated emails
and not any(headers.hops,
regex.imatch(.received.server.raw, ".+.docusign.(net|com)")
)
// negate replies to docusign notifications
and not any(headers.references, strings.iends_with(., '@camail.docusign.net'))
Detection logic
Scope: inbound message.
Detects DocuSign phishing messages with no DocuSign links, a DocuSign logo or verbage within an image or PDF attachment, from an untrusted sender.
- inbound message
any of:
all of:
all of:
- length(attachments) > 0
- length(attachments) ≤ 8
- length(filter(attachments, .file_type in $file_types_images)) > 0
all of:
- length(attachments) > 0
all of
attachmentswhere any holds:- .file_type in $file_types_images
- .file_type is 'pdf'
any of:
- .file_extension is 'ics'
- .content_type in ('text/calendar', 'application/ics')
any of:
all of:
- length(body.links) is not 0
any of
body.linkswhere:not:
- .href_url.domain.root_domain matches 'docusign.*'
- length(body.links) is 0
any of:
any of
filter(attachments)where all hold:any of:
any of
ml.logo_detect(.).brandswhere:- .name is 'DocuSign'
any of
file.explode(.)where all hold:- .scan.ocr.raw matches '*DocuSign*'
any of:
any of
ml.nlu_classifier(.scan.ocr.raw).intentswhere all hold:- .name is 'cred_theft'
- .confidence is not 'low'
all of:
.scan.ocr.raw matches any of 5 patterns
((re)?view|access|complete(d)?) document(s)?[^d][^o][^cd][^ue]sign(?:\b|ature)important edocsDokument (überprüfen|prüfen|unterschreiben|geschickt)(wichtig|dringend|sofort)
any of
ml.nlu_classifier(.scan.ocr.raw).topicswhere:- .name is 'E-Signature'
not:
- strings.count(.scan.ocr.raw, '\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n') > 3
not:
any of
file.explode(.)where any holds:.scan.ocr.raw matches any of 5 patterns
*DocuSigned By**DocuSign Envelope ID**Certificate Of Completion**Adobe Sign**Powered by\nAdobe\nAcrobat Sign*
all of:
- .depth is 0
any of:
all of:
- .scan.exiftool.page_count > 10
- length(.scan.strings.strings) > 8000
all of:
- .scan.exiftool.producer is 'Acrobat Sign'
any of
.scan.exiftool.fieldswhere all hold:- .key is 'SigningReason'
- .value is 'Certified by Adobe Acrobat Sign'
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(.scan.ocr.raw).intentswhere all hold:- .name is 'benign'
- .confidence is not 'low'
all of:
any of
attachmentswhere any holds:- .file_type is 'gif'
any of
beta.parse_exif(.).fieldswhere all hold:- .key is 'Warning'
- .value is 'Truncated PNG image'
any of:
any of
ml.logo_detect(file.message_screenshot()).brandswhere:- .name is 'DocuSign'
- beta.ocr(file.message_screenshot()).text matches '*DocuSign*'
any of:
any of
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intentswhere all hold:- .name is 'cred_theft'
- .confidence is not 'low'
beta.ocr(file.message_screenshot()).text matches any of 5 patterns
((re)?view|access|complete(d)?) document(s)?[^d][^o][^c][^u]signimportant edocsDokument (überprüfen|prüfen|unterschreiben|geschickt)(wichtig|dringend|sofort)
not:
beta.ocr(file.message_screenshot()).text matches any of 4 patterns
*DocuSigned By**DocuSign Envelope ID**Certificate Of Completion**Adobe Sign*
any of:
not:
- profile.by_sender_email().solicited
- profile.by_sender_email().prevalence is 'new'
all of:
- profile.by_sender_email().any_messages_malicious_or_spam
not:
- profile.by_sender_email().any_messages_benign
not:
- profile.by_sender_email().any_messages_benign
not:
all of:
any of
headers.hopswhere:any of
.fieldswhere all hold:- .name is 'X-Api-Host'
- .value ends with 'docusign.net'
- sender.display_name contains 'via'
not:
any of
headers.hopswhere:- .received.server.raw matches '.+.docusign.(net|com)'
not:
any of
headers.referenceswhere:- . ends with '@camail.docusign.net'
Inspects: attachments[].content_type, attachments[].file_extension, attachments[].file_type, body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, headers.hops[].received.server.raw, headers.references, sender.display_name, type.inbound. Sensors: beta.ocr, beta.parse_exif, file.explode, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender_email, regex.icontains, regex.imatch, strings.contains, strings.count, strings.ends_with, strings.iends_with, strings.ilike. Reference lists: $file_types_images.
Indicators matched (36)
| Field | Match | Value |
|---|---|---|
attachments[].file_type | equals | pdf |
attachments[].file_extension | equals | ics |
attachments[].content_type | member | text/calendar |
attachments[].content_type | member | application/ics |
strings.ilike | substring | docusign.* |
ml.logo_detect(filter(attachments)[]).brands[].name | equals | DocuSign |
strings.ilike | substring | *DocuSign* |
ml.nlu_classifier(file.explode(filter(attachments)[])[].scan.ocr.raw).intents[].name | equals | cred_theft |
regex.icontains | regex | ((re)?view|access|complete(d)?) document(s)? |
regex.icontains | regex | [^d][^o][^cd][^ue]sign(?:\b|ature) |
regex.icontains | regex | important edocs |
regex.icontains | regex | Dokument (überprüfen|prüfen|unterschreiben|geschickt) |
24 more
regex.icontains | regex | (wichtig|dringend|sofort) |
ml.nlu_classifier(file.explode(filter(attachments)[])[].scan.ocr.raw).topics[].name | equals | E-Signature |
strings.ilike | substring | *DocuSigned By* |
strings.ilike | substring | *DocuSign Envelope ID* |
strings.ilike | substring | *Certificate Of Completion* |
strings.ilike | substring | *Adobe Sign* |
strings.ilike | substring | *Powered by\nAdobe\nAcrobat Sign* |
file.explode(filter(attachments)[])[].scan.exiftool.producer | equals | Acrobat Sign |
file.explode(filter(attachments)[])[].scan.exiftool.fields[].key | equals | SigningReason |
file.explode(filter(attachments)[])[].scan.exiftool.fields[].value | equals | Certified by Adobe Acrobat Sign |
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(file.explode(filter(attachments)[])[].scan.ocr.raw).intents[].name | equals | benign |
attachments[].file_type | equals | gif |
beta.parse_exif(attachments[]).fields[].key | equals | Warning |
beta.parse_exif(attachments[]).fields[].value | equals | Truncated PNG image |
ml.logo_detect(file.message_screenshot()).brands[].name | equals | DocuSign |
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].name | equals | cred_theft |
regex.icontains | regex | [^d][^o][^c][^u]sign |
headers.hops[].fields[].name | equals | X-Api-Host |
strings.ends_with | suffix | docusign.net |
strings.contains | substring | via |
regex.imatch | regex | .+.docusign.(net|com) |
strings.iends_with | suffix | @camail.docusign.net |