Detection rules › Sublime MQL
Callback phishing via calendar invite
Detects calendar invites containing callback phishing language in the DESCRIPTION of the invite.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing |
| Tactics and techniques | Social engineering, Evasion, ICS Phishing |
Event coverage
| Message attribute |
|---|
| attachments (collection) |
| headers.auth_summary |
| sender.email |
| type |
Rule body MQL
type.inbound
and length(attachments) > 0
and all(attachments, .content_type in ("text/calendar", "application/ics"))
and any(attachments,
// extract the calendar invite description and use NLU against it
any(file.explode(.),
any(.scan.ics.calendars,
any(.components,
(
any(ml.nlu_classifier(.description).intents,
.name == "callback_scam"
)
or any(ml.nlu_classifier(strings.parse_html(.description).display_text
).intents,
.name == "callback_scam"
)
or (
any(ml.nlu_classifier(.description).topics,
.name == "Request to View Invoice"
and .confidence == "high"
)
// emoji regex
and regex.contains(.description,
'[\x{1F600}-\x{1F64F}\x{1F300}-\x{1F5FF}\x{1F680}-\x{1F6FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{FE00}-\x{FE0F}\x{200D}\x{20E3}\x{E0020}-\x{E007F}]'
)
)
)
)
)
)
)
and (
not profile.by_sender_email().solicited
and not profile.by_sender_email().any_messages_benign
)
// negate highly trusted sender domains unless they fail DMARC authentication
and (
(
sender.email.domain.root_domain in $high_trust_sender_root_domains
and not coalesce(headers.auth_summary.dmarc.pass, false)
)
or sender.email.domain.root_domain not in $high_trust_sender_root_domains
)
Detection logic
Scope: inbound message.
Detects calendar invites containing callback phishing language in the DESCRIPTION of the invite.
- inbound message
- length(attachments) > 0
all of
attachmentswhere:- .content_type in ('text/calendar', 'application/ics')
any of
attachmentswhere:any of
file.explode(.)where:any of
.scan.ics.calendarswhere:any of
.componentswhere any holds:any of
ml.nlu_classifier(.description).intentswhere:- .name is 'callback_scam'
any of
ml.nlu_classifier(strings.parse_html(.description).display_text).intentswhere:- .name is 'callback_scam'
all of:
any of
ml.nlu_classifier(.description).topicswhere all hold:- .name is 'Request to View Invoice'
- .confidence is 'high'
- .description matches '[\\x{1F600}-\\x{1F64F}\\x{1F300}-\\x{1F5FF}\\x{1F680}-\\x{1F6FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{FE00}-\\x{FE0F}\\x{200D}\\x{20E3}\\x{E0020}-\\x{E007F}]'
all of:
not:
- profile.by_sender_email().solicited
not:
- profile.by_sender_email().any_messages_benign
any of:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
not:
- coalesce(headers.auth_summary.dmarc.pass)
- sender.email.domain.root_domain not in $high_trust_sender_root_domains
Inspects: attachments[].content_type, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: file.explode, ml.nlu_classifier, profile.by_sender_email, regex.contains, strings.parse_html. Reference lists: $high_trust_sender_root_domains.
Indicators matched (7)
| Field | Match | Value |
|---|---|---|
attachments[].content_type | member | text/calendar |
attachments[].content_type | member | application/ics |
ml.nlu_classifier(file.explode(attachments[])[].scan.ics.calendars[].components[].description).intents[].name | equals | callback_scam |
ml.nlu_classifier(strings.parse_html(file.explode(attachments[])[].scan.ics.calendars[].components[].description).display_text).intents[].name | equals | callback_scam |
ml.nlu_classifier(file.explode(attachments[])[].scan.ics.calendars[].components[].description).topics[].name | equals | Request to View Invoice |
ml.nlu_classifier(file.explode(attachments[])[].scan.ics.calendars[].components[].description).topics[].confidence | equals | high |
regex.contains | regex | [\x{1F600}-\x{1F64F}\x{1F300}-\x{1F5FF}\x{1F680}-\x{1F6FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{FE00}-\x{FE0F}\x{200D}\x{20E3}\x{E0020}-\x{E007F}] |