VIP Impersonation via Google Group relay with suspicious indicators

Public Google Groups can be used to impersonate internal senders, while the reply to address is not under organizational control, leading to fraud, credential phishing, or other unwanted outcomes.

Sublime rule (View on GitHub)

 1name: "VIP Impersonation via Google Group relay with suspicious indicators"
 2description: "Public Google Groups can be used to impersonate internal senders, while the reply to address is not under organizational control, leading to fraud, credential phishing, or other unwanted outcomes."
 3type: "rule"
 4severity: "high"
 5source: |
 6  (type.inbound or type.internal)
 7  and sender.email.domain.root_domain in $org_domains
 8  
 9  // subject, sender or reply to contains a VIP
10  and (
11    any(headers.reply_to,
12        any($org_vips, strings.contains(.display_name, ..display_name))
13    )
14    or any($org_vips, strings.contains(subject.subject, .display_name))
15    or any($org_vips, strings.contains(sender.display_name, .display_name))
16  )
17  and any(headers.hops,
18          any(.fields,
19              regex.icontains(.name,
20                              "X-Authenticated-Sender|X-Sender|X-Original-Sender"
21              )
22          )
23  )
24  
25  // reply to return path mismatch and not org domain
26  and any(headers.reply_to,
27          .email.domain.root_domain != headers.return_path.domain.root_domain
28          and .email.domain.root_domain not in $org_domains
29  )
30  
31  // googlegroups found in hops
32  and any(headers.hops,
33          .index == 0 and any(.fields, strings.icontains(.value, "googlegroups"))
34  )
35  
36  // financial nlu entity in current thread
37  and 3 of (
38    any(ml.nlu_classifier(body.current_thread.text).entities,
39        .name == "financial"
40    ),
41  
42    // invoice entity in display_text
43    any(ml.nlu_classifier(body.current_thread.text).tags, .name == "invoice"),
44  
45    // fake thread
46    (
47      regex.imatch(subject.subject, "(re|fw(d)?):.*")
48      and (
49        (length(headers.references) == 0 and headers.in_reply_to is null)
50        or not any(headers.hops,
51                   any(.fields, strings.ilike(.name, "In-Reply-To"))
52        )
53      )
54    ),
55  
56    // reply-to is freemail 
57    any(headers.reply_to, .email.domain.domain in $free_email_providers),
58  
59    // reply-to is not in $recipient_emails
60    any(headers.reply_to, .email.email not in $recipient_emails),
61  
62    // dmarc authentication is freemail provider
63    headers.auth_summary.dmarc.details.from.root_domain in $free_email_providers
64  )  
65attack_types:
66  - "BEC/Fraud"
67  - "Credential Phishing"
68  - "Malware/Ransomware"
69tactics_and_techniques:
70  - "Evasion"
71  - "Free email provider"
72  - "Impersonation: Employee"
73  - "Social engineering"
74  - "Spoofing"
75detection_methods:
76  - "Content analysis"
77  - "Header analysis"
78  - "Natural Language Understanding"
79  - "Sender analysis"
80id: "57f9cd3b-ddac-5ef5-96dd-374dbd03f5cd"
to-top