VIP impersonation: Payment handoff with VIP display name authored fake threads
Detects inbound messages where an external sender, absent from the original conversation, targets a single internal recipient after a VIP previously instructed that party to handle invoice or payment correspondence. The rule identifies prior threads where a known VIP explicitly redirected billing or payment contact to an internal address — using language such as forwarding instructions, accounts payable references, or billing handoff phrasing — and flags follow-up messages from external senders who are no longer accompanied by the VIP. NLU classifiers confirm financial context in the prior thread. This pattern is consistent with adversaries monitoring or fabricating invoice-related threads to insert themselves at the point of payment handoff.
Sublime rule (View on GitHub)
1name: "VIP impersonation: Payment handoff with VIP display name authored fake threads"
2description: "Detects inbound messages where an external sender, absent from the original conversation, targets a single internal recipient after a VIP previously instructed that party to handle invoice or payment correspondence. The rule identifies prior threads where a known VIP explicitly redirected billing or payment contact to an internal address — using language such as forwarding instructions, accounts payable references, or billing handoff phrasing — and flags follow-up messages from external senders who are no longer accompanied by the VIP. NLU classifiers confirm financial context in the prior thread. This pattern is consistent with adversaries monitoring or fabricating invoice-related threads to insert themselves at the point of payment handoff."
3type: "rule"
4severity: "high"
5source: |
6 type.inbound
7 and any(map(filter(body.previous_threads,
8 .sender.email.email == ""
9 and .sender.display_name != ""
10 and any($org_vips,
11 strings.icontains(..sender.display_name,
12 .display_name
13 )
14 )
15 and not coalesce(.subject.is_auto_reply, false)
16 and any(recipients.to,
17 .email.domain.root_domain in $org_domains
18 and strings.icontains(..text, .email.email)
19 )
20 and regex.icontains(.text,
21 'accounts? payable',
22 '(?:forward|send|rout|direct|remit|submit|issue) (?:it|a copy) (?:directly )?to',
23 '(?:forward|send|direct|remit|submit|route) (?:the |all |related )?(?:invoice|correspondence|payment|billing)',
24 'for payment processing,? please contact',
25 '(?:please )?direct (?:it|all|the)[^\n]{0,60}\bto\b',
26 'directed to (?:our |the )?[^\n]{0,40}(?:team|processing)',
27 '(?:as follows|provided below|find below|details are|contact is)[^\n]{0,10}:',
28 'billing (?:contact|correspondence|team|department|statements?)'
29 )
30 ),
31 .sender.display_name
32 ),
33 . != ""
34 and any(filter(body.previous_threads, .sender.display_name == ..),
35 any(ml.nlu_classifier(.text, subject=.subject.base).tags,
36 .name in ("invoice", "payment") and .confidence != "low"
37 )
38 or any(ml.nlu_classifier(.text, subject=.subject.base).topics,
39 .name in (
40 "Request to View Invoice",
41 "Payment Information"
42 )
43 and .confidence != "low"
44 )
45 )
46 and not any(flatten([recipients.to, recipients.cc, recipients.bcc]),
47 any($org_vips,
48 strings.icontains(..., .display_name)
49 and .email != ""
50 and strings.icontains(..email.email, .email)
51 )
52 )
53 )
54 and length(filter(flatten([recipients.to, recipients.cc, recipients.bcc]),
55 .email.domain.root_domain in $org_domains
56 )
57 ) == 1
58 and not (
59 sender.email.domain.root_domain in $org_domains
60 and coalesce(headers.auth_summary.dmarc.pass, false)
61 )
62attack_types:
63 - "BEC/Fraud"
64tactics_and_techniques:
65 - "Impersonation: VIP"
66 - "Social engineering"
67detection_methods:
68 - "Content analysis"
69 - "Natural Language Understanding"
70 - "Sender analysis"
71 - "Header analysis"
72id: "43180f2d-8cf7-5af0-9963-2c9634734c8d"