Detection rules › Sublime MQL

Mismatched links: Free file share with urgent language

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

Detects messages from first-time senders containing free file sharing links, multiple urgent language indicators, and mismatched link text.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Callback Phishing, Credential Phishing, Extortion, Malware/Ransomware, Spam
Tactics and techniquesFree file host, Social engineering

Event coverage

Rule body MQL

type.inbound

// Unsolicited + new sender
and (
  profile.by_sender_email().prevalence in ("new", "outlier")
  and not profile.by_sender_email().solicited
)
and not profile.by_sender_email().any_messages_benign

// Free file share
and any(body.links, .href_url.domain.domain in $free_file_hosts)

// urgent language
and 3 of (
  any(ml.nlu_classifier(body.current_thread.text).entities, .name == "urgency"),
  any(ml.nlu_classifier(subject.subject).entities, .name == "urgency"),
  regex.icontains(body.current_thread.text,
                  'immediate|urgent|expire|suspend|action.{0,20}required|time.{0,10}sensitive|verify.{0,20}immediately|complete.{0,20}requested'
  ),
  regex.icontains(subject.subject,
                  'immediate|urgent|expire|suspend|action.{0,20}required|important.{0,20}announcement'
  ),
  regex.icontains(body.current_thread.text,
                  'deadline|expires?.{0,10}(today|soon)|act.{0,10}now|time.{0,10}running.{0,10}out|limited.{0,10}time'
  )
)

// Mismatched link
and any(body.links,
        .mismatched == true
        and length(body.links) <= 3
        and not .href_url.domain.root_domain in (
          "mimecast.com",
          "mimecastprotect.com"
        )
)

Detection logic

Scope: inbound message.

Detects messages from first-time senders containing free file sharing links, multiple urgent language indicators, and mismatched link text.

  1. inbound message
  2. all of:
    • profile.by_sender_email().prevalence in ('new', 'outlier')
    • not:
      • profile.by_sender_email().solicited
  3. not:
    • profile.by_sender_email().any_messages_benign
  4. any of body.links where:
    • .href_url.domain.domain in $free_file_hosts
  5. at least 3 of:
    • any of ml.nlu_classifier(body.current_thread.text).entities where:
      • .name is 'urgency'
    • any of ml.nlu_classifier(subject.subject).entities where:
      • .name is 'urgency'
    • body.current_thread.text matches 'immediate|urgent|expire|suspend|action.{0,20}required|time.{0,10}sensitive|verify.{0,20}immediately|complete.{0,20}requested'
    • subject.subject matches 'immediate|urgent|expire|suspend|action.{0,20}required|important.{0,20}announcement'
    • body.current_thread.text matches 'deadline|expires?.{0,10}(today|soon)|act.{0,10}now|time.{0,10}running.{0,10}out|limited.{0,10}time'
  6. any of body.links where all hold:
    • .mismatched is True
    • length(body.links) ≤ 3
    • not:
      • .href_url.domain.root_domain in ('mimecast.com', 'mimecastprotect.com')

Inspects: body.current_thread.text, body.links, body.links[].href_url.domain.domain, body.links[].href_url.domain.root_domain, body.links[].mismatched, subject.subject, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender_email, regex.icontains. Reference lists: $free_file_hosts.

Indicators matched (7)

FieldMatchValue
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsurgency
ml.nlu_classifier(subject.subject).entities[].nameequalsurgency
regex.icontainsregeximmediate|urgent|expire|suspend|action.{0,20}required|time.{0,10}sensitive|verify.{0,20}immediately|complete.{0,20}requested
regex.icontainsregeximmediate|urgent|expire|suspend|action.{0,20}required|important.{0,20}announcement
regex.icontainsregexdeadline|expires?.{0,10}(today|soon)|act.{0,10}now|time.{0,10}running.{0,10}out|limited.{0,10}time
body.links[].href_url.domain.root_domainmembermimecast.com
body.links[].href_url.domain.root_domainmembermimecastprotect.com