Detection rules › Sublime MQL
Sublime MQL rules: scam
| Rule | Severity |
|---|---|
| Scam soliciting employer review/rating | low |
| Scam: Fake estate sale offering welding equipment and tools | high |
| Scam: Piano giveaway | medium |
Scam soliciting employer review/rating
#Detects scam content that impersonates employer review/rating platforms (e.g., Glassdoor, Indeed, Comparably, Great Place to Work) and solicits the recipient to review or rate their employer, while excluding legitimate review/rating platform senders.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Credential Phishing |
| Tactics and techniques | Social engineering, Impersonation: Brand |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// credential theft or scam intent
and any(ml.nlu_classifier(body.current_thread.text).intents,
.name in ("cred_theft", "job_scam") and .confidence != "low"
)
// employer/workplace review solicitation phrasing
and regex.icontains(body.current_thread.text,
'\brate\s+(?:your\s+)?(?:employer|workplace|job)\b',
'\breview\s+(?:your\s+)?(?:experience\s+(?:at|with)\s+(?:your|the)\s)',
'\b(?:employer|workplace|job)\s+(?:review|rating|feedback)\b',
'\bleave\s+(?:a\s+)?(?:review|rating).{0,40}(?:employer|workplace|job)',
'(?:glassdoor|comparably|great\s+place\s+to\s+work|kununu|jobcase).{0,40}(?:review|rate|rating|feedback)'
)
and (
// credential harvesting
regex.icontains(body.current_thread.text,
'(?:enter|provide|confirm|verify).{0,40}(?:password|credentials|login|email\s+and\s+password)',
'verify\s+your\s+(?:identity|eligibility|account|profile)',
'(?:password|credential|login).{0,30}(?:enter|provide|confirm|verify|required)'
)
// or monetary incentive
or regex.icontains(body.current_thread.text,
'gift.?card',
'(?:receive|earn|get|claim).{0,30}[\$€£]\d+',
'[\$€£]\d+.{0,30}(?:gift|reward|credit|incentive|voucher|bonus|prize)',
'token\s+of\s+(?:our\s+)?(?:appreciation|thanks|gratitude)'
)
)
// negating legitimate/trusted employer review/rating senders
and not (
(
sender.email.domain.root_domain in (
'comparably.com',
'greatplacetowork.com',
'builtin.com',
'lensa.com',
'ziprecruiter.com',
'kununu.com',
'jobcase.com',
'trustpilot.com'
)
or sender.email.domain.root_domain in $high_trust_sender_root_domains
)
and coalesce(headers.auth_summary.dmarc.pass, false)
)
// subject cites employer review / rating / feedback context
and regex.icontains(subject.subject,
'\breview\b',
'\brating\b',
'\brate\b',
'\bfeedback\b',
'\btestimonial\b',
'\b(?:employer|workplace|company|employee|job)\b',
'\b(?:glassdoor|indeed|linkedin|comparably|great\s+place\s+to\s+work|built\s?in|lensa|ziprecruiter|kununu|jobcase|trustpilot)\b',
'\bexperience\b',
'\bsurvey\b',
'\bopinion\b'
)
Detection logic
Scope: inbound message.
Detects scam content that impersonates employer review/rating platforms (e.g., Glassdoor, Indeed, Comparably, Great Place to Work) and solicits the recipient to review or rate their employer, while excluding legitimate review/rating platform senders.
- inbound message
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name in ('cred_theft', 'job_scam')
- .confidence is not 'low'
body.current_thread.text matches any of 5 patterns
\brate\s+(?:your\s+)?(?:employer|workplace|job)\b\breview\s+(?:your\s+)?(?:experience\s+(?:at|with)\s+(?:your|the)\s)\b(?:employer|workplace|job)\s+(?:review|rating|feedback)\b\bleave\s+(?:a\s+)?(?:review|rating).{0,40}(?:employer|workplace|job)(?:glassdoor|comparably|great\s+place\s+to\s+work|kununu|jobcase).{0,40}(?:review|rate|rating|feedback)
any of:
body.current_thread.text matches any of 3 patterns
(?:enter|provide|confirm|verify).{0,40}(?:password|credentials|login|email\s+and\s+password)verify\s+your\s+(?:identity|eligibility|account|profile)(?:password|credential|login).{0,30}(?:enter|provide|confirm|verify|required)
body.current_thread.text matches any of 4 patterns
gift.?card(?:receive|earn|get|claim).{0,30}[\$€£]\d+[\$€£]\d+.{0,30}(?:gift|reward|credit|incentive|voucher|bonus|prize)token\s+of\s+(?:our\s+)?(?:appreciation|thanks|gratitude)
not:
all of:
any of:
- sender.email.domain.root_domain in ('comparably.com', 'greatplacetowork.com', 'builtin.com', 'lensa.com', 'ziprecruiter.com', 'kununu.com', 'jobcase.com', 'trustpilot.com')
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- coalesce(headers.auth_summary.dmarc.pass)
subject.subject matches any of 10 patterns
\breview\b\brating\b\brate\b\bfeedback\b\btestimonial\b\b(?:employer|workplace|company|employee|job)\b\b(?:glassdoor|indeed|linkedin|comparably|great\s+place\s+to\s+work|built\s?in|lensa|ziprecruiter|kununu|jobcase|trustpilot)\b\bexperience\b\bsurvey\b\bopinion\b
Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: ml.nlu_classifier, regex.icontains. Reference lists: $high_trust_sender_root_domains.
Indicators matched (24)
| Field | Match | Value |
|---|---|---|
ml.nlu_classifier(body.current_thread.text).intents[].name | member | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].name | member | job_scam |
regex.icontains | regex | \brate\s+(?:your\s+)?(?:employer|workplace|job)\b |
regex.icontains | regex | \breview\s+(?:your\s+)?(?:experience\s+(?:at|with)\s+(?:your|the)\s) |
regex.icontains | regex | \b(?:employer|workplace|job)\s+(?:review|rating|feedback)\b |
regex.icontains | regex | \bleave\s+(?:a\s+)?(?:review|rating).{0,40}(?:employer|workplace|job) |
regex.icontains | regex | (?:glassdoor|comparably|great\s+place\s+to\s+work|kununu|jobcase).{0,40}(?:review|rate|rating|feedback) |
regex.icontains | regex | (?:enter|provide|confirm|verify).{0,40}(?:password|credentials|login|email\s+and\s+password) |
regex.icontains | regex | verify\s+your\s+(?:identity|eligibility|account|profile) |
regex.icontains | regex | (?:password|credential|login).{0,30}(?:enter|provide|confirm|verify|required) |
regex.icontains | regex | gift.?card |
regex.icontains | regex | (?:receive|earn|get|claim).{0,30}[\$€£]\d+ |
12 more
regex.icontains | regex | [\$€£]\d+.{0,30}(?:gift|reward|credit|incentive|voucher|bonus|prize) |
regex.icontains | regex | token\s+of\s+(?:our\s+)?(?:appreciation|thanks|gratitude) |
regex.icontains | regex | \breview\b |
regex.icontains | regex | \brating\b |
regex.icontains | regex | \brate\b |
regex.icontains | regex | \bfeedback\b |
regex.icontains | regex | \btestimonial\b |
regex.icontains | regex | \b(?:employer|workplace|company|employee|job)\b |
regex.icontains | regex | \b(?:glassdoor|indeed|linkedin|comparably|great\s+place\s+to\s+work|built\s?in|lensa|ziprecruiter|kununu|jobcase|trustpilot)\b |
regex.icontains | regex | \bexperience\b |
regex.icontains | regex | \bsurvey\b |
regex.icontains | regex | \bopinion\b |
Stages and Predicates
Stage 1: mql_rule
and
not
and
or
sender.email.domain.root_domain in ["builtin.com", "comparably.com", "greatplacetowork.com", "jobcase.com", "kununu.com", "lensa.com", "trustpilot.com", "ziprecruiter.com"]
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
any(ml.nlu_classifier(body.current_thread.text).intents)
and
ml.nlu_classifier(body.current_thread.text).intents.confidence ne "low"
ml.nlu_classifier(body.current_thread.text).intents.name in ["cred_theft", "job_scam"]
or
body.current_thread.text regex_match "(?:enter|provide|confirm|verify).{0,40}(?:password|credentials|login|email\\s+and\\s+password)"
body.current_thread.text regex_match "(?:password|credential|login).{0,30}(?:enter|provide|confirm|verify|required)"
body.current_thread.text regex_match "(?:receive|earn|get|claim).{0,30}[\\$€£]\\d+"
body.current_thread.text regex_match "[\\$€£]\\d+.{0,30}(?:gift|reward|credit|incentive|voucher|bonus|prize)"
body.current_thread.text regex_match "gift.?card"
body.current_thread.text regex_match "token\\s+of\\s+(?:our\\s+)?(?:appreciation|thanks|gratitude)"
body.current_thread.text regex_match "verify\\s+your\\s+(?:identity|eligibility|account|profile)"
or
body.current_thread.text regex_match "(?:glassdoor|comparably|great\\s+place\\s+to\\s+work|kununu|jobcase).{0,40}(?:review|rate|rating|feedback)"
body.current_thread.text regex_match "\\b(?:employer|workplace|job)\\s+(?:review|rating|feedback)\\b"
body.current_thread.text regex_match "\\bleave\\s+(?:a\\s+)?(?:review|rating).{0,40}(?:employer|workplace|job)"
body.current_thread.text regex_match "\\brate\\s+(?:your\\s+)?(?:employer|workplace|job)\\b"
body.current_thread.text regex_match "\\breview\\s+(?:your\\s+)?(?:experience\\s+(?:at|with)\\s+(?:your|the)\\s)"
or
subject.subject regex_match "\\b(?:employer|workplace|company|employee|job)\\b"
subject.subject regex_match "\\b(?:glassdoor|indeed|linkedin|comparably|great\\s+place\\s+to\\s+work|built\\s?in|lensa|ziprecruiter|kununu|jobcase|trustpilot)\\b"
subject.subject regex_match "\\bexperience\\b"
subject.subject regex_match "\\bfeedback\\b"
subject.subject regex_match "\\bopinion\\b"
subject.subject regex_match "\\brate\\b"
subject.subject regex_match "\\brating\\b"
subject.subject regex_match "\\breview\\b"
subject.subject regex_match "\\bsurvey\\b"
subject.subject regex_match "\\btestimonial\\b"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.email.domain.root_domain | in | builtin.com, comparably.com, greatplacetowork.com, jobcase.com, kununu.com, lensa.com, trustpilot.com, ziprecruiter.com | excludes:sender.email.domain.root_domain |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Scam: Fake estate sale offering welding equipment and tools
#Detects fraudulent messages impersonating someone selling inherited or estate items, specifically targeting welding equipment, power tools, and machinery. These messages typically claim items are from a deceased relative's estate or due to relocation, require shipping arrangements, and use emotional manipulation to appear legitimate while requesting contact through alternative channels.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Social engineering, Free email provider, Out of band pivot |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
length(body.current_thread.links) < 10
and length(body.current_thread.text) < 3000
and (
regex.icontains(body.current_thread.text,
'(?:Miller|Lincoln\s*Electric|Hobart|ESAB|Fronius|Everlast|Hypertherm|Thermal\s*Dynamics)\s*[^\r\n]{0,50}(?:\bwelder\b|\bwelding\b|\bTIG\b|\bMIG\b|plasma\s*cutter)',
'(?:\bwelder\b|\bwelding\b|\bTIG\b|\bMIG\b|plasma\s*cutter)\s*[^\r\n]{0,50}(?:Miller|Lincoln\s*Electric|Hobart|ESAB|Fronius|Everlast|Hypertherm|Thermal\s*Dynamics)'
)
or regex.icontains(body.current_thread.text,
'(?:Caterpillar|\bCAT\b|John\s*Deere|Kubota|Bobcat|Honda|Generac|Stihl|Husqvarna|\bToro\b)\s*[^\r\n]{0,50}(?:\bgenerator\b|\bchainsaw\b|\bexcavator\b|\bskid\s*steer\b|\btractor\b|\bmower\b|\bloader\b|\bbackhoe\b)'
)
or regex.icontains(body.current_thread.text,
'(?:welding\s*tools|power\s*tools|tool\s+(?:box|chest|set|kit|collection)|toolbox|toolchest)\s*[^\r\n]{0,50}(?:available|sale|rehome|gift|giving\s*away|free)',
'(?:available|sale|rehome|gift|giving\s*away|free)\s*[^\r\n]{0,50}(?:welding\s*tools|power\s*tools|tool\s+(?:box|chest|set|kit|collection)|toolbox|toolchest)'
)
or strings.ilike(body.current_thread.text,
'*welding tools*',
'*tools and accessories*'
)
or (
length(regex.extract(body.current_thread.text,
'(?i)(?:generator|refrigerator|trailer|tractor|lawnmower|mower|washer|dryer|freezer|treadmill|peloton|vanity|dresser|couch|sectional|kennel|mattress|bed\s*frame|hot\s*tub|golf\s*cart|tv|gazebo|loveseat|dishwasher|microwave|kitchenaid|rolex|watch|honda|toyota|ford|chevy|jeep|kubota|bobcat|polaris|kawasaki|macbook|iphone|playstation|ps5|xbox|canon|sony|dji|piano|keyboard|guitar|violin)\b[^\r\n]{0,30}(?:\(\s*\d{2,5}\s*\)|\$\s*\d{2,5}|\bfor\s+\$?\d{2,5})'
)
) >= 5
and regex.icontains(body.current_thread.text,
'late (?:husband|father|dad|wife|mother|mom)',
'(?:husband|father|dad|wife|mother|mom)[^\r\n]{0,50}estate'
)
)
)
and (
regex.icontains(body.current_thread.text,
'late (?:husband|father|dad|wife|mother|mom)',
'(?:husband|father|dad|wife|mother|mom)[^\r\n]{0,50}estate',
'inherited instruments',
'just lost (?:her|his|their) (?:husband|father|dad|wife|mother|mom)'
)
or strings.ilike(body.current_thread.text,
'* downsizing *',
'* relocating soon *',
'* to relocate *',
'*prepares to relocate*',
'*relocate with*family*'
)
or strings.ilike(body.current_thread.text,
'*sponsored*giveaway*',
'*giveaway*sponsored*',
'* generously offering *',
'* generous offer *',
'*a loving home*',
'*a good home*',
'*find a new home *',
'*rehome these instruments *',
'* free donation*'
)
or regex.icontains(body.current_thread.text,
'giv\w+\s+away\s+(?:her|his|their|my|our)\s+(?:late|deceased|dad|father|mother|husband|wife)',
'giv\w+\s+away\s+(?:her|his|their|my|our)[^\r\n]{0,40}(?:tool|welder|welding|equipment|instrument|machine)'
)
or strings.ilike(body.current_thread.text,
'*generous opportunity*',
'*who needs a reliable*',
'*comprehensive set of tools*',
'*top-of-the-line machine*'
)
)
and (
regex.icontains(body.current_thread.text,
'shipping (?:fee|cost|arrangement)',
'(?:responsible|pay) for shipping',
'no (?:local\s)?pick.?up',
'(?:local\s)?pick.?up.{0,50}not available',
'delivery only',
'moving company'
)
or strings.ilike(body.current_thread.text,
'* if you will take it *',
'* or have someone *',
'* indicate your interest *',
'* to someone you know *',
'* know someone who *',
'* someone you know would *',
'* someone who will *',
'* someone who truly *',
'* anyone you know *'
)
or regex.icontains(body.current_thread.text,
'if you[^\r\n]{0,20}(?:(?:might|will|would) be|are)[^\r\n]{0,20}interested',
'(?:any|some)one[^\r\n]{0,20}(is|will|would|might be)[^\r\n]{0,20}interested',
'who (?:will|would|might) appreciate'
)
or (
any(regex.extract(body.current_thread.text,
"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
),
strings.parse_email(.full_match).domain.domain in $free_email_providers
or strings.parse_email(.full_match).domain.root_domain in $free_email_providers
)
or (
length(headers.reply_to) > 0
and sender.email.email not in map(headers.reply_to, .email.email)
)
or length(recipients.to) == 0
or regex.icontains(body.current_thread.text,
'(?:call|contact|text)[^\r\n]{0,50} at'
)
or regex.icontains(body.current_thread.text,
'(?:private|personal|primary) (?:e-?)?mail'
)
or strings.icontains(body.current_thread.text,
'happy to answer any questions you may have'
)
or strings.icontains(body.current_thread.text, ' kindly ')
or strings.icontains(body.current_thread.text, ' (kindly ')
)
)
Detection logic
Detects fraudulent messages impersonating someone selling inherited or estate items, specifically targeting welding equipment, power tools, and machinery. These messages typically claim items are from a deceased relative's estate or due to relocation, require shipping arrangements, and use emotional manipulation to appear legitimate while requesting contact through alternative channels.
- length(body.current_thread.links) < 10
- length(body.current_thread.text) < 3000
any of:
body.current_thread.text matches any of 2 patterns
(?:Miller|Lincoln\s*Electric|Hobart|ESAB|Fronius|Everlast|Hypertherm|Thermal\s*Dynamics)\s*[^\r\n]{0,50}(?:\bwelder\b|\bwelding\b|\bTIG\b|\bMIG\b|plasma\s*cutter)(?:\bwelder\b|\bwelding\b|\bTIG\b|\bMIG\b|plasma\s*cutter)\s*[^\r\n]{0,50}(?:Miller|Lincoln\s*Electric|Hobart|ESAB|Fronius|Everlast|Hypertherm|Thermal\s*Dynamics)
- body.current_thread.text matches '(?:Caterpillar|\\bCAT\\b|John\\s*Deere|Kubota|Bobcat|Honda|Generac|Stihl|Husqvarna|\\bToro\\b)\\s*[^\\r\\n]{0,50}(?:\\bgenerator\\b|\\bchainsaw\\b|\\bexcavator\\b|\\bskid\\s*steer\\b|\\btractor\\b|\\bmower\\b|\\bloader\\b|\\bbackhoe\\b)'
body.current_thread.text matches any of 2 patterns
(?:welding\s*tools|power\s*tools|tool\s+(?:box|chest|set|kit|collection)|toolbox|toolchest)\s*[^\r\n]{0,50}(?:available|sale|rehome|gift|giving\s*away|free)(?:available|sale|rehome|gift|giving\s*away|free)\s*[^\r\n]{0,50}(?:welding\s*tools|power\s*tools|tool\s+(?:box|chest|set|kit|collection)|toolbox|toolchest)
body.current_thread.text matches any of 2 patterns
*welding tools**tools and accessories*
all of:
- length(regex.extract(body.current_thread.text, '(?i)(?:generator|refrigerator|trailer|tractor|lawnmower|mower|washer|dryer|freezer|treadmill|peloton|vanity|dresser|couch|sectional|kennel|mattress|bed\\s*frame|hot\\s*tub|golf\\s*cart|tv|gazebo|loveseat|dishwasher|microwave|kitchenaid|rolex|watch|honda|toyota|ford|chevy|jeep|kubota|bobcat|polaris|kawasaki|macbook|iphone|playstation|ps5|xbox|canon|sony|dji|piano|keyboard|guitar|violin)\\b[^\\r\\n]{0,30}(?:\\(\\s*\\d{2,5}\\s*\\)|\\$\\s*\\d{2,5}|\\bfor\\s+\\$?\\d{2,5})')) ≥ 5
body.current_thread.text matches any of 2 patterns
late (?:husband|father|dad|wife|mother|mom)(?:husband|father|dad|wife|mother|mom)[^\r\n]{0,50}estate
body.current_thread.text matches any of 24 patterns
late (?:husband|father|dad|wife|mother|mom)(?:husband|father|dad|wife|mother|mom)[^\r\n]{0,50}estateinherited instrumentsjust lost (?:her|his|their) (?:husband|father|dad|wife|mother|mom)* downsizing ** relocating soon ** to relocate **prepares to relocate**relocate with*family**sponsored*giveaway**giveaway*sponsored** generously offering ** generous offer **a loving home**a good home**find a new home **rehome these instruments ** free donation*giv\w+\s+away\s+(?:her|his|their|my|our)\s+(?:late|deceased|dad|father|mother|husband|wife)giv\w+\s+away\s+(?:her|his|their|my|our)[^\r\n]{0,40}(?:tool|welder|welding|equipment|instrument|machine)*generous opportunity**who needs a reliable**comprehensive set of tools**top-of-the-line machine*
any of:
body.current_thread.text matches any of 6 patterns
shipping (?:fee|cost|arrangement)(?:responsible|pay) for shippingno (?:local\s)?pick.?up(?:local\s)?pick.?up.{0,50}not availabledelivery onlymoving company
body.current_thread.text matches any of 9 patterns
* if you will take it ** or have someone ** indicate your interest ** to someone you know ** know someone who ** someone you know would ** someone who will ** someone who truly ** anyone you know *
body.current_thread.text matches any of 3 patterns
if you[^\r\n]{0,20}(?:(?:might|will|would) be|are)[^\r\n]{0,20}interested(?:any|some)one[^\r\n]{0,20}(is|will|would|might be)[^\r\n]{0,20}interestedwho (?:will|would|might) appreciate
any of:
any of
regex.extract(body.current_thread.text)where any holds:- strings.parse_email(.full_match).domain.domain in $free_email_providers
- strings.parse_email(.full_match).domain.root_domain in $free_email_providers
all of:
- length(headers.reply_to) > 0
- sender.email.email not in map(headers.reply_to, .email.email)
- length(recipients.to) is 0
- body.current_thread.text matches '(?:call|contact|text)[^\\r\\n]{0,50} at'
- body.current_thread.text matches '(?:private|personal|primary) (?:e-?)?mail'
- body.current_thread.text contains 'happy to answer any questions you may have'
- body.current_thread.text contains ' kindly '
- body.current_thread.text contains ' (kindly '
Inspects: body.current_thread.links, body.current_thread.text, headers.reply_to, headers.reply_to[].email.email, recipients.to, sender.email.email. Sensors: regex.extract, regex.icontains, strings.icontains, strings.ilike, strings.parse_email. Reference lists: $free_email_providers.
Indicators matched (56)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | (?:Miller|Lincoln\s*Electric|Hobart|ESAB|Fronius|Everlast|Hypertherm|Thermal\s*Dynamics)\s*[^\r\n]{0,50}(?:\bwelder\b|\bwelding\b|\bTIG\b|\bMIG\b|plasma\s*cutter) |
regex.icontains | regex | (?:\bwelder\b|\bwelding\b|\bTIG\b|\bMIG\b|plasma\s*cutter)\s*[^\r\n]{0,50}(?:Miller|Lincoln\s*Electric|Hobart|ESAB|Fronius|Everlast|Hypertherm|Thermal\s*Dynamics) |
regex.icontains | regex | (?:Caterpillar|\bCAT\b|John\s*Deere|Kubota|Bobcat|Honda|Generac|Stihl|Husqvarna|\bToro\b)\s*[^\r\n]{0,50}(?:\bgenerator\b|\bchainsaw\b|\bexcavator\b|\bskid\s*steer\b|\btractor\b|\bmower\b|\bloader\b|\bbackhoe\b) |
regex.icontains | regex | (?:welding\s*tools|power\s*tools|tool\s+(?:box|chest|set|kit|collection)|toolbox|toolchest)\s*[^\r\n]{0,50}(?:available|sale|rehome|gift|giving\s*away|free) |
regex.icontains | regex | (?:available|sale|rehome|gift|giving\s*away|free)\s*[^\r\n]{0,50}(?:welding\s*tools|power\s*tools|tool\s+(?:box|chest|set|kit|collection)|toolbox|toolchest) |
strings.ilike | substring | *welding tools* |
strings.ilike | substring | *tools and accessories* |
regex.extract | regex | (?i)(?:generator|refrigerator|trailer|tractor|lawnmower|mower|washer|dryer|freezer|treadmill|peloton|vanity|dresser|couch|sectional|kennel|mattress|bed\s*frame|hot\s*tub|golf\s*cart|tv|gazebo|loveseat|dishwasher|microwave|kitchenaid|rolex|watch|honda|toyota|ford|chevy|jeep|kubota|bobcat|polaris|kawasaki|macbook|iphone|playstation|ps5|xbox|canon|sony|dji|piano|keyboard|guitar|violin)\b[^\r\n]{0,30}(?:\(\s*\d{2,5}\s*\)|\$\s*\d{2,5}|\bfor\s+\$?\d{2,5}) |
regex.icontains | regex | late (?:husband|father|dad|wife|mother|mom) |
regex.icontains | regex | (?:husband|father|dad|wife|mother|mom)[^\r\n]{0,50}estate |
regex.icontains | regex | inherited instruments |
regex.icontains | regex | just lost (?:her|his|their) (?:husband|father|dad|wife|mother|mom) |
44 more
strings.ilike | substring | * downsizing * |
strings.ilike | substring | * relocating soon * |
strings.ilike | substring | * to relocate * |
strings.ilike | substring | *prepares to relocate* |
strings.ilike | substring | *relocate with*family* |
strings.ilike | substring | *sponsored*giveaway* |
strings.ilike | substring | *giveaway*sponsored* |
strings.ilike | substring | * generously offering * |
strings.ilike | substring | * generous offer * |
strings.ilike | substring | *a loving home* |
strings.ilike | substring | *a good home* |
strings.ilike | substring | *find a new home * |
strings.ilike | substring | *rehome these instruments * |
strings.ilike | substring | * free donation* |
regex.icontains | regex | giv\w+\s+away\s+(?:her|his|their|my|our)\s+(?:late|deceased|dad|father|mother|husband|wife) |
regex.icontains | regex | giv\w+\s+away\s+(?:her|his|their|my|our)[^\r\n]{0,40}(?:tool|welder|welding|equipment|instrument|machine) |
strings.ilike | substring | *generous opportunity* |
strings.ilike | substring | *who needs a reliable* |
strings.ilike | substring | *comprehensive set of tools* |
strings.ilike | substring | *top-of-the-line machine* |
regex.icontains | regex | shipping (?:fee|cost|arrangement) |
regex.icontains | regex | (?:responsible|pay) for shipping |
regex.icontains | regex | no (?:local\s)?pick.?up |
regex.icontains | regex | (?:local\s)?pick.?up.{0,50}not available |
regex.icontains | regex | delivery only |
regex.icontains | regex | moving company |
strings.ilike | substring | * if you will take it * |
strings.ilike | substring | * or have someone * |
strings.ilike | substring | * indicate your interest * |
strings.ilike | substring | * to someone you know * |
strings.ilike | substring | * know someone who * |
strings.ilike | substring | * someone you know would * |
strings.ilike | substring | * someone who will * |
strings.ilike | substring | * someone who truly * |
strings.ilike | substring | * anyone you know * |
regex.icontains | regex | if you[^\r\n]{0,20}(?:(?:might|will|would) be|are)[^\r\n]{0,20}interested |
regex.icontains | regex | (?:any|some)one[^\r\n]{0,20}(is|will|would|might be)[^\r\n]{0,20}interested |
regex.icontains | regex | who (?:will|would|might) appreciate |
regex.extract | regex | [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,} |
regex.icontains | regex | (?:call|contact|text)[^\r\n]{0,50} at |
regex.icontains | regex | (?:private|personal|primary) (?:e-?)?mail |
strings.icontains | substring | happy to answer any questions you may have |
strings.icontains | substring | kindly |
strings.icontains | substring | (kindly |
Stages and Predicates
Stage 1: mql_rule
and
or
and
or
body.current_thread.text regex_match "(?:husband|father|dad|wife|mother|mom)[^\\r\\n]{0,50}estate"
body.current_thread.text regex_match "late (?:husband|father|dad|wife|mother|mom)"
regex.extract(body.current_thread.text, '(?i)(?:generator|refrigerator|trailer|tractor|lawnmower|mower|washer|dryer|freezer|treadmill|peloton|vanity|dresser|couch|sectional|kennel|mattress|bed\\s*frame|hot\\s*tub|golf\\s*cart|tv|gazebo|loveseat|dishwasher|microwave|kitchenaid|rolex|watch|honda|toyota|ford|chevy|jeep|kubota|bobcat|polaris|kawasaki|macbook|iphone|playstation|ps5|xbox|canon|sony|dji|piano|keyboard|guitar|violin)\\b[^\\r\\n]{0,30}(?:\\(\\s*\\d{2,5}\\s*\\)|\\$\\s*\\d{2,5}|\\bfor\\s+\\$?\\d{2,5})') length_compare "5"
body.current_thread.text match "tools and accessories"
body.current_thread.text match "welding tools"
body.current_thread.text regex_match "(?:Caterpillar|\\bCAT\\b|John\\s*Deere|Kubota|Bobcat|Honda|Generac|Stihl|Husqvarna|\\bToro\\b)\\s*[^\\r\\n]{0,50}(?:\\bgenerator\\b|\\bchainsaw\\b|\\bexcavator\\b|\\bskid\\s*steer\\b|\\btractor\\b|\\bmower\\b|\\bloader\\b|\\bbackhoe\\b)"
body.current_thread.text regex_match "(?:Miller|Lincoln\\s*Electric|Hobart|ESAB|Fronius|Everlast|Hypertherm|Thermal\\s*Dynamics)\\s*[^\\r\\n]{0,50}(?:\\bwelder\\b|\\bwelding\\b|\\bTIG\\b|\\bMIG\\b|plasma\\s*cutter)"
body.current_thread.text regex_match "(?:\\bwelder\\b|\\bwelding\\b|\\bTIG\\b|\\bMIG\\b|plasma\\s*cutter)\\s*[^\\r\\n]{0,50}(?:Miller|Lincoln\\s*Electric|Hobart|ESAB|Fronius|Everlast|Hypertherm|Thermal\\s*Dynamics)"
body.current_thread.text regex_match "(?:available|sale|rehome|gift|giving\\s*away|free)\\s*[^\\r\\n]{0,50}(?:welding\\s*tools|power\\s*tools|tool\\s+(?:box|chest|set|kit|collection)|toolbox|toolchest)"
body.current_thread.text regex_match "(?:welding\\s*tools|power\\s*tools|tool\\s+(?:box|chest|set|kit|collection)|toolbox|toolchest)\\s*[^\\r\\n]{0,50}(?:available|sale|rehome|gift|giving\\s*away|free)"
or
any(regex.extract(body.current_thread.text))
or
strings.parse_email func_call "strings.parse_email(regex.extract(body.current_thread.text)[].full_match).domain.domain in free_email_providers"
strings.parse_email func_call "strings.parse_email(regex.extract(body.current_thread.text)[].full_match).domain.root_domain in free_email_providers"
and
headers.reply_to length_compare "0"
macro "sender.email.email not in map(headers.reply_to, .email.email)"
body.current_thread.text contains " (kindly "
body.current_thread.text contains " kindly "
body.current_thread.text contains "happy to answer any questions you may have"
body.current_thread.text match " anyone you know "
body.current_thread.text match " if you will take it "
body.current_thread.text match " indicate your interest "
body.current_thread.text match " know someone who "
body.current_thread.text match " or have someone "
body.current_thread.text match " someone who truly "
body.current_thread.text match " someone who will "
body.current_thread.text match " someone you know would "
body.current_thread.text match " to someone you know "
body.current_thread.text regex_match "(?:any|some)one[^\\r\\n]{0,20}(is|will|would|might be)[^\\r\\n]{0,20}interested"
body.current_thread.text regex_match "(?:call|contact|text)[^\\r\\n]{0,50} at"
body.current_thread.text regex_match "(?:local\\s)?pick.?up.{0,50}not available"
body.current_thread.text regex_match "(?:private|personal|primary) (?:e-?)?mail"
body.current_thread.text regex_match "(?:responsible|pay) for shipping"
body.current_thread.text regex_match "delivery only"
body.current_thread.text regex_match "if you[^\\r\\n]{0,20}(?:(?:might|will|would) be|are)[^\\r\\n]{0,20}interested"
body.current_thread.text regex_match "moving company"
body.current_thread.text regex_match "no (?:local\\s)?pick.?up"
body.current_thread.text regex_match "shipping (?:fee|cost|arrangement)"
body.current_thread.text regex_match "who (?:will|would|might) appreciate"
recipients.to length_compare "0"
or
body.current_thread.text match " downsizing "
body.current_thread.text match " free donation"
body.current_thread.text match " generous offer "
body.current_thread.text match " generously offering "
body.current_thread.text match " relocating soon "
body.current_thread.text match " to relocate "
body.current_thread.text match "a good home"
body.current_thread.text match "a loving home"
body.current_thread.text match "comprehensive set of tools"
body.current_thread.text match "find a new home "
body.current_thread.text match "generous opportunity"
body.current_thread.text match "prepares to relocate"
body.current_thread.text match "rehome these instruments "
body.current_thread.text match "top-of-the-line machine"
body.current_thread.text match "who needs a reliable"
body.current_thread.text regex_match "(?:husband|father|dad|wife|mother|mom)[^\\r\\n]{0,50}estate"
body.current_thread.text regex_match "giv\\w+\\s+away\\s+(?:her|his|their|my|our)[^\\r\\n]{0,40}(?:tool|welder|welding|equipment|instrument|machine)"
body.current_thread.text regex_match "giv\\w+\\s+away\\s+(?:her|his|their|my|our)\\s+(?:late|deceased|dad|father|mother|husband|wife)"
body.current_thread.text regex_match "inherited instruments"
body.current_thread.text regex_match "just lost (?:her|his|their) (?:husband|father|dad|wife|mother|mom)"
body.current_thread.text regex_match "late (?:husband|father|dad|wife|mother|mom)"
body.current_thread.text wildcard "*giveaway*sponsored*"
body.current_thread.text wildcard "*relocate with*family*"
body.current_thread.text wildcard "*sponsored*giveaway*"
body.current_thread.links length_compare "10"
body.current_thread.text length_compare "3000"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
body.current_thread.text | wildcard |
| field:"body.current_thread.text" kind:wildcard |
Scam: Piano giveaway
#This rule is designed to identify and mitigate a specific type of fraudulent activity commonly targeted at educational institutions. This rule operates by analyzing incoming email content for certain characteristics indicative of a scam involving the offer of a free piano, often framed within the context of downsizing or a giveaway.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Free email provider |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
length(body.links) < 10
and length(body.current_thread.text) < 2000
and (
// body detection
// be sure to update the attachment detection regexes too!
(
(
// items and brands
// Guitars
regex.icontains(body.current_thread.text,
'(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)\s*[^\r\n]{0,50}\s*guitar',
'guitar\s*[^\r\n]{0,50}\s*(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)',
)
// Piano/Keyboards
or regex.icontains(body.current_thread.text,
'(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?|\d{4})\s*[^\r\n]{0,50}(?:baby.grand|piano|baby.grand.piano|keyboard)',
'(?:baby.grand|piano|baby.grand.piano|keyboard)\s*[^\r\n]{0,50}(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?|\d{4})',
// strong indicators for generalized instrument
'(?:piano|keyboard)\s*[^\r\n]{0,50}(?:available|sale|rehome|gift)'
)
// Violins & Orchestral
or regex.icontains(body.current_thread.text,
'(?:Stradivarius|Guarneri|Yamaha|Stentor|Eastman|Cremona|Cecilio|Mendini)\s*[^\r\n]{0,50}(violin|viola|cello|celli)',
)
// brass/wind/woodwinds
or regex.icontains(body.current_thread.text,
'(?:Bach|Yamaha|Selmer|Conn|King|Jupiter|Buffet Crampon |Pearl)\s*[^\r\n]{0,50}(trombone|trumpet|saxophone|clarinet|flute)'
)
// generic
or strings.ilike(body.current_thread.text,
'* musical instruments *',
'* instrument as a gift*'
)
)
and (
// often a person is moving
strings.ilike(body.current_thread.text,
'* downsizing *',
'* relocating *',
'* to relocate *',
'* relocation *',
'* moving *'
)
or strings.ilike(body.current_thread.text,
'* give away*',
'* generously offering *',
'*a loving home*',
'*a good home*',
'*find a new home *',
'*rehome these instruments *',
'* free donation*',
'*free*member of the music community*'
)
// generally someone died
or regex.icontains(body.current_thread.text,
'inherited instruments',
'late (?:husband|father|dad|wife|mother|mom)',
'(?:husband|father|dad|wife|mother|mom)[^\r\n]{0,50}estate'
)
// passion/love for the item
or strings.ilike(body.current_thread.text,
'* genuinely cherish*',
'* cherished possessions*',
'* passionate instrument*',
'* music lover*',
'* had a passion for music*',
'* appreciates music*',
"* special piece*",
"* a lot of meaning*",
"* profound sentimental*",
'* will cherish*',
'* passion for music*',
'* treasured items *'
)
)
and (
// it talks about a shipping fee upfront
regex.icontains(body.current_thread.text,
'shipping (?:fee|cost|arrangement)',
'(?:responsible|pay) for shipping',
'no (?:local\s)?pick.?up',
'(?:local\s)?pick.?up.{0,50}not available',
'delivery only',
'moving company'
)
// recipient or someone they know might have an interest
or strings.ilike(body.current_thread.text,
'* if you will take it *',
'* or have someone *',
'* indicate your interest *',
'* to someone you know *',
'* know someone who *',
'* someone you know would *',
'* someone who will *',
'* someone who truly *',
'* anyone you know *',
)
or regex.icontains(body.current_thread.text,
'if you[^\r\n]{0,20}(?:(?:might|will|would) be|are)[^\r\n]{0,20}interested',
'(?:any|some)one[^\r\n]{0,20}(is|will|would|might be)[^\r\n]{0,20}interested',
'who (?:will|would|might) appreciate',
)
or (
// there's an email in the body
any(regex.extract(body.current_thread.text,
"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
),
strings.parse_email(.full_match).domain.domain in $free_email_providers
or strings.parse_email(.full_match).domain.root_domain in $free_email_providers
)
// reply-to doesn't match sender
or (
length(headers.reply_to) > 0
and sender.email.email not in map(headers.reply_to, .email.email)
)
// there are no recipients
or length(recipients.to) == 0
// redirects to a phone number
or regex.icontains(body.current_thread.text,
'(?:call|contact|text)[^\r\n]{0,50} at'
)
or regex.icontains(body.current_thread.text,
'(?:private|personal) (?:e-?)?mail'
)
or strings.icontains(body.current_thread.text, ' kindly ')
or strings.icontains(body.current_thread.text, ' (kindly ')
)
)
)
or (
any(filter(attachments, .size < 10000),
(
// items and brands
// Guitars
regex.icontains(file.parse_text(.).text,
'(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)\s*[^\r\n]{0,50}\s*guitar',
'guitar\s*[^\r\n]{0,50}\s*(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)',
)
// Piano/Keyboards
or regex.icontains(file.parse_text(.).text,
'(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?)\s*[^\r\n]{0,50}(?:baby.grand|piano|baby.grand.piano|keyboard)',
'(?:baby.grand|piano|baby.grand.piano|keyboard)\s*[^\r\n]{0,50}(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?|\d{4})',
// strong indicators for generalized instrument
'(?:piano|keyboard)\s*[^\r\n]{0,50}(?:available|sale|rehome|gift)'
)
// Violins & Orchestral
or regex.icontains(file.parse_text(.).text,
'(?:Stradivarius|Guarneri|Yamaha|Stentor|Eastman|Cremona|Cecilio|Mendini)\s*[^\r\n]{0,50}(violin|viola|cello|celli)',
)
// brass/wind/woodwinds
or regex.icontains(file.parse_text(.).text,
'(?:Bach|Yamaha|Selmer|Conn|King|Jupiter|Buffet Crampon |Pearl)\s*[^\r\n]{0,50}(trombone|trumpet|saxophone|clarinet|flute)'
)
// generic
or strings.ilike(file.parse_text(.).text,
'* musical instruments *',
'* instrument as a gift*'
)
)
and (
// often a person is moving
strings.ilike(file.parse_text(.).text,
'* downsizing *',
'* relocating *',
'* to relocate *',
'* relocation *',
)
or strings.ilike(file.parse_text(.).text,
'* give away*',
'* generously offering *',
'*a loving home*',
'*a good home*',
'*find a new home *',
'*rehome these instruments *',
'* free donation*',
'*free*member of the music community*'
)
// generally someone died
or regex.icontains(file.parse_text(.).text,
'inherited instruments',
'late (?:husband|father|dad|wife|mother|mom)',
'(?:husband|father|dad|wife|mother|mom)[^\r\n]{0,50}estate'
)
// passion/love for the item/music
or strings.ilike(file.parse_text(.).text,
'* genuinely cherish*',
'* cherished possessions*',
'* passionate instrument*',
'* music lover*',
'* had a passion for music*',
'* appreciates music*',
"* special piece*",
"* a lot of meaning*",
"* profound sentimental*",
'* will cherish*',
'* passion for music*',
'* treasured items *'
)
)
and (
// it talks about a shipping fee upfront
regex.icontains(file.parse_text(.).text,
'shipping (?:fee|cost|arrangement)',
'(?:responsible|pay) for shipping',
'no (?:local\s)?pick.?up',
'(?:local\s)?pick.?up.{0,50}not available',
'delivery only',
'moving company'
)
or strings.ilike(file.parse_text(.).text,
'* if you will take it *',
'* or have someone *',
'* indicate your interest *',
'* to someone you know *',
'* know someone who *',
'* someone you know would *',
'* someone who will *',
'* anyone you know *',
)
or regex.icontains(file.parse_text(.).text,
'if you[^\r\n]{0,20}(?:(?:might|will|would) be|are)[^\r\n]{0,20}interested',
'(?:any|some)one[^\r\n]{0,20}(is|will|would|might be)[^\r\n]{0,20}interested',
'who (?:will|would|might) appreciate',
)
// there's an email in the body
or any(regex.extract(file.parse_text(.).text,
"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
),
strings.parse_email(.full_match).domain.domain in $free_email_providers
or strings.parse_email(.full_match).domain.root_domain in $free_email_providers
)
// reply-to doesn't match sender
or (
length(headers.reply_to) > 0
and sender.email.email not in map(headers.reply_to, .email.email)
)
// there are no recipients
or length(recipients.to) == 0
// redirects to a phone number
or regex.icontains(file.parse_text(.).text,
'(?:call|contact|text)[^\r\n]{0,50} at'
)
or regex.icontains(file.parse_text(.).text,
'(?:private|personal) (?:e-?)?mail'
)
or strings.icontains(file.parse_text(.).text, ' kindly ')
or strings.icontains(file.parse_text(.).text, ' (kindly ')
)
)
)
)
// not high trust sender domains
and not (
sender.email.domain.root_domain in $high_trust_sender_root_domains
and headers.auth_summary.dmarc.pass
)
and not sender.email.domain.root_domain in (
'ridleyacademy.com', // person provides piano lessons and offers to give a Roland baby-grand away
'mountainpiano.com' // legitimate piano moving company in Denver
)
Detection logic
This rule is designed to identify and mitigate a specific type of fraudulent activity commonly targeted at educational institutions. This rule operates by analyzing incoming email content for certain characteristics indicative of a scam involving the offer of a free piano, often framed within the context of downsizing or a giveaway.
- length(body.links) < 10
- length(body.current_thread.text) < 2000
any of:
all of:
body.current_thread.text matches any of 9 patterns
(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)\s*[^\r\n]{0,50}\s*guitarguitar\s*[^\r\n]{0,50}\s*(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?|\d{4})\s*[^\r\n]{0,50}(?:baby.grand|piano|baby.grand.piano|keyboard)(?:baby.grand|piano|baby.grand.piano|keyboard)\s*[^\r\n]{0,50}(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?|\d{4})(?:piano|keyboard)\s*[^\r\n]{0,50}(?:available|sale|rehome|gift)(?:Stradivarius|Guarneri|Yamaha|Stentor|Eastman|Cremona|Cecilio|Mendini)\s*[^\r\n]{0,50}(violin|viola|cello|celli)(?:Bach|Yamaha|Selmer|Conn|King|Jupiter|Buffet Crampon |Pearl)\s*[^\r\n]{0,50}(trombone|trumpet|saxophone|clarinet|flute)* musical instruments ** instrument as a gift*
body.current_thread.text matches any of 28 patterns
* downsizing ** relocating ** to relocate ** relocation ** moving ** give away** generously offering **a loving home**a good home**find a new home **rehome these instruments ** free donation**free*member of the music community*inherited instrumentslate (?:husband|father|dad|wife|mother|mom)(?:husband|father|dad|wife|mother|mom)[^\r\n]{0,50}estate* genuinely cherish** cherished possessions** passionate instrument** music lover** had a passion for music** appreciates music** special piece** a lot of meaning** profound sentimental** will cherish** passion for music** treasured items *
any of:
body.current_thread.text matches any of 6 patterns
shipping (?:fee|cost|arrangement)(?:responsible|pay) for shippingno (?:local\s)?pick.?up(?:local\s)?pick.?up.{0,50}not availabledelivery onlymoving company
body.current_thread.text matches any of 9 patterns
* if you will take it ** or have someone ** indicate your interest ** to someone you know ** know someone who ** someone you know would ** someone who will ** someone who truly ** anyone you know *
body.current_thread.text matches any of 3 patterns
if you[^\r\n]{0,20}(?:(?:might|will|would) be|are)[^\r\n]{0,20}interested(?:any|some)one[^\r\n]{0,20}(is|will|would|might be)[^\r\n]{0,20}interestedwho (?:will|would|might) appreciate
any of:
any of
regex.extract(body.current_thread.text)where any holds:- strings.parse_email(.full_match).domain.domain in $free_email_providers
- strings.parse_email(.full_match).domain.root_domain in $free_email_providers
all of:
- length(headers.reply_to) > 0
- sender.email.email not in map(headers.reply_to, .email.email)
- length(recipients.to) is 0
- body.current_thread.text matches '(?:call|contact|text)[^\\r\\n]{0,50} at'
- body.current_thread.text matches '(?:private|personal) (?:e-?)?mail'
- body.current_thread.text contains ' kindly '
- body.current_thread.text contains ' (kindly '
any of
filter(attachments)where all hold:file.parse_text(.).text matches any of 9 patterns
(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)\s*[^\r\n]{0,50}\s*guitarguitar\s*[^\r\n]{0,50}\s*(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?)\s*[^\r\n]{0,50}(?:baby.grand|piano|baby.grand.piano|keyboard)(?:baby.grand|piano|baby.grand.piano|keyboard)\s*[^\r\n]{0,50}(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?|\d{4})(?:piano|keyboard)\s*[^\r\n]{0,50}(?:available|sale|rehome|gift)(?:Stradivarius|Guarneri|Yamaha|Stentor|Eastman|Cremona|Cecilio|Mendini)\s*[^\r\n]{0,50}(violin|viola|cello|celli)(?:Bach|Yamaha|Selmer|Conn|King|Jupiter|Buffet Crampon |Pearl)\s*[^\r\n]{0,50}(trombone|trumpet|saxophone|clarinet|flute)* musical instruments ** instrument as a gift*
file.parse_text(.).text matches any of 27 patterns
* downsizing ** relocating ** to relocate ** relocation ** give away** generously offering **a loving home**a good home**find a new home **rehome these instruments ** free donation**free*member of the music community*inherited instrumentslate (?:husband|father|dad|wife|mother|mom)(?:husband|father|dad|wife|mother|mom)[^\r\n]{0,50}estate* genuinely cherish** cherished possessions** passionate instrument** music lover** had a passion for music** appreciates music** special piece** a lot of meaning** profound sentimental** will cherish** passion for music** treasured items *
any of:
file.parse_text(.).text matches any of 6 patterns
shipping (?:fee|cost|arrangement)(?:responsible|pay) for shippingno (?:local\s)?pick.?up(?:local\s)?pick.?up.{0,50}not availabledelivery onlymoving company
file.parse_text(.).text matches any of 8 patterns
* if you will take it ** or have someone ** indicate your interest ** to someone you know ** know someone who ** someone you know would ** someone who will ** anyone you know *
file.parse_text(.).text matches any of 3 patterns
if you[^\r\n]{0,20}(?:(?:might|will|would) be|are)[^\r\n]{0,20}interested(?:any|some)one[^\r\n]{0,20}(is|will|would|might be)[^\r\n]{0,20}interestedwho (?:will|would|might) appreciate
any of
regex.extract(...)where any holds:- strings.parse_email(.full_match).domain.domain in $free_email_providers
- strings.parse_email(.full_match).domain.root_domain in $free_email_providers
all of:
- length(headers.reply_to) > 0
- sender.email.email not in map(headers.reply_to, .email.email)
- length(recipients.to) is 0
- file.parse_text(.).text matches '(?:call|contact|text)[^\\r\\n]{0,50} at'
- file.parse_text(.).text matches '(?:private|personal) (?:e-?)?mail'
- file.parse_text(.).text contains ' kindly '
- file.parse_text(.).text contains ' (kindly '
not:
all of:
- sender.email.domain.root_domain in $high_trust_sender_root_domains
- headers.auth_summary.dmarc.pass
not:
- sender.email.domain.root_domain in ('ridleyacademy.com', 'mountainpiano.com')
Inspects: attachments[].size, body.current_thread.text, body.links, headers.auth_summary.dmarc.pass, headers.reply_to, headers.reply_to[].email.email, recipients.to, sender.email.domain.root_domain, sender.email.email. Sensors: file.parse_text, regex.extract, regex.icontains, strings.icontains, strings.ilike, strings.parse_email. Reference lists: $free_email_providers, $high_trust_sender_root_domains.
Indicators matched (61)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | (?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)\s*[^\r\n]{0,50}\s*guitar |
regex.icontains | regex | guitar\s*[^\r\n]{0,50}\s*(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs) |
regex.icontains | regex | (?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?|\d{4})\s*[^\r\n]{0,50}(?:baby.grand|piano|baby.grand.piano|keyboard) |
regex.icontains | regex | (?:baby.grand|piano|baby.grand.piano|keyboard)\s*[^\r\n]{0,50}(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?|\d{4}) |
regex.icontains | regex | (?:piano|keyboard)\s*[^\r\n]{0,50}(?:available|sale|rehome|gift) |
regex.icontains | regex | (?:Stradivarius|Guarneri|Yamaha|Stentor|Eastman|Cremona|Cecilio|Mendini)\s*[^\r\n]{0,50}(violin|viola|cello|celli) |
regex.icontains | regex | (?:Bach|Yamaha|Selmer|Conn|King|Jupiter|Buffet Crampon |Pearl)\s*[^\r\n]{0,50}(trombone|trumpet|saxophone|clarinet|flute) |
strings.ilike | substring | * musical instruments * |
strings.ilike | substring | * instrument as a gift* |
strings.ilike | substring | * downsizing * |
strings.ilike | substring | * relocating * |
strings.ilike | substring | * to relocate * |
49 more
strings.ilike | substring | * relocation * |
strings.ilike | substring | * moving * |
strings.ilike | substring | * give away* |
strings.ilike | substring | * generously offering * |
strings.ilike | substring | *a loving home* |
strings.ilike | substring | *a good home* |
strings.ilike | substring | *find a new home * |
strings.ilike | substring | *rehome these instruments * |
strings.ilike | substring | * free donation* |
strings.ilike | substring | *free*member of the music community* |
regex.icontains | regex | inherited instruments |
regex.icontains | regex | late (?:husband|father|dad|wife|mother|mom) |
regex.icontains | regex | (?:husband|father|dad|wife|mother|mom)[^\r\n]{0,50}estate |
strings.ilike | substring | * genuinely cherish* |
strings.ilike | substring | * cherished possessions* |
strings.ilike | substring | * passionate instrument* |
strings.ilike | substring | * music lover* |
strings.ilike | substring | * had a passion for music* |
strings.ilike | substring | * appreciates music* |
strings.ilike | substring | * special piece* |
strings.ilike | substring | * a lot of meaning* |
strings.ilike | substring | * profound sentimental* |
strings.ilike | substring | * will cherish* |
strings.ilike | substring | * passion for music* |
strings.ilike | substring | * treasured items * |
regex.icontains | regex | shipping (?:fee|cost|arrangement) |
regex.icontains | regex | (?:responsible|pay) for shipping |
regex.icontains | regex | no (?:local\s)?pick.?up |
regex.icontains | regex | (?:local\s)?pick.?up.{0,50}not available |
regex.icontains | regex | delivery only |
regex.icontains | regex | moving company |
strings.ilike | substring | * if you will take it * |
strings.ilike | substring | * or have someone * |
strings.ilike | substring | * indicate your interest * |
strings.ilike | substring | * to someone you know * |
strings.ilike | substring | * know someone who * |
strings.ilike | substring | * someone you know would * |
strings.ilike | substring | * someone who will * |
strings.ilike | substring | * someone who truly * |
strings.ilike | substring | * anyone you know * |
regex.icontains | regex | if you[^\r\n]{0,20}(?:(?:might|will|would) be|are)[^\r\n]{0,20}interested |
regex.icontains | regex | (?:any|some)one[^\r\n]{0,20}(is|will|would|might be)[^\r\n]{0,20}interested |
regex.icontains | regex | who (?:will|would|might) appreciate |
regex.extract | regex | [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,} |
regex.icontains | regex | (?:call|contact|text)[^\r\n]{0,50} at |
regex.icontains | regex | (?:private|personal) (?:e-?)?mail |
strings.icontains | substring | kindly |
strings.icontains | substring | (kindly |
regex.icontains | regex | (?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?)\s*[^\r\n]{0,50}(?:baby.grand|piano|baby.grand.piano|keyboard) |
Stages and Predicates
Stage 1: mql_rule
and
or
any(filter(attachments))
and
or
any(regex.extract(...))
or
strings.parse_email func_call "strings.parse_email(regex.extract(...)[].full_match).domain.domain in free_email_providers"
strings.parse_email func_call "strings.parse_email(regex.extract(...)[].full_match).domain.root_domain in free_email_providers"
and
headers.reply_to length_compare "0"
macro "sender.email.email not in map(headers.reply_to, filter(attachments)[].email.email)"
file.parse_text(filter(attachments)[]).text contains " (kindly "
file.parse_text(filter(attachments)[]).text contains " kindly "
file.parse_text(filter(attachments)[]).text match " anyone you know "
file.parse_text(filter(attachments)[]).text match " if you will take it "
file.parse_text(filter(attachments)[]).text match " indicate your interest "
file.parse_text(filter(attachments)[]).text match " know someone who "
file.parse_text(filter(attachments)[]).text match " or have someone "
file.parse_text(filter(attachments)[]).text match " someone who will "
file.parse_text(filter(attachments)[]).text match " someone you know would "
file.parse_text(filter(attachments)[]).text match " to someone you know "
file.parse_text(filter(attachments)[]).text regex_match "(?:any|some)one[^\\r\\n]{0,20}(is|will|would|might be)[^\\r\\n]{0,20}interested"
file.parse_text(filter(attachments)[]).text regex_match "(?:call|contact|text)[^\\r\\n]{0,50} at"
file.parse_text(filter(attachments)[]).text regex_match "(?:local\\s)?pick.?up.{0,50}not available"
file.parse_text(filter(attachments)[]).text regex_match "(?:private|personal) (?:e-?)?mail"
file.parse_text(filter(attachments)[]).text regex_match "(?:responsible|pay) for shipping"
file.parse_text(filter(attachments)[]).text regex_match "delivery only"
file.parse_text(filter(attachments)[]).text regex_match "if you[^\\r\\n]{0,20}(?:(?:might|will|would) be|are)[^\\r\\n]{0,20}interested"
file.parse_text(filter(attachments)[]).text regex_match "moving company"
file.parse_text(filter(attachments)[]).text regex_match "no (?:local\\s)?pick.?up"
file.parse_text(filter(attachments)[]).text regex_match "shipping (?:fee|cost|arrangement)"
file.parse_text(filter(attachments)[]).text regex_match "who (?:will|would|might) appreciate"
recipients.to length_compare "0"
or
file.parse_text(filter(attachments)[]).text match " a lot of meaning"
file.parse_text(filter(attachments)[]).text match " appreciates music"
file.parse_text(filter(attachments)[]).text match " cherished possessions"
file.parse_text(filter(attachments)[]).text match " downsizing "
file.parse_text(filter(attachments)[]).text match " free donation"
file.parse_text(filter(attachments)[]).text match " generously offering "
file.parse_text(filter(attachments)[]).text match " genuinely cherish"
file.parse_text(filter(attachments)[]).text match " give away"
file.parse_text(filter(attachments)[]).text match " had a passion for music"
file.parse_text(filter(attachments)[]).text match " music lover"
file.parse_text(filter(attachments)[]).text match " passion for music"
file.parse_text(filter(attachments)[]).text match " passionate instrument"
file.parse_text(filter(attachments)[]).text match " profound sentimental"
file.parse_text(filter(attachments)[]).text match " relocating "
file.parse_text(filter(attachments)[]).text match " relocation "
file.parse_text(filter(attachments)[]).text match " special piece"
file.parse_text(filter(attachments)[]).text match " to relocate "
file.parse_text(filter(attachments)[]).text match " treasured items "
file.parse_text(filter(attachments)[]).text match " will cherish"
file.parse_text(filter(attachments)[]).text match "a good home"
file.parse_text(filter(attachments)[]).text match "a loving home"
file.parse_text(filter(attachments)[]).text match "find a new home "
file.parse_text(filter(attachments)[]).text match "rehome these instruments "
file.parse_text(filter(attachments)[]).text regex_match "(?:husband|father|dad|wife|mother|mom)[^\\r\\n]{0,50}estate"
file.parse_text(filter(attachments)[]).text regex_match "inherited instruments"
file.parse_text(filter(attachments)[]).text regex_match "late (?:husband|father|dad|wife|mother|mom)"
file.parse_text(filter(attachments)[]).text wildcard "*free*member of the music community*"
or
file.parse_text(filter(attachments)[]).text match " instrument as a gift"
file.parse_text(filter(attachments)[]).text match " musical instruments "
file.parse_text(filter(attachments)[]).text regex_match "(?:Bach|Yamaha|Selmer|Conn|King|Jupiter|Buffet Crampon |Pearl)\\s*[^\\r\\n]{0,50}(trombone|trumpet|saxophone|clarinet|flute)"
file.parse_text(filter(attachments)[]).text regex_match "(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)\\s*[^\\r\\n]{0,50}\\s*guitar"
file.parse_text(filter(attachments)[]).text regex_match "(?:Stradivarius|Guarneri|Yamaha|Stentor|Eastman|Cremona|Cecilio|Mendini)\\s*[^\\r\\n]{0,50}(violin|viola|cello|celli)"
file.parse_text(filter(attachments)[]).text regex_match "(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?)\\s*[^\\r\\n]{0,50}(?:baby.grand|piano|baby.grand.piano|keyboard)"
file.parse_text(filter(attachments)[]).text regex_match "(?:baby.grand|piano|baby.grand.piano|keyboard)\\s*[^\\r\\n]{0,50}(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?|\\d{4})"
file.parse_text(filter(attachments)[]).text regex_match "(?:piano|keyboard)\\s*[^\\r\\n]{0,50}(?:available|sale|rehome|gift)"
file.parse_text(filter(attachments)[]).text regex_match "guitar\\s*[^\\r\\n]{0,50}\\s*(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)"
and
or
any(regex.extract(body.current_thread.text))
or
strings.parse_email func_call "strings.parse_email(regex.extract(body.current_thread.text)[].full_match).domain.domain in free_email_providers"
strings.parse_email func_call "strings.parse_email(regex.extract(body.current_thread.text)[].full_match).domain.root_domain in free_email_providers"
and
headers.reply_to length_compare "0"
macro "sender.email.email not in map(headers.reply_to, .email.email)"
body.current_thread.text contains " (kindly "
body.current_thread.text contains " kindly "
body.current_thread.text match " anyone you know "
body.current_thread.text match " if you will take it "
body.current_thread.text match " indicate your interest "
body.current_thread.text match " know someone who "
body.current_thread.text match " or have someone "
body.current_thread.text match " someone who truly "
body.current_thread.text match " someone who will "
body.current_thread.text match " someone you know would "
body.current_thread.text match " to someone you know "
body.current_thread.text regex_match "(?:any|some)one[^\\r\\n]{0,20}(is|will|would|might be)[^\\r\\n]{0,20}interested"
body.current_thread.text regex_match "(?:call|contact|text)[^\\r\\n]{0,50} at"
body.current_thread.text regex_match "(?:local\\s)?pick.?up.{0,50}not available"
body.current_thread.text regex_match "(?:private|personal) (?:e-?)?mail"
body.current_thread.text regex_match "(?:responsible|pay) for shipping"
body.current_thread.text regex_match "delivery only"
body.current_thread.text regex_match "if you[^\\r\\n]{0,20}(?:(?:might|will|would) be|are)[^\\r\\n]{0,20}interested"
body.current_thread.text regex_match "moving company"
body.current_thread.text regex_match "no (?:local\\s)?pick.?up"
body.current_thread.text regex_match "shipping (?:fee|cost|arrangement)"
body.current_thread.text regex_match "who (?:will|would|might) appreciate"
recipients.to length_compare "0"
or
body.current_thread.text match " a lot of meaning"
body.current_thread.text match " appreciates music"
body.current_thread.text match " cherished possessions"
body.current_thread.text match " downsizing "
body.current_thread.text match " free donation"
body.current_thread.text match " generously offering "
body.current_thread.text match " genuinely cherish"
body.current_thread.text match " give away"
body.current_thread.text match " had a passion for music"
body.current_thread.text match " moving "
body.current_thread.text match " music lover"
body.current_thread.text match " passion for music"
body.current_thread.text match " passionate instrument"
body.current_thread.text match " profound sentimental"
body.current_thread.text match " relocating "
body.current_thread.text match " relocation "
body.current_thread.text match " special piece"
body.current_thread.text match " to relocate "
body.current_thread.text match " treasured items "
body.current_thread.text match " will cherish"
body.current_thread.text match "a good home"
body.current_thread.text match "a loving home"
body.current_thread.text match "find a new home "
body.current_thread.text match "rehome these instruments "
body.current_thread.text regex_match "(?:husband|father|dad|wife|mother|mom)[^\\r\\n]{0,50}estate"
body.current_thread.text regex_match "inherited instruments"
body.current_thread.text regex_match "late (?:husband|father|dad|wife|mother|mom)"
body.current_thread.text wildcard "*free*member of the music community*"
or
body.current_thread.text match " instrument as a gift"
body.current_thread.text match " musical instruments "
body.current_thread.text regex_match "(?:Bach|Yamaha|Selmer|Conn|King|Jupiter|Buffet Crampon |Pearl)\\s*[^\\r\\n]{0,50}(trombone|trumpet|saxophone|clarinet|flute)"
body.current_thread.text regex_match "(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)\\s*[^\\r\\n]{0,50}\\s*guitar"
body.current_thread.text regex_match "(?:Stradivarius|Guarneri|Yamaha|Stentor|Eastman|Cremona|Cecilio|Mendini)\\s*[^\\r\\n]{0,50}(violin|viola|cello|celli)"
body.current_thread.text regex_match "(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?|\\d{4})\\s*[^\\r\\n]{0,50}(?:baby.grand|piano|baby.grand.piano|keyboard)"
body.current_thread.text regex_match "(?:baby.grand|piano|baby.grand.piano|keyboard)\\s*[^\\r\\n]{0,50}(?:Yamaha|Kawai|Baldwin|Roland|Stei?nway(?: (?:&|and) Sons?)?|\\d{4})"
body.current_thread.text regex_match "(?:piano|keyboard)\\s*[^\\r\\n]{0,50}(?:available|sale|rehome|gift)"
body.current_thread.text regex_match "guitar\\s*[^\\r\\n]{0,50}\\s*(?:Gibson|Fender|Lowden|Martin|Taylor|Ibanez|Knaggs)"
not
and
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
not
sender.email.domain.root_domain in ["mountainpiano.com", "ridleyacademy.com"]
body.current_thread.text length_compare "2000"
body.links length_compare "10"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
headers.auth_summary.dmarc.pass | eq | true | excludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true" |
sender.email.domain.root_domain | in | mountainpiano.com, ridleyacademy.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"mountainpiano.com" field:"sender.email.domain.root_domain" value:"ridleyacademy.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
body.current_thread.text | wildcard |
| field:"body.current_thread.text" kind:wildcard |