Detection rules › Sublime MQL

VIP impersonation with charitable donation fraud

Severity
high
Type
rule
Source
github.com/sublime-security/sublime-rules

Fake email thread shows a VIP requesting a donation to a charity, usually addressed to Accounts Payable departments. Can result in monetary loss.

Threat classification

Sublime's own taxonomy (not MITRE ATT&CK).

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesImpersonation: Employee, Impersonation: VIP, Social engineering

Event coverage

Rule body MQL

type.inbound
and strings.ilike(body.current_thread.text,
                  "*charity*",
                  "*gala*",
                  "*donation*",
                  "*donor*"
)
and any(ml.nlu_classifier(body.current_thread.text).entities,
        .name == "financial"
)
and any(ml.nlu_classifier(body.current_thread.text).entities,
        .name == "request"
)
and (
  any($org_vips, strings.icontains(body.html.inner_text, .display_name))
  or any($org_vips, strings.icontains(body.plain.raw, .display_name))
)
and (
  (
    (subject.is_forward or subject.is_reply)
    and (
      (length(headers.references) == 0 and headers.in_reply_to is null)
      or headers.in_reply_to is null
    )
  )
  // fake thread, but no indication in the subject line
  // current_thread pulls the recent thread, but the full body contains the fake "original" email
  or (
    not ((subject.is_forward or subject.is_reply))
    and (
      3 of (
        strings.icontains(body.html.display_text, "from:"),
        strings.icontains(body.html.display_text, "to:"),
        strings.icontains(body.html.display_text, "sent:"),
        strings.icontains(body.html.display_text, "subject:")
      )
      or length(body.previous_threads) > 0
    )
    and (
      length(body.current_thread.text) + 100 < length(body.html.display_text)
    )
    // negating bouncebacks
    and not any(attachments,
                .content_type in ("message/delivery-status", "message/rfc822")
    )
  )
)
and (
  profile.by_sender().prevalence in ("new", "rare")
  or profile.by_sender().days_known > 30
)
and not profile.by_sender().any_messages_benign

Detection logic

Scope: inbound message.

Fake email thread shows a VIP requesting a donation to a charity, usually addressed to Accounts Payable departments. Can result in monetary loss.

  1. inbound message
  2. body.current_thread.text matches any of 4 patterns
    • *charity*
    • *gala*
    • *donation*
    • *donor*
  3. any of ml.nlu_classifier(body.current_thread.text).entities where:
    • .name is 'financial'
  4. any of ml.nlu_classifier(body.current_thread.text).entities where:
    • .name is 'request'
  5. any of:
    • any of $org_vips where:
      • strings.icontains(body.html.inner_text)
    • any of $org_vips where:
      • strings.icontains(body.plain.raw)
  6. any of:
    • all of:
      • any of:
        • subject.is_forward
        • subject.is_reply
      • any of:
        • all of:
          • length(headers.references) is 0
          • headers.in_reply_to is missing
        • headers.in_reply_to is missing
    • all of:
      • none of:
        • subject.is_forward
        • subject.is_reply
      • any of:
        • at least 3 of 4: body.html.display_text contains any of 4 patterns
          • from:
          • to:
          • sent:
          • subject:
        • length(body.previous_threads) > 0
      • length(body.current_thread.text) + 100 < length(body.html.display_text)
      • not:
        • any of attachments where:
          • .content_type in ('message/delivery-status', 'message/rfc822')
  7. any of:
    • profile.by_sender().prevalence in ('new', 'rare')
    • profile.by_sender().days_known > 30
  8. not:
    • profile.by_sender().any_messages_benign

Inspects: attachments[].content_type, body.current_thread.text, body.html.display_text, body.html.inner_text, body.plain.raw, body.previous_threads, headers.in_reply_to, headers.references, subject.is_forward, subject.is_reply, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender, strings.icontains, strings.ilike. Reference lists: $org_vips.

Indicators matched (12)

FieldMatchValue
strings.ilikesubstring*charity*
strings.ilikesubstring*gala*
strings.ilikesubstring*donation*
strings.ilikesubstring*donor*
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsfinancial
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsrequest
strings.icontainssubstringfrom:
strings.icontainssubstringto:
strings.icontainssubstringsent:
strings.icontainssubstringsubject:
attachments[].content_typemembermessage/delivery-status
attachments[].content_typemembermessage/rfc822