Detection rules › Sublime MQL

Sublime MQL rules: job

Job scam with specific salary pattern

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

Detects job scam content that includes specific weekly salary mentions (e.g., '$XXX weekly' patterns) in either the current email thread or previous thread conversations, while excluding legitimate income verification services.

Threat Classification

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

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesSocial engineering

Telemetry Coverage

PlatformRecord / event type
SublimeInbound email message

Message Attributes

  • attachments
  • body
  • body.current_thread
  • body.previous_threads
  • headers
  • headers.auth_summary
  • sender.email
  • type

Rule Body

type.inbound
and (
  (
    // job scam in current thread
    any(ml.nlu_classifier(body.current_thread.text).intents,
        .name in ("job_scam") and .confidence != "low"
    )
    // and salary mention in current thread
    and regex.icontains(body.current_thread.text,
                        '\$\d{3} weekly',
                        'week \$\d{3}',
                        'weekly(?:\s+\w+){0,4}\s+\$\d{3}[^\d]'
    )
  )
  // job scam in previous thread
  or any(body.previous_threads,
         any(ml.nlu_classifier(.text).intents,
             .name in ("job_scam") and .confidence != "low"
         )
         // and salary mention in previous thread
         and regex.icontains(.text,
                             '\$\d{3} weekly',
                             'week \$\d{3}',
                             'weekly(?:\s+\w+){0,4}\s+\$\d{3}[^\d]'
         )
  )
  // job scam lure delivered as a PDF with an empty email body
  or (
    length(body.current_thread.text) == 0
    and length(attachments) == 1
    and any(filter(attachments, .file_type == "pdf"),
            any(file.explode(.),
                // specific weekly salary pattern in the OCR
                regex.icontains(.scan.ocr.raw,
                                '\$\d{3} week',
                                'week \$\d{3}',
                                'weekly(?:\s+\w+){0,4}\s+\$\d{3}[^\d]'
                )
                and regex.icontains(.scan.ocr.raw,
                                    'fully remote',
                                    'remote\b[\s-]*(?:work|position|role|job|employee|worker|assistant|opportunit)',
                                    'remotely',
                                    'work[\s-]?from[\s-]?home',
                                    'equal opportunity employer',
                                    'how to apply',
                                    'submit (?:your )?application',
                                    'remote\b[\s-]*(?:work|position|role|job|employee|worker|assistant|opportunit)',
                                    'remotely',
                                    'work[\s-]?from[\s-]?home',
                                    'equal opportunity employer',
                                    'how to apply',
                                    'submit (?:your )?application',
                                    'open to all (?:majors|backgrounds|students)',
                                    'employment opportunity',
                                    '\bhiring\b'
                )
                and not regex.icontains(.scan.ocr.raw,
                                        'unemployment',
                                        'monetary (?:re)?determination',
                                        'weekly benefit amount',
                                        'supplemental unemployment',
                                        'work search activit'
                )
            )
    )
  )
)
and length(body.current_thread.links) < 10

// negating income / job verification senders
and not (
  sender.email.domain.root_domain in (
    'loandepot.com',
    'sofi.com',
    'lensa.com',
    'indeed.com',
    'ziprecruiter.com',
    'glassdoor.com',
    'postjobfree.com',
    'jobplacements.com'
  )
  and headers.auth_summary.dmarc.pass
)

Detection Logic

Scope: inbound message.

