Detection rules › Sublime MQL

Suspicious request for financial information

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

Email is from a suspicious sender and contains a request for financial information, such as AR reports.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesFree email provider, Impersonation: Employee, Impersonation: VIP, Social engineering

Event coverage

Rule body MQL

type.inbound
and length(attachments) <= 1
and length(recipients.to) <= 2
// suspicious sender
and (
  (
    length(headers.reply_to) > 0
    and all(headers.reply_to,
            .email.domain.root_domain != sender.email.domain.root_domain
            and .email.domain.root_domain not in $org_domains
    )
  )
  or sender.email.domain.root_domain in $free_email_providers
  or profile.by_sender().days_known < 3
)
// specific financial language
and (
  regex.icontains(subject.subject,
                  '\b(Aged|Age?ing) (Payables|Receivables|Report)',
                  'reconcill?iation (report|statement).*(issued (settlement|advice)s?)|billing records?'
  )
  or (
    regex.icontains(body.current_thread.text,
                    '\b(Aged|Age?ing) (Payables|Receivables|Report)',
                    '(updated|recent) (\bAR\b|\b\AP\b|\bAR\b \& \bAP\b|accounts?) (Payables|Receivables|Reports)',
                    '(shared?|send|forward|provide).*remittance (advice|receipts?|statements?)'
    )
    or strings.icontains(body.current_thread.text,
                         "copy of a current statement"
    )
    or (
      strings.icontains(body.current_thread.text, "please send all past due")
      and strings.icontains(body.current_thread.text, "current invoices")
    )
  )
  // suspicious link display text
  or (
    any(body.links,
        regex.icontains(.display_text,
                        '(Payment|Remittance|Settlement|Transfer) ?Batch',
        )
    )
  )
  // suspicious sender display name
  or (
    regex.icontains(sender.display_name,
                    'Accounts? (?:Payable (?:Dep(\.|t\.?|artment)|e?Receipt)|(Co[[:punct:]]?ordinator|Admin|Manager|Payee))'
    )
    // sender email listed as a recipient or recipients undisclosed/null
    and (
      (
        sender.email.email in map(recipients.to, .email.email)
        or (length(recipients.to) == 0 or length(recipients.to) is null)
      )
      // non-benign nlu intent
      or any(ml.nlu_classifier(body.current_thread.text).intents,
             .name != "benign"
      )
    )
  )
  or (
    any(ml.nlu_classifier(body.current_thread.text).intents,
        .name == "cred_theft" and .confidence == "high"
    )
    and any(ml.nlu_classifier(body.current_thread.text).entities,
            .name == "financial" and .text =~ "remittance"
    )
  )
)
// negate resume related/job inquiry outreach
and not (
  any(ml.nlu_classifier(body.current_thread.text).topics,
      .name == "Professional and Career Development" and .confidence == "high"
  )
  and any(ml.nlu_classifier(body.current_thread.text).intents,
          .name == "benign" and .confidence != "low"
  )
)
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
)
and not profile.by_sender().any_messages_benign

Detection logic

Scope: inbound message.

Email is from a suspicious sender and contains a request for financial information, such as AR reports.

  1. inbound message
  2. length(attachments) ≤ 1
  3. length(recipients.to) ≤ 2
  4. any of:
    • all of:
      • length(headers.reply_to) > 0
      • all of headers.reply_to where all hold:
        • .email.domain.root_domain is not sender.email.domain.root_domain
        • .email.domain.root_domain not in $org_domains
    • sender.email.domain.root_domain in $free_email_providers
    • profile.by_sender().days_known < 3
  5. any of:
    • subject.subject matches any of 2 patterns
      • \b(Aged|Age?ing) (Payables|Receivables|Report)
      • reconcill?iation (report|statement).*(issued (settlement|advice)s?)|billing records?
    • any of:
      • body.current_thread.text matches any of 3 patterns
        • \b(Aged|Age?ing) (Payables|Receivables|Report)
        • (updated|recent) (\bAR\b|\b\AP\b|\bAR\b \& \bAP\b|accounts?) (Payables|Receivables|Reports)
        • (shared?|send|forward|provide).*remittance (advice|receipts?|statements?)
      • body.current_thread.text contains 'copy of a current statement'
      • all of:
        • body.current_thread.text contains 'please send all past due'
        • body.current_thread.text contains 'current invoices'
    • any of body.links where:
      • .display_text matches '(Payment|Remittance|Settlement|Transfer) ?Batch'
    • all of:
      • sender.display_name matches 'Accounts? (?:Payable (?:Dep(\\.|t\\.?|artment)|e?Receipt)|(Co[[:punct:]]?ordinator|Admin|Manager|Payee))'
      • any of:
        • any of:
          • sender.email.email in map(recipients.to, .email.email)
          • any of:
            • length(recipients.to) is 0
            • length(recipients.to) is missing
        • any of ml.nlu_classifier(body.current_thread.text).intents where:
          • .name is not 'benign'
    • all of:
      • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
        • .name is 'cred_theft'
        • .confidence is 'high'
      • any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
        • .name is 'financial'
        • .text is 'remittance'
  6. not:
    • all of:
      • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
        • .name is 'Professional and Career Development'
        • .confidence is 'high'
      • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
        • .name is 'benign'
        • .confidence is not 'low'
  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
  8. not:
    • profile.by_sender().any_messages_benign

Inspects: body.current_thread.text, body.links, body.links[].display_text, headers.auth_summary.dmarc.pass, headers.reply_to, headers.reply_to[].email.domain.root_domain, recipients.to, recipients.to[].email.email, sender.display_name, sender.email.domain.root_domain, sender.email.email, subject.subject, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender, regex.icontains, strings.icontains. Reference lists: $free_email_providers, $high_trust_sender_root_domains, $org_domains.

Indicators matched (16)

FieldMatchValue
regex.icontainsregex\b(Aged|Age?ing) (Payables|Receivables|Report)
regex.icontainsregexreconcill?iation (report|statement).*(issued (settlement|advice)s?)|billing records?
regex.icontainsregex(updated|recent) (\bAR\b|\b\AP\b|\bAR\b \& \bAP\b|accounts?) (Payables|Receivables|Reports)
regex.icontainsregex(shared?|send|forward|provide).*remittance (advice|receipts?|statements?)
strings.icontainssubstringcopy of a current statement
strings.icontainssubstringplease send all past due
strings.icontainssubstringcurrent invoices
regex.icontainsregex(Payment|Remittance|Settlement|Transfer) ?Batch
regex.icontainsregexAccounts? (?:Payable (?:Dep(\.|t\.?|artment)|e?Receipt)|(Co[[:punct:]]?ordinator|Admin|Manager|Payee))
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsfinancial
4 more
ml.nlu_classifier(body.current_thread.text).entities[].textequalsremittance
ml.nlu_classifier(body.current_thread.text).topics[].nameequalsProfessional and Career Development
ml.nlu_classifier(body.current_thread.text).topics[].confidenceequalshigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalsbenign