Benefits enrollment impersonation

Detects messages about benefit enrollment periods and healthcare selections from external senders that contain urgent language or requests for action. Excludes legitimate HR communications, marketing mailers, and trusted sender domains with valid authentication.

Sublime rule (View on GitHub)

  1name: "Benefits enrollment impersonation"
  2description: "Detects messages about benefit enrollment periods and healthcare selections from external senders that contain urgent language or requests for action. Excludes legitimate HR communications, marketing mailers, and trusted sender domains with valid authentication."
  3type: "rule"
  4severity: "high"
  5source: |
  6  type.inbound
  7  and sender.email.domain.domain not in $org_domains
  8  and (
  9    length(body.current_thread.text) < 5000 or body.current_thread.text is null
 10  )
 11  and (
 12    regex.icontains(subject.subject,
 13                    '(open|benefits?) enrol{1,2}ment', // catches both enrolment and enrollment
 14                    'benefit(s)?.{0,10}(?:plan|choice|selection|deadline|period|summary)',
 15                    'hr benefits',
 16                    'annual enrol{1,2}ment',
 17                    'healthcare (choice|selection|opt.?in)',
 18                    '(fsa|hsa|401k) (enrol{1,2}ment|selection)',
 19                    'dependent (coverage|verification)',
 20                    '(health|dental|vision|insurance|medical) enrol{1,2}ment'
 21    )
 22    or regex.icontains(body.current_thread.text,
 23                       'benefit(s)? (plan|choice|selection|deadline|period)',
 24                       'hr benefits',
 25                       'annual enrol{1,2}ment',
 26                       'healthcare (choice|selection|opt.?in)',
 27                       '(fsa|hsa|401k) (enrol{1,2}ment|selection)',
 28                       'dependent (coverage|verification)',
 29                       '(health|dental|vision|insurance|medical) enrol{1,2}ment',
 30                       '(urgent|immediate) action required.{0,20}(benefit|enrol{1,2}ment)',
 31                       'coverage.{0,20}(expire|terminate)',
 32                       'last (day|chance).{0,20}(enrol{1,2}|select)',
 33                       '(login|sign.?in).{0,20}(benefit portal|hr portal)',
 34                       '(verify|update|confirm).{0,20}(benefit.{0,20}selection)'
 35    )
 36    or any(attachments,
 37           regex.icontains(.file_name,
 38                           'fileDoc-Review',
 39                           '(open|benefits?) enrol{1,2}ment',
 40                           'annual enrol{1,2}ment',
 41                           '(fsa|hsa|401k) (enrol{1,2}ment|selection)',
 42                           '(urgent|immediate) action required.{0,20}(benefit|enrol{1,2}ment)',
 43           )
 44    )
 45  )
 46  and 2 of (
 47    any(ml.nlu_classifier(body.current_thread.text).entities,
 48        .name in ("urgency", "request")
 49    ),
 50    any(ml.nlu_classifier(body.current_thread.text).intents, .name != "benign"),
 51    (
 52      (length(body.current_thread.text) < 250 and length(attachments) == 1)
 53      or (body.current_thread.text is null and length(attachments) == 1)
 54    ),
 55    // lure in attachment
 56    (
 57      any(attachments,
 58          (
 59            .file_type in $file_types_images
 60            or .file_type in ("pdf", "docx", "doc")
 61            or .file_extension in $file_extensions_macros
 62          )
 63          and any(filter(file.explode(.), .scan.ocr.raw is not null),
 64                  (
 65                    any(ml.nlu_classifier(.scan.ocr.raw).intents,
 66                        .name != "benign"
 67                    )
 68                    and any(ml.nlu_classifier(.scan.ocr.raw).entities,
 69                            .name in ("urgency", "request")
 70                    )
 71                  )
 72          )
 73      )
 74    )
 75  )
 76  // negate replies
 77  and (length(headers.references) == 0 or headers.in_reply_to is null)
 78  
 79  // Negate common marketing mailers
 80  and not regex.icontains(sender.display_name,
 81                          'HR (?:Events|Expert|Support Center|Studies|Knowledge Cloud|News Library|Crowd|Solutions|Interests)|HR and People Operations'
 82  )
 83  and not (
 84    // Constant Contact
 85    any(headers.hops,
 86        strings.icontains(.authentication_results.spf_details.designator,
 87                          "constantcontact.com"
 88        )
 89    )
 90    or any(headers.hops,
 91           strings.icontains(.received_spf.designator, "constantcontact.com")
 92    )
 93    or (
 94      (
 95        any(headers.hops,
 96            .index == 0
 97            and any(.authentication_results.dkim_details,
 98                    .domain == "auth.ccsend.com"
 99            )
100        )
101      )
102      and headers.auth_summary.dmarc.pass
103    )
104    or any(headers.references, strings.iends_with(., "ccsend.com"))
105    // Hubspot
106    or any(headers.hops,
107           strings.icontains(.authentication_results.spf_details.designator,
108                             "hubspotemail.net"
109           )
110    )
111  )
112  and sender.email.domain.root_domain not in~ (
113    'medicare.gov',
114    'farmers.com',
115    'uhc.com',
116    'blueshieldca.com',
117    'corestream.com'
118  )
119  and (
120    profile.by_sender().prevalence in ("new", "outlier")
121    or (
122      profile.by_sender().any_messages_malicious_or_spam
123      and not profile.by_sender().any_messages_benign
124    )
125  )
126  // negate highly trusted sender domains unless they fail DMARC authentication
127  and (
128    (
129      sender.email.domain.root_domain in $high_trust_sender_root_domains
130      and not headers.auth_summary.dmarc.pass
131    )
132    or sender.email.domain.root_domain not in $high_trust_sender_root_domains
133  )  
134attack_types:
135  - "Credential Phishing"
136tactics_and_techniques:
137  - "Evasion"
138  - "Impersonation: Employee"
139  - "Out of band pivot"
140  - "Social engineering"
141detection_methods:
142  - "Content analysis"
143  - "Header analysis"
144  - "Sender analysis"
145id: "5a6eb5a8-2d91-5ed8-a0d2-fb3cc2fef40b"
to-top