Detection rules › Sublime MQL

Suspicious newly registered reply-to domain with engaging financial or urgent language

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

Detects messages from a mismatched newly registered Reply-to domain that contain a financial or urgent request, or a request and an NLU tag with medium to high confidence, from an untrusted sender. This technique is typically observed in Vendor impersonation.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesSocial engineering

Event coverage

Rule body MQL

type.inbound
and length(body.current_thread.text) < 5000
and (
  any(headers.reply_to,
      // mismatched reply-to and sender domain
      .email.domain.root_domain != sender.email.domain.root_domain
      // newly registered reply-to domain
      and network.whois(.email.domain).days_old <= 30
  )
  or (
    network.whois(sender.email.domain).days_old < 30
    and sender.email.domain.tld in $suspicious_tlds
  )
)
// request is being made
and any(ml.nlu_classifier(body.current_thread.text).entities,
        .name == "request"
)
// there's financial/urgency OR a tag of medium/high confidence
and (
  any(ml.nlu_classifier(body.current_thread.text).entities,
      .name in ("financial", "urgency")
  )
  or any(ml.nlu_classifier(body.current_thread.text).tags,
         .name is not null and .confidence in ("medium", "high")
  )
)
and (
  not profile.by_sender().solicited

  // 
  // This rule makes use of a beta feature and is subject to change without notice
  // using the beta feature in custom rules is not suggested until it has been formally released
  // 
  or not beta.profile.by_reply_to().solicited
  or (
    profile.by_sender().any_messages_malicious_or_spam
    and not profile.by_sender().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 headers.auth_summary.dmarc.pass
  )
  or sender.email.domain.root_domain not in $high_trust_sender_root_domains
)

Detection logic

Scope: inbound message.

Detects messages from a mismatched newly registered Reply-to domain that contain a financial or urgent request, or a request and an NLU tag with medium to high confidence, from an untrusted sender. This technique is typically observed in Vendor impersonation.

  1. inbound message
  2. length(body.current_thread.text) < 5000
  3. any of:
    • any of headers.reply_to where all hold:
      • .email.domain.root_domain is not sender.email.domain.root_domain
      • network.whois(.email.domain).days_old ≤ 30
    • all of:
      • network.whois(sender.email.domain).days_old < 30
      • sender.email.domain.tld in $suspicious_tlds
  4. any of ml.nlu_classifier(body.current_thread.text).entities where:
    • .name is 'request'
  5. any of:
    • any of ml.nlu_classifier(body.current_thread.text).entities where:
      • .name in ('financial', 'urgency')
    • any of ml.nlu_classifier(body.current_thread.text).tags where all hold:
      • .name is set
      • .confidence in ('medium', 'high')
  6. any of:
    • not:
      • profile.by_sender().solicited
    • not:
      • beta.profile.by_reply_to().solicited
    • all of:
      • profile.by_sender().any_messages_malicious_or_spam
      • not:
        • profile.by_sender().any_messages_benign
  7. any of:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • not:
        • headers.auth_summary.dmarc.pass
    • sender.email.domain.root_domain not in $high_trust_sender_root_domains

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.reply_to, headers.reply_to[].email.domain, headers.reply_to[].email.domain.root_domain, sender.email.domain, sender.email.domain.root_domain, sender.email.domain.tld, type.inbound. Sensors: beta.profile.by_reply_to, ml.nlu_classifier, network.whois, profile.by_sender. Reference lists: $high_trust_sender_root_domains, $suspicious_tlds.

Indicators matched (5)

FieldMatchValue
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsrequest
ml.nlu_classifier(body.current_thread.text).entities[].namememberfinancial
ml.nlu_classifier(body.current_thread.text).entities[].namememberurgency
ml.nlu_classifier(body.current_thread.text).tags[].confidencemembermedium
ml.nlu_classifier(body.current_thread.text).tags[].confidencememberhigh