Detects job scam content that includes specific weekly salary mentions (e.g., '$XXX weekly' patterns) in either the current email thread or previous thread conversations, while excluding legitimate income verification services.

  1. inbound message
  2. any of:
    • all of:
      • any(ml.nlu_classifier(body.current_thread.text).intents, .name in ("job_scam") and .confidence != "low" )
      • body.current_thread.text matches any of 3 patterns
        • \$\d{3} weekly
        • week \$\d{3}
        • weekly(?:\s+\w+){0,4}\s+\$\d{3}[^\d]
    • any of body.previous_threads where all hold:
      • any(ml.nlu_classifier(.text).intents, .name in ("job_scam") and .confidence != "low" )
      • .text matches any of 3 patterns
        • \$\d{3} weekly
        • week \$\d{3}
        • weekly(?:\s+\w+){0,4}\s+\$\d{3}[^\d]
    • all of:
      • length(body.current_thread.text) == 0
      • length(attachments) == 1
      • any(filter(attachments, .file_type == "pdf"), any(file.explode(.), // specific weekly salary pattern in the OCR regex.icontains(.scan.ocr.raw, '\$\d{3} week', 'week \$\d{3}', 'weekly(?:\s+\w+){0,4}\s+\$\d{3}[^\d]' ) and regex.icontains(.scan.ocr.raw, 'fully remote', 'remote\b[\s-]*(?:work|position|role|job|employee|worker|assistant|opportunit)', 'remotely', 'work[\s-]?from[\s-]?home', 'equal opportunity employer', 'how to apply', 'submit (?:your )?application', 'remote\b[\s-]*(?:work|position|role|job|employee|worker|assistant|opportunit)', 'remotely', 'work[\s-]?from[\s-]?home', 'equal opportunity employer', 'how to apply', 'submit (?:your )?application', 'open to all (?:majors|backgrounds|students)', 'employment opportunity', '\bhiring\b' ) and not regex.icontains(.scan.ocr.raw, 'unemployment', 'monetary (?:re)?determination', 'weekly benefit amount', 'supplemental unemployment', 'work search activit' ) ) )
  3. length(body.current_thread.links) < 10
  4. not:
    • all of:
      • sender.email.domain.root_domain in ('loandepot.com', 'sofi.com', 'lensa.com', 'indeed.com', 'ziprecruiter.com', 'glassdoor.com', 'postjobfree.com', 'jobplacements.com')
      • headers.auth_summary.dmarc.pass

Inspects: attachments[].file_type, body.current_thread.links, body.current_thread.text, body.previous_threads, body.previous_threads[].text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: file.explode, ml.nlu_classifier, regex.icontains.

Indicators Matched (17)

FieldMatchValue
ml.nlu_classifier(body.current_thread.text).intents[].namememberjob_scam
regex.icontainsregex\$\d{3} weekly
regex.icontainsregexweek \$\d{3}
regex.icontainsregexweekly(?:\s+\w+){0,4}\s+\$\d{3}[^\d]
ml.nlu_classifier(body.previous_threads[].text).intents[].namememberjob_scam
attachments[].file_typeequalspdf
regex.icontainsregex\$\d{3} week
regex.icontainsregexfully remote
regex.icontainsregexremote\b[\s-]*(?:work|position|role|job|employee|worker|assistant|opportunit)
regex.icontainsregexremotely
regex.icontainsregexwork[\s-]?from[\s-]?home
regex.icontainsregexequal opportunity employer
5 more
regex.icontainsregexhow to apply
regex.icontainsregexsubmit (?:your )?application
regex.icontainsregexopen to all (?:majors|backgrounds|students)
regex.icontainsregexemployment opportunity
regex.icontainsregex\bhiring\b

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(body.previous_threads)
      and
        or
          body.previous_threads.text regex_match "\\$\\d{3} weekly"
          body.previous_threads.text regex_match "week \\$\\d{3}"
          body.previous_threads.text regex_match "weekly(?:\\s+\\w+){0,4}\\s+\\$\\d{3}[^\\d]"
         macro "any(ml.nlu_classifier(.text).intents,\n             .name in (\"job_scam\") and .confidence != \"low\"\n         )"
    and
      or
        body.current_thread.text regex_match "\\$\\d{3} weekly"
        body.current_thread.text regex_match "week \\$\\d{3}"
        body.current_thread.text regex_match "weekly(?:\\s+\\w+){0,4}\\s+\\$\\d{3}[^\\d]"
       macro "any(ml.nlu_classifier(body.current_thread.text).intents,\n        .name in (\"job_scam\") and .confidence != \"low\"\n    )"
    and
      attachments length_compare "1"
      body.current_thread.text length_compare "0"
       macro "any(filter(attachments, .file_type == \"pdf\"),\n            any(file.explode(.),\n                // specific weekly salary pattern in the OCR\n                regex.icontains(.scan.ocr.raw,\n                                '\\$\\d{3} week',\n                                'week \\$\\d{3}',\n                                'weekly(?:\\s+\\w+){0,4}\\s+\\$\\d{3}[^\\d]'\n                )\n                and regex.icontains(.scan.ocr.raw,\n                                    'fully remote',\n                                    'remote\\b[\\s-]*(?:work|position|role|job|employee|worker|assistant|opportunit)',\n                                    'remotely',\n                                    'work[\\s-]?from[\\s-]?home',\n                                    'equal opportunity employer',\n                                    'how to apply',\n                                    'submit (?:your )?application',\n                                    'remote\\b[\\s-]*(?:work|position|role|job|employee|worker|assistant|opportunit)',\n                                    'remotely',\n                                    'work[\\s-]?from[\\s-]?home',\n                                    'equal opportunity employer',\n                                    'how to apply',\n                                    'submit (?:your )?application',\n                                    'open to all (?:majors|backgrounds|students)',\n                                    'employment opportunity',\n                                    '\\bhiring\\b'\n                )\n                and not regex.icontains(.scan.ocr.raw,\n                                        'unemployment',\n                                        'monetary (?:re)?determination',\n                                        'weekly benefit amount',\n                                        'supplemental unemployment',\n                                        'work search activit'\n                )\n            )\n    )"
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["glassdoor.com", "indeed.com", "jobplacements.com", "lensa.com", "loandepot.com", "postjobfree.com", "sofi.com", "ziprecruiter.com"]
  body.current_thread.links length_compare "10"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textregex_match
  • $\d{3} weekly
  • week $\d{3}
  • weekly(?:\s+\w+){0,4}\s+$\d{3}[^\d]
field:"body.current_thread.text" kind:regex_match
type.inboundeq
  • true transforms: boolean corpus 1212 (mql 1212)
field:"type.inbound" kind:eq value:"true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.auth_summary.dmarc.passeqtrueexcludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true"
sender.email.domain.root_domaininglassdoor.com, indeed.com, jobplacements.com, lensa.com, loandepot.com, postjobfree.com, sofi.com, ziprecruiter.comexcludes:sender.email.domain.root_domain

Back to all Sublime MQL rules