Detection rules › Sublime MQL

Sublime MQL rules: brand

RuleSeverity
Body: PayApp transaction reference patternmedium
Brand impersonation: AARPmedium
Brand impersonation: Adobe Acrobat Sign PDF phishing file format templatehigh
Brand impersonation: Adobe Sign with suspicious indicatorshigh
Brand impersonation: AliExpressmedium
Brand impersonation: Amazon Web Services (AWS)medium
Brand impersonation: Aquentmedium
Brand impersonation: Automobile assistance associationshigh
Brand impersonation: Bids & Tendershigh
Brand impersonation: Booking.commedium
Brand Impersonation: Disneymedium
Brand impersonation: DocSendhigh
Brand impersonation: DocuSign PDF attachment with suspicious linkhigh
Brand impersonation: DocuSign with embedded QR codehigh
Brand impersonation: Enbridgemedium
Brand impersonation: Evitemedium
Brand impersonation: Fake procurement/RFQ PDF from energy and industrial companieshigh
Brand impersonation: Figma with malicious document access overlayhigh
Brand Impersonation: Gemini Trust Companymedium
Brand impersonation: GoDaddymedium
Brand impersonation: Google Careershigh
Brand impersonation: Google Meet with malicious linkmedium
Brand impersonation: Greenvelopemedium
Brand impersonation: Hulumedium
Brand impersonation: Interacmedium
Brand impersonation: Internal Revenue Servicehigh
Brand impersonation: KnowBe4medium
Brand impersonation: Mailchimpmedium
Brand impersonation: Marriott with gift languagemedium
Brand impersonation: McAfeemedium
Brand impersonation: MetaMaskhigh
Brand impersonation: Microsoft Planner with suspicious linkmedium
Brand impersonation: Morgan Stanleymedium
Brand impersonation: Navanmedium
Brand Impersonation: OpenAI with ChatGPT Ads lurehigh
Brand impersonation: Paperless Posthigh
Brand Impersonation: Procoremedium
Brand impersonation: Proofpoint secure messaging without legitimate indicatorshigh
Brand impersonation: Punchbowlmedium
Brand impersonation: Robert Halfmedium
Brand impersonation: Robinhoodmedium
Brand impersonation: SendGridmedium
Brand impersonation: SharePoint PDF attachment with credential theft languagemedium
Brand Impersonation: Sheinmedium
Brand impersonation: SiriusXMmedium
Brand impersonation: SoFimedium
Brand impersonation: Squaremedium
Brand impersonation: Squarespacemedium
Brand impersonation: State Farmmedium
Brand impersonation: Stripe notificationmedium
Brand impersonation: Survey request with credential theft indicatorsmedium
Brand impersonation: TikTokmedium
Brand impersonation: Toronto-Dominion Bankmedium
Brand impersonation: Trust Wallethigh
Brand impersonation: UK government Home Officehigh
Brand impersonation: Vanguardmedium
Brand impersonation: WeTransferhigh
Brand impersonation: Xodo Signmedium
Brand impersonation: Zoommedium
Brand impersonation: Zoom via HTML stylingmedium
Brand impersonation: Zoom via lookalike domainhigh
Brand impersonation: Zoom with deceptive link displaymedium
Callback scam: Impersonation via TimeTrade infrastructuremedium

Body: PayApp transaction reference pattern

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

Detects messages containing PayApp transaction reference numbers in a specific format (PayApp# followed by digits) in either the message body or subject line.

Threat classification

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

CategoryValues
Attack typesCallback Phishing, BEC/Fraud
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • subject
  • type

Rule body

type.inbound
and regex.icontains(body.current_thread.text, 'PayApp\s?#\d+')
and regex.icontains(body.current_thread.text, '[a-z0-9\.\+\-]+@[a-z0-9\-]+\.')
and strings.icontains(subject.base, "payapp")

Detection logic

Scope: inbound message.

Detects messages containing PayApp transaction reference numbers in a specific format (PayApp# followed by digits) in either the message body or subject line.

  1. inbound message
  2. body.current_thread.text matches 'PayApp\\s?#\\d+'
  3. body.current_thread.text matches '[a-z0-9\\.\\+\\-]+@[a-z0-9\\-]+\\.'
  4. subject.base contains 'payapp'

Inspects: body.current_thread.text, subject.base, type.inbound. Sensors: regex.icontains, strings.icontains.

Indicators matched (3)

FieldMatchValue
regex.icontainsregexPayApp\s?#\d+
regex.icontainsregex[a-z0-9\.\+\-]+@[a-z0-9\-]+\.
strings.icontainssubstringpayapp

Stages and Predicates

Stage 1: mql_rule

and
  body.current_thread.text regex_match "PayApp\\s?#\\d+"
  body.current_thread.text regex_match "[a-z0-9\\.\\+\\-]+@[a-z0-9\\-]+\\."
  subject.base contains "payapp"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: AARP

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

Detects messages impersonating AARP by analyzing sender display name and body content for AARP references, address information, or survey-related language from unauthorized senders.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Credential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and (
  (
    strings.icontains(sender.display_name, "AARP")
    and any(ml.nlu_classifier(body.current_thread.text).entities,
            .name in ("request", "financial")
            and regex.icontains(.text, "(?:gift|win|free|renewal)")
    )
  )
  or 2 of (
    strings.icontains(body.current_thread.text, 'AARP'),
    strings.icontains(body.current_thread.text, '601 E Street NW'),
    strings.icontains(body.current_thread.text, 'Washington, DC 20049')
  )
  or (
    strings.icontains(body.current_thread.text, 'AARP')
    and (
      regex.icontains(body.current_thread.text,
                      'quick .{0,10}survey',
                      '\bAAR-[A-Za-z0-9]{5,10}-[A-Za-z0-9]{3,8}' // member number regex
      )
      or strings.icontains(body.current_thread.text,
                           "last attempt",
                           "renewal is complete",
                           "select membership item"
      )
    )
  )
  //
  // 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 (
    strings.icontains(beta.ocr(file.message_screenshot()).text, "AARP")
    and strings.icontains(beta.ocr(file.message_screenshot()).text,
                          "join or renew now"
    )
    and strings.icontains(beta.ocr(file.message_screenshot()).text,
                          "to opt out"
    )
  )
)
// negate job postings related to AARP and newsletters containing AARP
and not any(ml.nlu_classifier(body.current_thread.text).topics,
            .name in (
              "Professional and Career Development",
              "Newsletters and Digests"
            )
            and .confidence == "high"
)
// and the sender is not in org_domains or from AARP domains and passes auth
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    sender.email.domain.root_domain in (
      "aarp.org",
      "proofpointessentials.com",
      "expedia.com",
      "eventbrite.com",
      "zixcorp.com"
    )
    and headers.auth_summary.dmarc.pass
  )
)

Detection logic

Scope: inbound message.

Detects messages impersonating AARP by analyzing sender display name and body content for AARP references, address information, or survey-related language from unauthorized senders.

  1. inbound message
  2. any of:
    • all of:
      • sender.display_name contains 'AARP'
      • any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
        • .name in ('request', 'financial')
        • .text matches '(?:gift|win|free|renewal)'
    • at least 2 of:
      • body.current_thread.text contains 'AARP'
      • body.current_thread.text contains '601 E Street NW'
      • body.current_thread.text contains 'Washington, DC 20049'
    • all of:
      • body.current_thread.text contains 'AARP'
      • any of:
        • body.current_thread.text matches any of 2 patterns
          • quick .{0,10}survey
          • \bAAR-[A-Za-z0-9]{5,10}-[A-Za-z0-9]{3,8}
        • body.current_thread.text contains any of 3 patterns
          • last attempt
          • renewal is complete
          • select membership item
    • all of:
      • beta.ocr(file.message_screenshot()).text contains 'AARP'
      • beta.ocr(file.message_screenshot()).text contains 'join or renew now'
      • beta.ocr(file.message_screenshot()).text contains 'to opt out'
  3. not:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name in ('Professional and Career Development', 'Newsletters and Digests')
      • .confidence is 'high'
  4. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • sender.email.domain.root_domain in ('aarp.org', 'proofpointessentials.com', 'expedia.com', 'eventbrite.com', 'zixcorp.com')
      • headers.auth_summary.dmarc.pass

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.nlu_classifier, regex.icontains, strings.icontains. Reference lists: $org_domains.

Indicators matched (13)

FieldMatchValue
strings.icontainssubstringAARP
ml.nlu_classifier(body.current_thread.text).entities[].namememberrequest
ml.nlu_classifier(body.current_thread.text).entities[].namememberfinancial
regex.icontainsregex(?:gift|win|free|renewal)
strings.icontainssubstring601 E Street NW
strings.icontainssubstringWashington, DC 20049
regex.icontainsregexquick .{0,10}survey
regex.icontainsregex\bAAR-[A-Za-z0-9]{5,10}-[A-Za-z0-9]{3,8}
strings.icontainssubstringlast attempt
strings.icontainssubstringrenewal is complete
strings.icontainssubstringselect membership item
strings.icontainssubstringjoin or renew now
1 more
strings.icontainssubstringto opt out

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      any(ml.nlu_classifier(body.current_thread.text).entities)
        and
          ml.nlu_classifier(body.current_thread.text).entities.name in ["financial", "request"]
          ml.nlu_classifier(body.current_thread.text).entities.text regex_match "(?:gift|win|free|renewal)"
      sender.display_name contains "AARP"
    and
      or
        body.current_thread.text contains "last attempt"
        body.current_thread.text contains "renewal is complete"
        body.current_thread.text contains "select membership item"
        body.current_thread.text regex_match "\\bAAR-[A-Za-z0-9]{5,10}-[A-Za-z0-9]{3,8}"
        body.current_thread.text regex_match "quick .{0,10}survey"
      body.current_thread.text contains "AARP"
    and
      beta.ocr(file.message_screenshot()).text contains "AARP"
      beta.ocr(file.message_screenshot()).text contains "join or renew now"
      beta.ocr(file.message_screenshot()).text contains "to opt out"
    body.current_thread.text contains "601 E Street NW"
    body.current_thread.text contains "AARP"
    body.current_thread.text contains "Washington, DC 20049"
  not
    or
      and
        headers.auth_summary.dmarc.pass eq "true"
        sender.email.domain.root_domain in ["aarp.org", "eventbrite.com", "expedia.com", "proofpointessentials.com", "zixcorp.com"]
       macro "sender.email.domain.root_domain in org_domains"
  not
    any(ml.nlu_classifier(body.current_thread.text).topics)
      and
        ml.nlu_classifier(body.current_thread.text).topics.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).topics.name in ["Newsletters and Digests", "Professional and Career Development"]
  type.inbound eq "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_domaininaarp.org, eventbrite.com, expedia.com, proofpointessentials.com, zixcorp.comexcludes:sender.email.domain.root_domain
ml.nlu_classifier(body.current_thread.text).topicsarray_any(no value, null check)excludes:ml.nlu_classifier(body.current_thread.text).topics

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
beta.ocr(file.message_screenshot()).textcontains
  • AARP
  • join or renew now
  • to opt out
field:"beta.ocr(file.message_screenshot()).text" kind:contains
body.current_thread.textcontains
  • 601 E Street NW
  • AARP
  • Washington, DC 20049
  • last attempt
  • renewal is complete
  • select membership item
field:"body.current_thread.text" kind:contains
body.current_thread.textregex_match
  • \bAAR-[A-Za-z0-9]{5,10}-[A-Za-z0-9]{3,8}
  • quick .{0,10}survey
field:"body.current_thread.text" kind:regex_match
sender.display_namecontains
  • AARP
field:"sender.display_name" kind:contains value:"AARP"
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Adobe Acrobat Sign PDF phishing file format template

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

Detects specific credential phishing PDF attachments that contain Adobe branding or Adobe Acrobat Sign text along with specific file format indicators, potentially indicating fraudulent documents impersonating legitimate Adobe services.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, PDF

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • attachments
  • type

Rule body

type.inbound
and any(filter(attachments, .file_type == "pdf"),
        (
          any(ml.logo_detect(.).brands, .name == "Adobe")
          or strings.icontains(beta.ocr(.).text,
                               'Powered by Adobe Acrobat Sign'
          )
          or strings.icontains(beta.ocr(.).text, 'Adobe Acrobat Sign')
        )
        and strings.icontains(beta.ocr(.).text, 'File Format: PDF')
)

Detection logic

Scope: inbound message.

Detects specific credential phishing PDF attachments that contain Adobe branding or Adobe Acrobat Sign text along with specific file format indicators, potentially indicating fraudulent documents impersonating legitimate Adobe services.

  1. inbound message
  2. any of filter(attachments) where all hold:
    • any of:
      • any of ml.logo_detect(.).brands where:
        • .name is 'Adobe'
      • beta.ocr(.).text contains 'Powered by Adobe Acrobat Sign'
      • beta.ocr(.).text contains 'Adobe Acrobat Sign'
    • beta.ocr(.).text contains 'File Format: PDF'

Inspects: attachments[].file_type, type.inbound. Sensors: beta.ocr, ml.logo_detect, strings.icontains.

Indicators matched (5)

FieldMatchValue
attachments[].file_typeequalspdf
ml.logo_detect(filter(attachments)[]).brands[].nameequalsAdobe
strings.icontainssubstringPowered by Adobe Acrobat Sign
strings.icontainssubstringAdobe Acrobat Sign
strings.icontainssubstringFile Format: PDF

Stages and Predicates

Stage 1: mql_rule

and
  any(filter(attachments))
    and
      or
        any(ml.logo_detect(filter(attachments)).brands)
          ml.logo_detect(filter(attachments)).brands.name eq "Adobe"
        beta.ocr(filter(attachments)[]).text contains "Adobe Acrobat Sign"
        beta.ocr(filter(attachments)[]).text contains "Powered by Adobe Acrobat Sign"
      beta.ocr(filter(attachments)[]).text contains "File Format: PDF"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Adobe Sign with suspicious indicators

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

Detects messages impersonating Adobe Sign that contain Adobe branding elements but are not sent from legitimate Adobe domains and lack proper Adobe Sign authentication headers.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • attachments
  • body
  • body.html
  • body.links
  • body.previous_threads
  • headers
  • headers.auth_summary
  • headers.hops
  • recipients
  • recipients.to
  • sender.email
  • type

Rule body

type.inbound
and (
  (
    length(filter(attachments, .file_type == "pdf")) == 0
    and (
      regex.icontains(body.html.raw,
                      'alt="Adobe(?: Acrobat)? Sign"',
                      "adobe-sign-logo.{0,20}.png",
                      'alt="Powered by Adobe Acrobat Sign"'
      )
      or any(html.xpath(body.html, "//img/@src").nodes,
             strings.parse_url(.raw).domain.root_domain == "adobesign.com"
             and (
               strings.istarts_with(strings.parse_url(.raw).path,
                                    "/cobrand_logo/"
               )
               or strings.icontains(strings.parse_url(.raw).path,
                                    "checkmarkCircle"
               )
             )
      )
    )
  )
  or (
    any(attachments,
        .file_type == "pdf"
        and any(file.explode(.),
                any(.scan.url.urls,
                    regex.icontains(.url,
                                    '(?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn)'
                    )
                )
        )
    )
  )
)
and not (
  // inspect the "oldest" thread, negate where that thread is the original Adobe Sign email (based on link domains)
  (
    length(body.previous_threads[length(body.previous_threads) - 1].links) > 0
    and all(body.previous_threads[length(body.previous_threads) - 1].links,
            .href_url.domain.root_domain in (
              "aka.ms",
              "adobe.com",
              "adobesign.com",
              "echosign.com",
              "adobesignsandbox.com",
              "mimecastprotect.com",
              "mimecast.com"
            )
            or .href_url.domain.root_domain in $org_domains
            or .href_url.domain.root_domain == sender.email.domain.root_domain
            or any(recipients.to,
                   .email.domain.root_domain == ..href_url.domain.root_domain
            )
    )
  )
  // legit review button
  or any(body.links,
         .display_text in (
           "Review and sign",
           "the document",
           "Open agreement",
           "VIEW DOCUMENTS",
           "Click here to review and sign"
         )
         and (
           .href_url.domain.root_domain in (
             "adobe.com",
             "adobesign.com",
             "echosign.com",
             "adobesignsandbox.com",
           )
           // Mimecast link logic
           or (
             .href_url.domain.root_domain in (
               "mimecastprotect.com",
               "mimecast.com"
             )
             and any(.href_url.query_params_decoded['domain'],
                     strings.parse_domain(.).root_domain in (
                       "adobe.com",
                       "adobesign.com",
                       "echosign.com",
                       "adobesignsandbox.com",
                     )
             )
           )
         )
  )
  // accidental recipient
  or any(recipients.to, .email.email == "adobesign@adobesign.com")
  // known Adobe Sign messaage ID formats
  or (
    (length(headers.references) > 1 or length(body.previous_threads) != 0)
    and regex.imatch(headers.references[0],
                     '[0-9]{9,10}\.[0-9]{4,6}\.[0-9]{13}@event-consumer-prod-[a-z]-[a-z0-9]{7,10}-[a-z0-9]{5}',
                     '[0-9]{8,10}\.[0-9]{5,7}\.[0-9]{13}@(webapp|job)-prod-.*$',
                     '[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-APO-PRODHIPAA@apo-p-h'
    )
  )
  // negate Adobe Sign messages from custom domains
  or any(headers.hops,
         any(.fields, .name in ("Adobesigneventid", "Agreementid"))
  )
)
and not (
  sender.email.domain.root_domain in (
    "adobe.com",
    "adobesign.com",
    "adobesignsandbox.com",
    "echosign.com",
    // ticketing software that embeds emails
    "helpscout.net"
  )
  and headers.auth_summary.dmarc.pass
)
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 impersonating Adobe Sign that contain Adobe branding elements but are not sent from legitimate Adobe domains and lack proper Adobe Sign authentication headers.

  1. inbound message
  2. any of:
    • all of:
      • length(filter(attachments, .file_type == 'pdf')) is 0
      • any of:
        • body.html.raw matches any of 3 patterns
          • alt="Adobe(?: Acrobat)? Sign"
          • adobe-sign-logo.{0,20}.png
          • alt="Powered by Adobe Acrobat Sign"
        • any of html.xpath(body.html, '//img/@src').nodes where all hold:
          • strings.parse_url(.raw).domain.root_domain is 'adobesign.com'
          • any of:
            • strings.parse_url(.raw).path starts with '/cobrand_logo/'
            • strings.parse_url(.raw).path contains 'checkmarkCircle'
    • any of attachments where all hold:
      • .file_type is 'pdf'
      • any of file.explode(.) where:
        • any of .scan.url.urls where:
          • .url matches '(?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn)'
  3. none of:
    • all of:
      • length(body.previous_threads[].links) > 0
      • all of body.previous_threads[].links where any holds:
        • .href_url.domain.root_domain in ('aka.ms', 'adobe.com', 'adobesign.com', 'echosign.com', 'adobesignsandbox.com', 'mimecastprotect.com', 'mimecast.com')
        • .href_url.domain.root_domain in $org_domains
        • .href_url.domain.root_domain is sender.email.domain.root_domain
        • any of recipients.to where:
          • .email.domain.root_domain is .href_url.domain.root_domain
    • any of body.links where all hold:
      • .display_text in ('Review and sign', 'the document', 'Open agreement', 'VIEW DOCUMENTS', 'Click here to review and sign')
      • any of:
        • .href_url.domain.root_domain in ('adobe.com', 'adobesign.com', 'echosign.com', 'adobesignsandbox.com')
        • all of:
          • .href_url.domain.root_domain in ('mimecastprotect.com', 'mimecast.com')
          • any of .href_url.query_params_decoded['domain'] where:
            • strings.parse_domain(.).root_domain in ('adobe.com', 'adobesign.com', 'echosign.com', 'adobesignsandbox.com')
    • any of recipients.to where:
      • .email.email is 'adobesign@adobesign.com'
    • all of:
      • any of:
        • length(headers.references) > 1
        • length(body.previous_threads) is not 0
      • headers.references[0] matches any of 3 patterns
        • [0-9]{9,10}\.[0-9]{4,6}\.[0-9]{13}@event-consumer-prod-[a-z]-[a-z0-9]{7,10}-[a-z0-9]{5}
        • [0-9]{8,10}\.[0-9]{5,7}\.[0-9]{13}@(webapp|job)-prod-.*$
        • [a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-APO-PRODHIPAA@apo-p-h
    • any of headers.hops where:
      • any of .fields where:
        • .name in ('Adobesigneventid', 'Agreementid')
  4. not:
    • all of:
      • sender.email.domain.root_domain in ('adobe.com', 'adobesign.com', 'adobesignsandbox.com', 'echosign.com', 'helpscout.net')
      • headers.auth_summary.dmarc.pass
  5. 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: attachments[].file_type, body.html, body.html.raw, body.links, body.links[].display_text, body.links[].href_url.domain.root_domain, body.links[].href_url.query_params_decoded['domain'], body.previous_threads, body.previous_threads[].links, body.previous_threads[].links[].href_url.domain.root_domain, headers.auth_summary.dmarc.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.references, headers.references[0], recipients.to, recipients.to[].email.domain.root_domain, recipients.to[].email.email, sender.email.domain.root_domain, type.inbound. Sensors: file.explode, html.xpath, regex.icontains, regex.imatch, strings.icontains, strings.istarts_with, strings.parse_domain, strings.parse_url. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (7)

FieldMatchValue
attachments[].file_typeequalspdf
regex.icontainsregexalt="Adobe(?: Acrobat)? Sign"
regex.icontainsregexadobe-sign-logo.{0,20}.png
regex.icontainsregexalt="Powered by Adobe Acrobat Sign"
strings.istarts_withprefix/cobrand_logo/
strings.icontainssubstringcheckmarkCircle
regex.icontainsregex(?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn)

Stages and Predicates

Stage 1: mql_rule

and
  not
    or
      any(body.links)
        and
          or
            and
              any(body.links.href_url.query_params_decoded['domain'])
                strings.parse_domain func_call "strings.parse_domain(body.links[].href_url.query_params_decoded['domain'][]).root_domain in (adobe.com, adobesign.com, echosign.com, adobesignsandbox.com)"
              body.links.href_url.domain.root_domain in ["mimecast.com", "mimecastprotect.com"]
            body.links.href_url.domain.root_domain in ["adobe.com", "adobesign.com", "adobesignsandbox.com", "echosign.com"]
          body.links.display_text in ["Click here to review and sign", "Open agreement", "Review and sign", "VIEW DOCUMENTS", "the document"]
      and
        or
          body.previous_threads length_compare "0"
          headers.references length_compare "1"
        or
          headers.references[0] regex_match "[0-9]{8,10}\\.[0-9]{5,7}\\.[0-9]{13}@(webapp|job)-prod-.*$"
          headers.references[0] regex_match "[0-9]{9,10}\\.[0-9]{4,6}\\.[0-9]{13}@event-consumer-prod-[a-z]-[a-z0-9]{7,10}-[a-z0-9]{5}"
          headers.references[0] regex_match "[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-APO-PRODHIPAA@apo-p-h"
      any(headers.hops)
        any(headers.hops.fields)
          headers.hops.fields.name in ["Adobesigneventid", "Agreementid"]
      and
        body.previous_threads[].links length_compare "0"
         macro "all(body.previous_threads[].links)"
      any(recipients.to)
        recipients.to.email.email eq "adobesign@adobesign.com"
  or
    and
      or
        any(html.xpath(body.html, '//img/@src').nodes)
          and
            or
              strings.parse_url(html.xpath(body.html, '//img/@src').nodes[].raw).path contains "checkmarkCircle"
              strings.parse_url(html.xpath(body.html, '//img/@src').nodes[].raw).path starts_with "/cobrand_logo/"
            strings.parse_url func_call "strings.parse_url(html.xpath(body.html, '//img/@src').nodes[].raw).domain.root_domain == adobesign.com"
        body.html.raw regex_match "adobe-sign-logo.{0,20}.png"
        body.html.raw regex_match "alt=\"Adobe(?: Acrobat)? Sign\""
        body.html.raw regex_match "alt=\"Powered by Adobe Acrobat Sign\""
      filter(attachments, .file_type == 'pdf') length_compare "0"
    any(attachments)
      and
        any(file.explode(attachments))
          any(file.explode(attachments).scan.url.urls)
            file.explode(attachments).scan.url.urls.url regex_match "(?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn)"
        attachments.file_type eq "pdf"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["adobe.com", "adobesign.com", "adobesignsandbox.com", "echosign.com", "helpscout.net"]
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
body.linksarray_any(no value, null check)excludes:body.links
body.previous_threadslength_compare0excludes:body.previous_threads field:"body.previous_threads" value:"0"
headers.referenceslength_compare1excludes:headers.references field:"headers.references" value:"1"
headers.references[0]regex_match[0-9]{8,10}.[0-9]{5,7}.[0-9]{13}@(webapp|job)-prod-.*$excludes:headers.references[0] field:"headers.references[0]" value:"[0-9]{8,10}.[0-9]{5,7}.[0-9]{13}@(webapp|job)-prod-.*$"
headers.references[0]regex_match[0-9]{9,10}.[0-9]{4,6}.[0-9]{13}@event-consumer-prod-[a-z]-[a-z0-9]{7,10}-[a-z0-9]{5}excludes:headers.references[0] field:"headers.references[0]" value:"[0-9]{9,10}.[0-9]{4,6}.[0-9]{13}@event-consumer-prod-[a-z]-[a-z0-9]{7,10}-[a-z0-9]{5}"
headers.references[0]regex_match[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-APO-PRODHIPAA@apo-p-hexcludes:headers.references[0] field:"headers.references[0]" value:"[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-APO-PRODHIPAA@apo-p-h"
headers.hopsarray_any(no value, null check)excludes:headers.hops
body.previous_threads[].linkslength_compare0excludes:body.previous_threads[].links field:"body.previous_threads[].links" value:"0"
recipients.toarray_any(no value, null check)excludes:recipients.to
headers.auth_summary.dmarc.passeqtrueexcludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true"
sender.email.domain.root_domaininadobe.com, adobesign.com, adobesignsandbox.com, echosign.com, helpscout.netexcludes:sender.email.domain.root_domain

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.html.rawregex_match
  • adobe-sign-logo.{0,20}.png
  • alt="Adobe(?: Acrobat)? Sign"
  • alt="Powered by Adobe Acrobat Sign"
field:"body.html.raw" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: AliExpress

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

Detects messages impersonating AliExpress by matching known footer text and social media links, while confirming the sender is not legitimately from AliExpress or its infrastructure.

Threat classification

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

CategoryValues
Attack typesCallback Phishing, Credential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.links
  • headers
  • headers.auth_summary
  • headers.domains
  • sender.email
  • type

Rule body

type.inbound
and (
  // the address in the footer
  strings.icontains(body.current_thread.text,
                    '26/F Tower One, Times Square, 1 Matheson Street, Causeway Bay'
  )
  // the social links in the footer
  or (
    length(filter(body.links,
                  strings.icontains(.href_url.url,
                                    'https://www.facebook.com/aliexpressbr'
                  )
                  or strings.icontains(.href_url.url,
                                       'https://twitter.com/aliexpressbr'
                  )
                  or strings.icontains(.href_url.url,
                                       'https://www.youtube.com/user/AliExpressChannel'
                  )
                  or strings.icontains(.href_url.url,
                                       'https://www.instagram.com/aliexpressbr'
                  )
                  // whatsapp
                  or strings.icontains(.href_url.url,
                                       'https://wa.me/8657186563839'
                  )
                  // messenger
                  or strings.icontains(.href_url.url, 'https://m.me/AliExpress')
           )
    ) >= 4
  )
)
// not from AliExpress or Alibaba
and not (
  sender.email.domain.root_domain in ("aliexpress.com", "alibaba.com")
  and headers.auth_summary.dmarc.pass
)
// did not traverse the parent org's mail server
and not (any(headers.domains, .root_domain in ('aliyun-inc.com')))

Detection logic

Scope: inbound message.

Detects messages impersonating AliExpress by matching known footer text and social media links, while confirming the sender is not legitimately from AliExpress or its infrastructure.

  1. inbound message
  2. any of:
    • body.current_thread.text contains '26/F Tower One, Times Square, 1 Matheson Street, Causeway Bay'
    • length(filter(body.links, strings.icontains(.href_url.url, 'https://www.facebook.com/aliexpressbr') or strings.icontains(.href_url.url, 'https://twitter.com/aliexpressbr') or strings.icontains(.href_url.url, 'https://www.youtube.com/user/AliExpressChannel') or strings.icontains(.href_url.url, 'https://www.instagram.com/aliexpressbr') or strings.icontains(.href_url.url, 'https://wa.me/8657186563839') or strings.icontains(.href_url.url, 'https://m.me/AliExpress'))) ≥ 4
  3. not:
    • all of:
      • sender.email.domain.root_domain in ('aliexpress.com', 'alibaba.com')
      • headers.auth_summary.dmarc.pass
  4. not:
    • any of headers.domains where:
      • .root_domain in ('aliyun-inc.com')

Inspects: body.current_thread.text, body.links, body.links[].href_url.url, headers.auth_summary.dmarc.pass, headers.domains, headers.domains[].root_domain, sender.email.domain.root_domain, type.inbound. Sensors: strings.icontains.

Indicators matched (7)

FieldMatchValue
strings.icontainssubstring26/F Tower One, Times Square, 1 Matheson Street, Causeway Bay
strings.icontainssubstringhttps://www.facebook.com/aliexpressbr
strings.icontainssubstringhttps://twitter.com/aliexpressbr
strings.icontainssubstringhttps://www.youtube.com/user/AliExpressChannel
strings.icontainssubstringhttps://www.instagram.com/aliexpressbr
strings.icontainssubstringhttps://wa.me/8657186563839
strings.icontainssubstringhttps://m.me/AliExpress

Stages and Predicates

Stage 1: mql_rule

and
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["alibaba.com", "aliexpress.com"]
  not
    any(headers.domains)
      headers.domains.root_domain eq "aliyun-inc.com"
  or
    body.current_thread.text contains "26/F Tower One, Times Square, 1 Matheson Street, Causeway Bay"
    filter(body.links, strings.icontains(.href_url.url, 'https://www.facebook.com/aliexpressbr') or strings.icontains(.href_url.url, 'https://twitter.com/aliexpressbr') or strings.icontains(.href_url.url, 'https://www.youtube.com/user/AliExpressChannel') or strings.icontains(.href_url.url, 'https://www.instagram.com/aliexpressbr') or strings.icontains(.href_url.url, 'https://wa.me/8657186563839') or strings.icontains(.href_url.url, 'https://m.me/AliExpress')) length_compare "4"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Amazon Web Services (AWS)

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

Detects messages impersonating AWS through similar display names combined with security-themed content and authentication failures. Excludes legitimate AWS communications and trusted senders.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and regex.icontains(strings.replace_confusables(sender.display_name),
                    '\baws\b|amazon web services|\bses\b'
)
and (
  // ML Topic Analysis and Credential Theft Detection
  any(ml.nlu_classifier(body.current_thread.text).topics,
      .name in ("Security and Authentication", "Secure Message")
      and .confidence == "high"
  )
  or (
    beta.ocr(file.message_screenshot()).text != ""
    and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
            .name in ("Security and Authentication", "Secure Message")
            and .confidence == "high"
    )
  )
  or any(ml.nlu_classifier(body.current_thread.text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
  or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
)
// Not from legitimate AWS domains
// there was a DMARC check here, but a lot of users send AWS notifications to groups/mailing lists that breaks DMARC
and not (
  sender.email.domain.root_domain in $org_domains
  or sender.email.domain.root_domain in (
    "amazon.com",
    "amazonaws.com",
    "amazonses.com",
    "awsevents.com",
    "awsmp-seller-conference.com",
    "aws-experience.com",
    "marketplace.aws",
    "aws.com",
    "amazonaws.cn",
    "repost.aws",
    "awscustomercouncil.com",
    "airtableemail.com", // used for re:Invent
    "nmls.org", // "state examination system", realtor software
    "mktgcampaigns.com", // Elastic + AWS co-marketing emails
    "awseducate.com",
    "awsacademy.com"
  )
  or sender.email.domain.tld == "local"
)
// 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
)
// sender email specific
and not (
  profile.by_sender_email().solicited
  // sender domain specific
  or (
    profile.by_sender().solicited
    // 30 day decay
    and (profile.by_sender().days_since.last_contact < 30)
  )
)

Detection logic

Scope: inbound message.

Detects messages impersonating AWS through similar display names combined with security-themed content and authentication failures. Excludes legitimate AWS communications and trusted senders.

  1. inbound message
  2. strings.replace_confusables(sender.display_name) matches '\\baws\\b|amazon web services|\\bses\\b'
  3. any of:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name in ('Security and Authentication', 'Secure Message')
      • .confidence is 'high'
    • all of:
      • beta.ocr(file.message_screenshot()).text is not ''
      • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message')
        • .confidence is 'high'
    • 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(beta.ocr(file.message_screenshot()).text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence is 'high'
  4. none of:
    • sender.email.domain.root_domain in $org_domains
    • sender.email.domain.root_domain in ('amazon.com', 'amazonaws.com', 'amazonses.com', 'awsevents.com', 'awsmp-seller-conference.com', 'aws-experience.com', 'marketplace.aws', 'aws.com', 'amazonaws.cn', 'repost.aws', 'awscustomercouncil.com', 'airtableemail.com', 'nmls.org', 'mktgcampaigns.com', 'awseducate.com', 'awsacademy.com')
    • sender.email.domain.tld is 'local'
  5. 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
  6. none of:
    • profile.by_sender_email().solicited
    • all of:
      • profile.by_sender().solicited
      • profile.by_sender().days_since.last_contact < 30

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, sender.email.domain.tld, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.nlu_classifier, profile.by_sender, profile.by_sender_email, regex.icontains, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (11)

FieldMatchValue
regex.icontainsregex\baws\b|amazon web services|\bses\b
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecure Message
ml.nlu_classifier(body.current_thread.text).topics[].confidenceequalshigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecure Message
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidenceequalshigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].nameequalscred_theft
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].confidenceequalshigh

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
        and
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence eq "high"
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Secure Message", "Security and Authentication"]
      beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
    any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
      and
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).topics)
      and
        ml.nlu_classifier(body.current_thread.text).topics.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).topics.name in ["Secure Message", "Security and Authentication"]
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  not
    or
      and
        profile.by_sender func_call "profile.by_sender().days_since.last_contact < 30"
        profile.by_sender func_call "profile.by_sender().solicited"
      profile.by_sender_email func_call "profile.by_sender_email().solicited"
  not
    or
      sender.email.domain.root_domain in ["airtableemail.com", "amazon.com", "amazonaws.cn", "amazonaws.com", "amazonses.com", "aws-experience.com", "aws.com", "awsacademy.com", "awscustomercouncil.com", "awseducate.com", "awsevents.com", "awsmp-seller-conference.com", "marketplace.aws", "mktgcampaigns.com", "nmls.org", "repost.aws"]
      sender.email.domain.tld eq "local"
       macro "sender.email.domain.root_domain in org_domains"
  strings.replace_confusables(sender.display_name) regex_match "\\baws\\b|amazon web services|\\bses\\b"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
sender.email.domain.root_domaininairtableemail.com, amazon.com, amazonaws.cn, amazonaws.com, amazonses.com, aws-experience.com, aws.com, awsacademy.com, awscustomercouncil.com, awseducate.com, awsevents.com, awsmp-seller-conference.com, marketplace.aws, mktgcampaigns.com, nmls.org, repost.awsexcludes:sender.email.domain.root_domain
sender.email.domain.tldeqlocalexcludes:sender.email.domain.tld field:"sender.email.domain.tld" value:"local"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Aquent

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

Detects messages impersonating Aquent, a staffing and talent solutions company, by analyzing sender display names and body content for Aquent branding and office addresses from unauthorized domains.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Credential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • headers.domains
  • sender.email
  • type

Rule body

type.inbound
and (
  regex.icontains(sender.display_name, 'Aquent\b')
  // look for Aquent address from footer, or current address being used by actors
  or (
    strings.icontains(body.current_thread.text, 'Aquent')
    and (
      (
        strings.icontains(body.current_thread.text, '2884 Sand Hill Road')
        and strings.icontains(body.current_thread.text, 'Menlo Park, CA 94025')
      )
      or (
        strings.icontains(body.current_thread.text, '501 Boylston St')
        and strings.icontains(body.current_thread.text, 'Boston, MA 02116')
      )
    )
  )
)
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    sender.email.domain.root_domain in (
      "aquent.com",
      "dice.com",
      "roberthalf.com",
      "roberthalf.be",
      "service-now.com",
      "protiviti.com",
      "atlassian.net",
      "workday.com",
      "myworkday.com",
      "rapdev.io",
      "immersivelabs.com",
      "outsidegc.com"
    )
    and headers.auth_summary.dmarc.pass
  )
)
// not a forward or reply
and (headers.in_reply_to is null or length(headers.references) == 0)
and not any(ml.nlu_classifier(body.current_thread.text).topics,
            .name == "Advertising and Promotions" and .confidence != "low"
)
// negate instances where proofpoint sends a review of a reported message via analyzer 
and not (
  sender.email.email == "analyzer@analyzer.securityeducation.com"
  and any(headers.domains, .root_domain == "pphosted.com")
  and headers.auth_summary.spf.pass
  and headers.auth_summary.dmarc.pass
)

Detection logic

Scope: inbound message.

Detects messages impersonating Aquent, a staffing and talent solutions company, by analyzing sender display names and body content for Aquent branding and office addresses from unauthorized domains.

  1. inbound message
  2. any of:
    • sender.display_name matches 'Aquent\\b'
    • all of:
      • body.current_thread.text contains 'Aquent'
      • any of:
        • all of:
          • body.current_thread.text contains '2884 Sand Hill Road'
          • body.current_thread.text contains 'Menlo Park, CA 94025'
        • all of:
          • body.current_thread.text contains '501 Boylston St'
          • body.current_thread.text contains 'Boston, MA 02116'
  3. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • sender.email.domain.root_domain in ('aquent.com', 'dice.com', 'roberthalf.com', 'roberthalf.be', 'service-now.com', 'protiviti.com', 'atlassian.net', 'workday.com', 'myworkday.com', 'rapdev.io', 'immersivelabs.com', 'outsidegc.com')
      • headers.auth_summary.dmarc.pass
  4. any of:
    • headers.in_reply_to is missing
    • length(headers.references) is 0
  5. not:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name is 'Advertising and Promotions'
      • .confidence is not 'low'
  6. not:
    • all of:
      • sender.email.email is 'analyzer@analyzer.securityeducation.com'
      • any of headers.domains where:
        • .root_domain is 'pphosted.com'
      • headers.auth_summary.spf.pass
      • headers.auth_summary.dmarc.pass

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.domains, headers.domains[].root_domain, headers.in_reply_to, headers.references, sender.display_name, sender.email.domain.root_domain, sender.email.email, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains. Reference lists: $org_domains.

Indicators matched (6)

FieldMatchValue
regex.icontainsregexAquent\b
strings.icontainssubstringAquent
strings.icontainssubstring2884 Sand Hill Road
strings.icontainssubstringMenlo Park, CA 94025
strings.icontainssubstring501 Boylston St
strings.icontainssubstringBoston, MA 02116

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      or
        and
          body.current_thread.text contains "2884 Sand Hill Road"
          body.current_thread.text contains "Menlo Park, CA 94025"
        and
          body.current_thread.text contains "501 Boylston St"
          body.current_thread.text contains "Boston, MA 02116"
      body.current_thread.text contains "Aquent"
    sender.display_name regex_match "Aquent\\b"
  not
    or
      and
        headers.auth_summary.dmarc.pass eq "true"
        sender.email.domain.root_domain in ["aquent.com", "atlassian.net", "dice.com", "immersivelabs.com", "myworkday.com", "outsidegc.com", "protiviti.com", "rapdev.io", "roberthalf.be", "roberthalf.com", "service-now.com", "workday.com"]
       macro "sender.email.domain.root_domain in org_domains"
  not
    and
      any(headers.domains)
        headers.domains.root_domain eq "pphosted.com"
      headers.auth_summary.dmarc.pass eq "true"
      headers.auth_summary.spf.pass eq "true"
      sender.email.email eq "analyzer@analyzer.securityeducation.com"
  not
    any(ml.nlu_classifier(body.current_thread.text).topics)
      and
        ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
        ml.nlu_classifier(body.current_thread.text).topics.name eq "Advertising and Promotions"
  or
    headers.in_reply_to is_null
    headers.references length_compare "0"
  type.inbound eq "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_domaininaquent.com, atlassian.net, dice.com, immersivelabs.com, myworkday.com, outsidegc.com, protiviti.com, rapdev.io, roberthalf.be, roberthalf.com, service-now.com, workday.comexcludes:sender.email.domain.root_domain
headers.domainsarray_any(no value, null check)excludes:headers.domains
headers.auth_summary.spf.passeqtrueexcludes:headers.auth_summary.spf.pass field:"headers.auth_summary.spf.pass" value:"true"
sender.email.emaileqanalyzer@analyzer.securityeducation.comexcludes:sender.email.email field:"sender.email.email" value:"analyzer@analyzer.securityeducation.com"
ml.nlu_classifier(body.current_thread.text).topicsarray_any(no value, null check)excludes:ml.nlu_classifier(body.current_thread.text).topics

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textcontains
  • 2884 Sand Hill Road
  • 501 Boylston St
  • Aquent
  • Boston, MA 02116
  • Menlo Park, CA 94025
field:"body.current_thread.text" kind:contains
headers.in_reply_tois_null
  • (no value, null check)
field:"headers.in_reply_to" kind:is_null
sender.display_nameregex_match
  • Aquent\b
field:"sender.display_name" kind:regex_match value:"Aquent\b"
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Automobile assistance associations

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

Detects messages impersonating automobile associations (AAA, CAA, RAC, etc.) offering vehicle emergency kits or roadside assistance services from untrusted senders.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and any(ml.nlu_classifier(body.current_thread.text).entities,
        .name in ("org", "sender")
        and regex.contains(.text, '\b(?:AAA|RAC|RAA|CAA|BCAA|AMA)\b')
)
and regex.icontains(body.current_thread.text,
                    '(?:car|vehicle|motor|driver|emergency|road.?side|break.?down|assist|save|discount|complimentary|free\b).{0,10}kit'
)
// and the sender is not from high trust sender root domains
and not (
  sender.email.domain.root_domain in $high_trust_sender_root_domains
  and coalesce(headers.auth_summary.dmarc.pass, false)
)
// negate newsletters and quarantine notifications
and not (
  any(ml.nlu_classifier(body.current_thread.text).topics,
      .name in ("Newsletters and Digests") and .confidence != "low"
  )
  or strings.icontains(subject.subject, "quarantine")
)

Detection logic

Scope: inbound message.

Detects messages impersonating automobile associations (AAA, CAA, RAC, etc.) offering vehicle emergency kits or roadside assistance services from untrusted senders.

  1. inbound message
  2. any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
    • .name in ('org', 'sender')
    • .text matches '\\b(?:AAA|RAC|RAA|CAA|BCAA|AMA)\\b'
  3. body.current_thread.text matches '(?:car|vehicle|motor|driver|emergency|road.?side|break.?down|assist|save|discount|complimentary|free\\b).{0,10}kit'
  4. not:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • coalesce(headers.auth_summary.dmarc.pass)
  5. none of:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name in ('Newsletters and Digests')
      • .confidence is not 'low'
    • subject.subject contains 'quarantine'

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: ml.nlu_classifier, regex.contains, regex.icontains, strings.icontains. Reference lists: $high_trust_sender_root_domains.

Indicators matched (4)

FieldMatchValue
ml.nlu_classifier(body.current_thread.text).entities[].namememberorg
ml.nlu_classifier(body.current_thread.text).entities[].namemembersender
regex.containsregex\b(?:AAA|RAC|RAA|CAA|BCAA|AMA)\b
regex.icontainsregex(?:car|vehicle|motor|driver|emergency|road.?side|break.?down|assist|save|discount|complimentary|free\b).{0,10}kit

Stages and Predicates

Stage 1: mql_rule

and
  not
    or
      any(ml.nlu_classifier(body.current_thread.text).topics)
        and
          ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
          ml.nlu_classifier(body.current_thread.text).topics.name eq "Newsletters and Digests"
      subject.subject contains "quarantine"
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
  any(ml.nlu_classifier(body.current_thread.text).entities)
    and
      ml.nlu_classifier(body.current_thread.text).entities.name in ["org", "sender"]
      ml.nlu_classifier(body.current_thread.text).entities.text regex_match "\\b(?:AAA|RAC|RAA|CAA|BCAA|AMA)\\b"
  body.current_thread.text regex_match "(?:car|vehicle|motor|driver|emergency|road.?side|break.?down|assist|save|discount|complimentary|free\\b).{0,10}kit"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
ml.nlu_classifier(body.current_thread.text).topicsarray_any(no value, null check)excludes:ml.nlu_classifier(body.current_thread.text).topics
subject.subjectcontainsquarantineexcludes:subject.subject field:"subject.subject" value:"quarantine"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textregex_match
  • (?:car|vehicle|motor|driver|emergency|road.?side|break.?down|assist|save|discount|complimentary|free\b).{0,10}kit
field:"body.current_thread.text" kind:regex_match value:"(?:car|vehicle|motor|driver|emergency|road.?side|break.?down|assist|save|discount|complimentary|free\b).{0,10}kit"
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Bids & Tenders

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

Detects links impersonating the Bids & Tenders platform. The rule identifies suspicious links from non-legitimate domains that load Bids & Tenders logo assets, suggesting the sender is spoofing the platform to appear legitimate.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Spoofing, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • recipients
  • recipients.to[0]
  • sender.email
  • type

Rule body

type.inbound
// self sender or invaild recipent domain
and length(recipients.to) == 1
and (
  sender.email.email == recipients.to[0].email.email
  or recipients.to[0].email.domain.valid == false
)
and 0 < length(body.current_thread.links) < 10
and any(body.current_thread.links,
        .href_url.domain.root_domain != 'bidsandtenders.ca'
        and any(ml.link_analysis(., mode="aggressive").unique_urls_accessed,
                .domain.domain == 'bids.bidsandtenders.ca'
                and strings.icontains(.path, '/Logo/')
        )
)

Detection logic

Scope: inbound message.

Detects links impersonating the Bids & Tenders platform. The rule identifies suspicious links from non-legitimate domains that load Bids & Tenders logo assets, suggesting the sender is spoofing the platform to appear legitimate.

  1. inbound message
  2. length(recipients.to) is 1
  3. any of:
    • sender.email.email is recipients.to[0].email.email
    • recipients.to[0].email.domain.valid is False
  4. all of:
    • length(body.current_thread.links) > 0
    • length(body.current_thread.links) < 10
  5. any of body.current_thread.links where all hold:
    • .href_url.domain.root_domain is not 'bidsandtenders.ca'
    • any of ml.link_analysis(., mode='aggressive').unique_urls_accessed where all hold:
      • .domain.domain is 'bids.bidsandtenders.ca'
      • .path contains '/Logo/'

Inspects: body.current_thread.links, body.current_thread.links[].href_url.domain.root_domain, recipients.to, recipients.to[0].email.domain.valid, recipients.to[0].email.email, sender.email.email, type.inbound. Sensors: ml.link_analysis, strings.icontains.

Indicators matched (2)

FieldMatchValue
ml.link_analysis(body.current_thread.links[], mode='aggressive').unique_urls_accessed[].domain.domainequalsbids.bidsandtenders.ca
strings.icontainssubstring/Logo/

Stages and Predicates

Stage 1: mql_rule

and
  any(body.current_thread.links)
    and
      any(ml.link_analysis(body.current_thread.links, mode='aggressive').unique_urls_accessed)
        and
          ml.link_analysis(body.current_thread.links[], mode='aggressive').unique_urls_accessed[].domain.domain eq "bids.bidsandtenders.ca"
          ml.link_analysis(body.current_thread.links[], mode='aggressive').unique_urls_accessed[].path contains "/Logo/"
      body.current_thread.links.href_url.domain.root_domain ne "bidsandtenders.ca"
  or
    recipients.to[0].email.domain.valid eq "false"
    sender.email.email cross_field_compare "recipients.to[0].email.email"
  body.current_thread.links length_compare "0"
  body.current_thread.links length_compare "10"
  recipients.to length_compare "1"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Booking.com

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

Detects messages purporting to be from Booking.com's support team that contain suspicious credential collection patterns. The sender is not from a legitimate Booking.com domain and shows a history of problematic behavior or lacks prior solicited communication. Additional checks enforce DMARC authentication for trusted domains.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.links
  • headers
  • headers.auth_summary
  • headers.hops
  • sender.email
  • type

Rule body

type.inbound
and length(body.links) < 10
and (
  any(ml.nlu_classifier(body.current_thread.text).topics,
      .name in (
        "Travel and Transportation",
        "Customer Service and Support",
        "Security and Authentication"
      )
      and .confidence != "low"
  )
  // handle instances in which ml_topic does not hit
  or (
    length(body.links) == 0
    and length(attachments) == 0
    and length(body.current_thread.text) < 1000
    and strings.icontains(sender.display_name, "booking.com")
  )
)
and (
  any(ml.nlu_classifier(body.current_thread.text).entities,
      .name == "org" and .text == "Booking.com"
  )
  or strings.icontains(body.current_thread.text, ' booking.com ')
  or strings.icontains(sender.display_name, "booking.com")
  or 2 of (
    strings.icontains(body.current_thread.text, "Booking.com"),
    strings.icontains(body.current_thread.text, "Oosterdokskade 163"),
    strings.icontains(body.current_thread.text, "Amsterdam")
  )
)
and (
  any(ml.nlu_classifier(body.current_thread.text).intents,
      .name == "cred_theft"
  )
  or any(body.links,
         strings.ilike(.display_text,
                       "*review*",
                       "*response*",
                       "*respond*",
                       "*complaint*",
                       "*contact*",
                       "*accommodation*",
                       "*view*details*"
         )
         or .display_url.domain.root_domain == "booking.com" and .mismatched
         or .href_url.domain.root_domain == 'share.google'
         or network.whois(.href_url.domain).days_old < 30
         or strings.icontains(.href_url.path, "/redir")
  )
  // check for text strings that betray intent
  or regex.icontains(body.current_thread.text, '(?:book\sa|open)\srooms', )
  or strings.ilike(body.current_thread.text, "* availab*", )
  // two seperate HTML elements impersonating the logo
  or (
    any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes,
        .display_text =~ "Booking"
    )
    and any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes,
            .display_text =~ ".com"
    )
  )
)
and not (
  sender.email.domain.root_domain in~ (
    'booking.com',
    'siteminder.com',
    'thinkreservations.com'
  )
  and headers.auth_summary.dmarc.pass
)
and (
  not profile.by_sender().solicited
  or (
    profile.by_sender().any_messages_malicious_or_spam
    and not profile.by_sender().any_messages_benign
  )
)

// negate microsoft quarantine messages
and not (
  sender.email.email == "quarantine@messaging.microsoft.com"
  and (
    headers.auth_summary.dmarc.pass
    // no sender auth but MS AuthAs is Internal
    or (
      not coalesce(headers.auth_summary.dmarc.pass, false)
      and any(headers.hops,
              .index == 0
              and any(.fields,
                      .name == "X-MS-Exchange-CrossTenant-AuthAs"
                      and .value == "Internal"
              )
      )
    )
  )
)

Detection logic

Scope: inbound message.

Detects messages purporting to be from Booking.com's support team that contain suspicious credential collection patterns. The sender is not from a legitimate Booking.com domain and shows a history of problematic behavior or lacks prior solicited communication. Additional checks enforce DMARC authentication for trusted domains.

  1. inbound message
  2. length(body.links) < 10
  3. any of:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name in ('Travel and Transportation', 'Customer Service and Support', 'Security and Authentication')
      • .confidence is not 'low'
    • all of:
      • length(body.links) is 0
      • length(attachments) is 0
      • length(body.current_thread.text) < 1000
      • sender.display_name contains 'booking.com'
  4. any of:
    • any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
      • .name is 'org'
      • .text is 'Booking.com'
    • body.current_thread.text contains ' booking.com '
    • sender.display_name contains 'booking.com'
    • at least 2 of:
      • body.current_thread.text contains 'Booking.com'
      • body.current_thread.text contains 'Oosterdokskade 163'
      • body.current_thread.text contains 'Amsterdam'
  5. any of:
    • any of ml.nlu_classifier(body.current_thread.text).intents where:
      • .name is 'cred_theft'
    • any of body.links where any holds:
      • .display_text matches any of 7 patterns
        • *review*
        • *response*
        • *respond*
        • *complaint*
        • *contact*
        • *accommodation*
        • *view*details*
      • all of:
        • .display_url.domain.root_domain is 'booking.com'
        • .mismatched
      • .href_url.domain.root_domain is 'share.google'
      • network.whois(.href_url.domain).days_old < 30
      • .href_url.path contains '/redir'
    • body.current_thread.text matches '(?:book\\sa|open)\\srooms'
    • body.current_thread.text matches '* availab*'
    • all of:
      • any of html.xpath(body.html, '//*[text()[normalize-space()]]').nodes where:
        • .display_text is 'Booking'
      • any of html.xpath(body.html, '//*[text()[normalize-space()]]').nodes where:
        • .display_text is '.com'
  6. not:
    • all of:
      • sender.email.domain.root_domain in ('booking.com', 'siteminder.com', 'thinkreservations.com')
      • headers.auth_summary.dmarc.pass
  7. any of:
    • not:
      • profile.by_sender().solicited
    • all of:
      • profile.by_sender().any_messages_malicious_or_spam
      • not:
        • profile.by_sender().any_messages_benign
  8. not:
    • all of:
      • sender.email.email is 'quarantine@messaging.microsoft.com'
      • any of:
        • headers.auth_summary.dmarc.pass
        • all of:
          • not:
            • coalesce(headers.auth_summary.dmarc.pass)
          • any of headers.hops where all hold:
            • .index is 0
            • any of .fields where all hold:
              • .name is 'X-MS-Exchange-CrossTenant-AuthAs'
              • .value is 'Internal'

Inspects: body.current_thread.text, body.html, body.links, body.links[].display_text, body.links[].display_url.domain.root_domain, body.links[].href_url.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.links[].mismatched, headers.auth_summary.dmarc.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, headers.hops[].index, sender.display_name, sender.email.domain.root_domain, sender.email.email, type.inbound. Sensors: html.xpath, ml.nlu_classifier, network.whois, profile.by_sender, regex.icontains, strings.icontains, strings.ilike.

Indicators matched (25)

FieldMatchValue
ml.nlu_classifier(body.current_thread.text).topics[].namememberTravel and Transportation
ml.nlu_classifier(body.current_thread.text).topics[].namememberCustomer Service and Support
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecurity and Authentication
strings.icontainssubstringbooking.com
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsorg
ml.nlu_classifier(body.current_thread.text).entities[].textequalsBooking.com
strings.icontainssubstring booking.com
strings.icontainssubstringBooking.com
strings.icontainssubstringOosterdokskade 163
strings.icontainssubstringAmsterdam
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
strings.ilikesubstring*review*
13 more
strings.ilikesubstring*response*
strings.ilikesubstring*respond*
strings.ilikesubstring*complaint*
strings.ilikesubstring*contact*
strings.ilikesubstring*accommodation*
strings.ilikesubstring*view*details*
body.links[].display_url.domain.root_domainequalsbooking.com
body.links[].href_url.domain.root_domainequalsshare.google
strings.icontainssubstring/redir
regex.icontainsregex(?:book\sa|open)\srooms
strings.ilikesubstring* availab*
html.xpath(body.html, '//*[text()[normalize-space()]]').nodes[].display_textequalsBooking
html.xpath(body.html, '//*[text()[normalize-space()]]').nodes[].display_textequals.com

Stages and Predicates

Stage 1: mql_rule

and
  not
    and
      or
        and
          any(headers.hops)
            and
              any(headers.hops.fields)
                and
                  headers.hops.fields[].name eq "X-MS-Exchange-CrossTenant-AuthAs"
                  headers.hops.fields[].value eq "Internal"
              headers.hops.index eq "0"
          not
            coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
        headers.auth_summary.dmarc.pass eq "true"
      sender.email.email eq "quarantine@messaging.microsoft.com"
  or
    any(body.links)
      or
        and
          body.links.display_url.domain.root_domain eq "booking.com"
          body.links.mismatched eq "true"
        body.links.display_text match "accommodation"
        body.links.display_text match "complaint"
        body.links.display_text match "contact"
        body.links.display_text match "respond"
        body.links.display_text match "response"
        body.links.display_text match "review"
        body.links.display_text wildcard "*view*details*"
        body.links.href_url.domain.root_domain eq "share.google"
        body.links.href_url.path contains "/redir"
        network.whois func_call "network.whois(body.links[].href_url.domain).days_old < 30"
    and
      any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes)
        html.xpath(body.html, '//*[text()[normalize-space()]]').nodes.display_text eq ".com"
      any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes)
        html.xpath(body.html, '//*[text()[normalize-space()]]').nodes.display_text eq "Booking"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
    body.current_thread.text match " availab"
    body.current_thread.text regex_match "(?:book\\sa|open)\\srooms"
  or
    any(ml.nlu_classifier(body.current_thread.text).entities)
      and
        ml.nlu_classifier(body.current_thread.text).entities.name eq "org"
        ml.nlu_classifier(body.current_thread.text).entities.text eq "Booking.com"
    body.current_thread.text contains " booking.com "
    body.current_thread.text contains "Amsterdam"
    body.current_thread.text contains "Booking.com"
    body.current_thread.text contains "Oosterdokskade 163"
    sender.display_name contains "booking.com"
  or
    any(ml.nlu_classifier(body.current_thread.text).topics)
      and
        ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
        ml.nlu_classifier(body.current_thread.text).topics.name in ["Customer Service and Support", "Security and Authentication", "Travel and Transportation"]
    and
      attachments length_compare "0"
      body.current_thread.text length_compare "1000"
      body.links length_compare "0"
      sender.display_name contains "booking.com"
  or
    and
      not
        profile.by_sender func_call "profile.by_sender().any_messages_benign"
      profile.by_sender func_call "profile.by_sender().any_messages_malicious_or_spam"
    not
      profile.by_sender func_call "profile.by_sender().solicited"
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["booking.com", "siteminder.com", "thinkreservations.com"]
  body.links length_compare "10"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

Brand Impersonation: Disney

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

Detects messages from senders impersonating Disney through display name spoofing or brand logo usage, combined with security-themed content and suspicious authentication patterns.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and (
  // display name contains Disney
  (
    (
      strings.ilike(strings.replace_confusables(sender.display_name),
                    '*disney*'
      )
      and not strings.ilike(strings.replace_confusables(sender.display_name),
                            '*disney springs*'
      )
    )
    // levenshtein distance similar to Disney
    or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                            'disney'
    ) <= 1
    or any(ml.logo_detect(file.message_screenshot()).brands,
           .name == "Disney" and .confidence == "high"
    )
  )
)
and (
  (
    any(ml.nlu_classifier(body.current_thread.text).topics,
        .name in (
          "Security and Authentication",
          "Secure Message",
          "Reminders and Notifications"
        )
        and .confidence in ("medium", "high")
    )
    and not any(ml.nlu_classifier(body.current_thread.text).topics,
                .name in ("Newsletters and Digests", "Entertainment and Sports")
                and .confidence in ("medium", "high")
    )
  )
  or (
    beta.ocr(file.message_screenshot()).text != ""
    and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
            .name in (
              "Security and Authentication",
              "Secure Message",
              "Reminders and Notifications"
            )
            and .confidence in ("medium", "high")
    )
    and not any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
                .name in ("Newsletters and Digests", "Entertainment and Sports")
                and .confidence in ("medium", "high")
    )
  )
  or any(ml.nlu_classifier(body.current_thread.text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
  or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
)

// and the sender is not in org_domains or from Disney domains and passes auth
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    // from https://github.com/v2fly/domain-list-community/blob/master/data/disney
    sender.email.domain.root_domain in (
      "disney.asia",
      "disney.be",
      "disney.bg",
      "disney.ca",
      "disney.ch",
      "disney.co.il",
      "disney.co.jp",
      "disney.co.kr",
      "disney.co.th",
      "disney.co.uk",
      "disney.co.za",
      "disney.com",
      "disney.com.au",
      "disney.com.br",
      "disney.com.hk",
      "disney.com.tw",
      "disney.cz",
      "disney.de",
      "disney.dk",
      "disney.es",
      "disney.fi",
      "disney.fr",
      "disney.gr",
      "disney.hu",
      "disney.id",
      "disney.in",
      "disney.io",
      "disney.it",
      "disney.my",
      "disney.nl",
      "disney.no",
      "disney.ph",
      "disney.pl",
      "disney.pt",
      "disney.ro",
      "disney.ru",
      "disney.se",
      "disney.sg",
      "disneysurveys.com",
      "disneyonline.com",
      "disneyaccount.com",
      "disneyadvertising.com",
      "disneydestinations.com",
      "hulu.com",
      "hulumail.com",
      "canarytechnologies.com", // domain used by a disney resort - hotel mgmt software company
      "disneyvacationclub.com",
      "twdc.com",
      "disneyrewards.com",
      "disneystore.com",
      "disneyworld.com"
    )
    and headers.auth_summary.dmarc.pass
  )
)
// and the sender is not from high trust sender root domains
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().solicited
  or not headers.auth_summary.dmarc.pass
  or not headers.auth_summary.spf.pass
)

Detection logic

Scope: inbound message.

Detects messages from senders impersonating Disney through display name spoofing or brand logo usage, combined with security-themed content and suspicious authentication patterns.

  1. inbound message
  2. any of:
    • all of:
      • strings.replace_confusables(sender.display_name) matches '*disney*'
      • not:
        • strings.replace_confusables(sender.display_name) matches '*disney springs*'
    • strings.replace_confusables(sender.display_name) is similar to 'disney'
    • any of ml.logo_detect(file.message_screenshot()).brands where all hold:
      • .name is 'Disney'
      • .confidence is 'high'
  3. any of:
    • all of:
      • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
        • .confidence in ('medium', 'high')
      • not:
        • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
          • .name in ('Newsletters and Digests', 'Entertainment and Sports')
          • .confidence in ('medium', 'high')
    • all of:
      • beta.ocr(file.message_screenshot()).text is not ''
      • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
        • .confidence in ('medium', 'high')
      • not:
        • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
          • .name in ('Newsletters and Digests', 'Entertainment and Sports')
          • .confidence in ('medium', 'high')
    • 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(beta.ocr(file.message_screenshot()).text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence is 'high'
  4. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • sender.email.domain.root_domain in ('disney.asia', 'disney.be', 'disney.bg', 'disney.ca', 'disney.ch', 'disney.co.il', 'disney.co.jp', 'disney.co.kr', 'disney.co.th', 'disney.co.uk', 'disney.co.za', 'disney.com', 'disney.com.au', 'disney.com.br', 'disney.com.hk', 'disney.com.tw', 'disney.cz', 'disney.de', 'disney.dk', 'disney.es', 'disney.fi', 'disney.fr', 'disney.gr', 'disney.hu', 'disney.id', 'disney.in', 'disney.io', 'disney.it', 'disney.my', 'disney.nl', 'disney.no', 'disney.ph', 'disney.pl', 'disney.pt', 'disney.ro', 'disney.ru', 'disney.se', 'disney.sg', 'disneysurveys.com', 'disneyonline.com', 'disneyaccount.com', 'disneyadvertising.com', 'disneydestinations.com', 'hulu.com', 'hulumail.com', 'canarytechnologies.com', 'disneyvacationclub.com', 'twdc.com', 'disneyrewards.com', 'disneystore.com', 'disneyworld.com')
      • headers.auth_summary.dmarc.pass
  5. 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
  6. any of:
    • not:
      • profile.by_sender().solicited
    • not:
      • headers.auth_summary.dmarc.pass
    • not:
      • headers.auth_summary.spf.pass

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, strings.ilevenshtein, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (18)

FieldMatchValue
strings.ilikesubstring*disney*
strings.ilevenshteinfuzzydisney
ml.logo_detect(file.message_screenshot()).brands[].nameequalsDisney
ml.logo_detect(file.message_screenshot()).brands[].confidenceequalshigh
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecure Message
ml.nlu_classifier(body.current_thread.text).topics[].namememberReminders and Notifications
ml.nlu_classifier(body.current_thread.text).topics[].confidencemembermedium
ml.nlu_classifier(body.current_thread.text).topics[].confidencememberhigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecure Message
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberReminders and Notifications
6 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencemembermedium
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencememberhigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].nameequalscred_theft
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].confidenceequalshigh

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
          and
            ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
            ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Entertainment and Sports", "Newsletters and Digests"]
      any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
        and
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
      beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
    and
      not
        any(ml.nlu_classifier(body.current_thread.text).topics)
          and
            ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
            ml.nlu_classifier(body.current_thread.text).topics.name in ["Entertainment and Sports", "Newsletters and Digests"]
      any(ml.nlu_classifier(body.current_thread.text).topics)
        and
          ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
          ml.nlu_classifier(body.current_thread.text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
    any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
      and
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
  not
    or
      and
        headers.auth_summary.dmarc.pass eq "true"
        sender.email.domain.root_domain in ["canarytechnologies.com", "disney.asia", "disney.be", "disney.bg", "disney.ca", "disney.ch", "disney.co.il", "disney.co.jp", "disney.co.kr", "disney.co.th", "disney.co.uk", "disney.co.za", "disney.com", "disney.com.au", "disney.com.br", "disney.com.hk", "disney.com.tw", "disney.cz", "disney.de", "disney.dk", "disney.es", "disney.fi", "disney.fr", "disney.gr", "disney.hu", "disney.id", "disney.in", "disney.io", "disney.it", "disney.my", "disney.nl", "disney.no", "disney.ph", "disney.pl", "disney.pt", "disney.ro", "disney.ru", "disney.se", "disney.sg", "disneyaccount.com", "disneyadvertising.com", "disneydestinations.com", "disneyonline.com", "disneyrewards.com", "disneystore.com", "disneysurveys.com", "disneyvacationclub.com", "disneyworld.com", "hulu.com", "hulumail.com", "twdc.com"]
       macro "sender.email.domain.root_domain in org_domains"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    any(ml.logo_detect(file.message_screenshot()).brands)
      and
        ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
        ml.logo_detect(file.message_screenshot()).brands.name eq "Disney"
    and
      not
        strings.replace_confusables(sender.display_name) match "disney springs"
      strings.replace_confusables(sender.display_name) match "disney"
    strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"disney\") <= 1"
  or
    not
      headers.auth_summary.dmarc.pass eq "true"
    not
      headers.auth_summary.spf.pass eq "true"
    not
      profile.by_sender func_call "profile.by_sender().solicited"
  type.inbound eq "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_domainincanarytechnologies.com, disney.asia, disney.be, disney.bg, disney.ca, disney.ch, disney.co.il, disney.co.jp, disney.co.kr, disney.co.th, disney.co.uk, disney.co.za, disney.com, disney.com.au, disney.com.br, disney.com.hk, disney.com.tw, disney.cz, disney.de, disney.dk, disney.es, disney.fi, disney.fr, disney.gr, disney.hu, disney.id, disney.in, disney.io, disney.it, disney.my, disney.nl, disney.no, disney.ph, disney.pl, disney.pt, disney.ro, disney.ru, disney.se, disney.sg, disneyaccount.com, disneyadvertising.com, disneydestinations.com, disneyonline.com, disneyrewards.com, disneystore.com, disneysurveys.com, disneyvacationclub.com, disneyworld.com, hulu.com, hulumail.com, twdc.comexcludes:sender.email.domain.root_domain

Indicators

These rows show field, operator, and value matches.

Brand impersonation: DocSend

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

Attack impersonating DocSend.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Lookalike domain, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and (
  (
    sender.display_name =~ 'DocSend'
    or strings.ilevenshtein(sender.display_name, 'DocSend') <= 1
    or strings.icontains(sender.email.domain.domain, '*docsend*')
    or regex.icontains(body.current_thread.text, 'on Dropbox\s*(?:Doc)?\s*Send')
    or regex.icontains(body.current_thread.text,
                       'The Dropbox\s*(?:Doc)?\s*Send Team'
    )
    or regex.icontains(body.current_thread.text,
                       'Report to Dropbox\s*(?:Doc)?\s*Send'
    )
    or regex.icontains(body.current_thread.text,
                       '©\s*20[0-9]{2}\s*,\s*Dropbox DocSend'
    )
    or any(ml.nlu_classifier(body.current_thread.text).entities,
           .name in ("sender", "org")
           and strings.icontains(.text, 'Dropbox DocSend')
    )
  )
)
and not (
  sender.email.domain.root_domain in~ ('docsend.com')
  and coalesce(headers.auth_summary.dmarc.pass, false)
)
and not profile.by_sender_email().solicited

// 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.

Attack impersonating DocSend.

  1. inbound message
  2. any of:
    • sender.display_name is 'DocSend'
    • sender.display_name is similar to 'DocSend'
    • sender.email.domain.domain contains '*docsend*'
    • body.current_thread.text matches 'on Dropbox\\s*(?:Doc)?\\s*Send'
    • body.current_thread.text matches 'The Dropbox\\s*(?:Doc)?\\s*Send Team'
    • body.current_thread.text matches 'Report to Dropbox\\s*(?:Doc)?\\s*Send'
    • body.current_thread.text matches '©\\s*20[0-9]{2}\\s*,\\s*Dropbox DocSend'
    • any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
      • .name in ('sender', 'org')
      • .text contains 'Dropbox DocSend'
  3. not:
    • all of:
      • sender.email.domain.root_domain in ('docsend.com')
      • coalesce(headers.auth_summary.dmarc.pass)
  4. not:
    • profile.by_sender_email().solicited
  5. 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, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender_email, regex.icontains, strings.icontains, strings.ilevenshtein. Reference lists: $high_trust_sender_root_domains.

Indicators matched (10)

FieldMatchValue
sender.display_nameequalsDocSend
strings.ilevenshteinfuzzyDocSend
strings.icontainssubstring*docsend*
regex.icontainsregexon Dropbox\s*(?:Doc)?\s*Send
regex.icontainsregexThe Dropbox\s*(?:Doc)?\s*Send Team
regex.icontainsregexReport to Dropbox\s*(?:Doc)?\s*Send
regex.icontainsregex©\s*20[0-9]{2}\s*,\s*Dropbox DocSend
ml.nlu_classifier(body.current_thread.text).entities[].namemembersender
ml.nlu_classifier(body.current_thread.text).entities[].namememberorg
strings.icontainssubstringDropbox DocSend

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    any(ml.nlu_classifier(body.current_thread.text).entities)
      and
        ml.nlu_classifier(body.current_thread.text).entities.name in ["org", "sender"]
        ml.nlu_classifier(body.current_thread.text).entities.text contains "Dropbox DocSend"
    body.current_thread.text regex_match "Report to Dropbox\\s*(?:Doc)?\\s*Send"
    body.current_thread.text regex_match "The Dropbox\\s*(?:Doc)?\\s*Send Team"
    body.current_thread.text regex_match "on Dropbox\\s*(?:Doc)?\\s*Send"
    body.current_thread.text regex_match "©\\s*20[0-9]{2}\\s*,\\s*Dropbox DocSend"
    sender.display_name eq "DocSend"
    sender.email.domain.domain contains "*docsend*"
    strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"DocSend\") <= 1"
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
      sender.email.domain.root_domain eq "docsend.com"
  not
    profile.by_sender_email func_call "profile.by_sender_email().solicited"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
sender.email.domain.root_domaineqdocsend.comexcludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"docsend.com"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textregex_match
  • Report to Dropbox\s*(?:Doc)?\s*Send
  • The Dropbox\s*(?:Doc)?\s*Send Team
  • on Dropbox\s*(?:Doc)?\s*Send
  • ©\s*20[0-9]{2}\s*,\s*Dropbox DocSend
field:"body.current_thread.text" kind:regex_match
sender.display_nameeq
  • DocSend
field:"sender.display_name" kind:eq value:"DocSend"
sender.email.domain.domaincontains
  • *docsend*
field:"sender.email.domain.domain" kind:contains value:"*docsend*"
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: DocuSign PDF attachment with suspicious link

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

This rule detects DocuSign logos within PDF's that do not link to reputable domains, nor docusign themselves. This is typically indicative of Credential Phishing.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, PDF, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • attachments
  • type

Rule body

type.inbound
and any(attachments,
        .file_type == "pdf"
        and any(ml.logo_detect(.).brands, .name == "DocuSign")
        and any(file.explode(.),
                length(.scan.url.urls) <= 9
                and any(.scan.url.urls,
                        .domain.root_domain not in $tranco_1m
                        and .domain.root_domain not in $org_domains
                        and .domain.root_domain != "sublimesecurity.com"
                        and not strings.ilike(.domain.root_domain, "docusign.*")
                )
        )
        and any(file.explode(.),
                any(ml.nlu_classifier(.scan.ocr.raw).entities,
                    .name == "org" and .text == "DocuSign"
                )
        )
        and any(file.explode(.),
                any(ml.nlu_classifier(.scan.ocr.raw).entities,
                    .name == "request"
                )
        )
)

Detection logic

Scope: inbound message.

This rule detects DocuSign logos within PDF's that do not link to reputable domains, nor docusign themselves. This is typically indicative of Credential Phishing.

  1. inbound message
  2. any of attachments where all hold:
    • .file_type is 'pdf'
    • any of ml.logo_detect(.).brands where:
      • .name is 'DocuSign'
    • any of file.explode(.) where all hold:
      • length(.scan.url.urls) ≤ 9
      • any of .scan.url.urls where all hold:
        • .domain.root_domain not in $tranco_1m
        • .domain.root_domain not in $org_domains
        • .domain.root_domain is not 'sublimesecurity.com'
        • not:
          • .domain.root_domain matches 'docusign.*'
    • any of file.explode(.) where:
      • any of ml.nlu_classifier(.scan.ocr.raw).entities where all hold:
        • .name is 'org'
        • .text is 'DocuSign'
    • any of file.explode(.) where:
      • any of ml.nlu_classifier(.scan.ocr.raw).entities where:
        • .name is 'request'

Inspects: attachments[].file_type, type.inbound. Sensors: file.explode, ml.logo_detect, ml.nlu_classifier, strings.ilike. Reference lists: $org_domains, $tranco_1m.

Indicators matched (5)

FieldMatchValue
attachments[].file_typeequalspdf
ml.logo_detect(attachments[]).brands[].nameequalsDocuSign
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).entities[].nameequalsorg
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).entities[].textequalsDocuSign
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).entities[].nameequalsrequest

Stages and Predicates

Stage 1: mql_rule

and
  any(attachments)
    and
      any(file.explode(attachments))
        and
          any(file.explode(attachments).scan.url.urls)
            and
              not
                file.explode(attachments[])[].scan.url.urls[].domain.root_domain starts_with "docusign."
              file.explode(attachments[])[].scan.url.urls[].domain.root_domain ne "sublimesecurity.com"
               macro "file.explode(attachments[])[].scan.url.urls[].domain.root_domain not in org_domains"
               macro "file.explode(attachments[])[].scan.url.urls[].domain.root_domain not in tranco_1m"
          file.explode(attachments[])[].scan.url.urls length_compare "9"
      any(file.explode(attachments))
        any(ml.nlu_classifier(file.explode(attachments).scan.ocr.raw).entities)
          and
            ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).entities[].name eq "org"
            ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).entities[].text eq "DocuSign"
      any(file.explode(attachments))
        any(ml.nlu_classifier(file.explode(attachments).scan.ocr.raw).entities)
          ml.nlu_classifier(file.explode(attachments).scan.ocr.raw).entities.name eq "request"
      any(ml.logo_detect(attachments).brands)
        ml.logo_detect(attachments).brands.name eq "DocuSign"
      attachments.file_type eq "pdf"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: DocuSign with embedded QR code

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

This rule detects unsolicited messages with short bodies containing a DocuSign logo, QR code language and an embedded QR code.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesEvasion, Image as content, Impersonation: Brand, QR code

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and length(body.current_thread.text) < 1000
and length(attachments) == 0
and regex.icontains(body.current_thread.text, '\bQ(\.)?R(\.)?\b')
and regex.icontains(body.current_thread.text, "scan|mobile|camera")
and any(ml.logo_detect(file.message_screenshot()).brands,
        strings.starts_with(.name, "DocuSign")
)
//
// 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
//
and any(beta.scan_qr(file.message_screenshot()).items,
        .type is not null and regex.contains(.data, '\.')
)
// 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.

This rule detects unsolicited messages with short bodies containing a DocuSign logo, QR code language and an embedded QR code.

  1. inbound message
  2. length(body.current_thread.text) < 1000
  3. length(attachments) is 0
  4. body.current_thread.text matches '\\bQ(\\.)?R(\\.)?\\b'
  5. body.current_thread.text matches 'scan|mobile|camera'
  6. any of ml.logo_detect(file.message_screenshot()).brands where:
    • .name starts with 'DocuSign'
  7. any of beta.scan_qr(file.message_screenshot()).items where all hold:
    • .type is set
    • .data matches '\\.'
  8. 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, sender.email.domain.root_domain, type.inbound. Sensors: beta.scan_qr, file.message_screenshot, ml.logo_detect, regex.contains, regex.icontains, strings.starts_with. Reference lists: $high_trust_sender_root_domains.

Indicators matched (4)

FieldMatchValue
regex.icontainsregex\bQ(\.)?R(\.)?\b
regex.icontainsregexscan|mobile|camera
strings.starts_withprefixDocuSign
regex.containsregex\.

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  any(beta.scan_qr(file.message_screenshot()).items)
    and
      beta.scan_qr(file.message_screenshot()).items.data regex_match "\\."
      beta.scan_qr(file.message_screenshot()).items.type is_not_null
  any(ml.logo_detect(file.message_screenshot()).brands)
    ml.logo_detect(file.message_screenshot()).brands.name starts_with "DocuSign"
  attachments length_compare "0"
  body.current_thread.text length_compare "1000"
  body.current_thread.text regex_match "\\bQ(\\.)?R(\\.)?\\b"
  body.current_thread.text regex_match "scan|mobile|camera"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textregex_match
  • \bQ(.)?R(.)?\b
    • scan
    • mobile
    • camera
field:"body.current_thread.text" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Enbridge

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

Impersonation of the Canadian energy company Enbridge.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Credential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.links
  • headers
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  strings.ilike(sender.display_name, '*enbridge*')
  or strings.ilike(sender.email.domain.domain, '*enbridge*')
  or strings.ilike(subject.subject, '*enbridge*')
)
and any(body.links,
        strings.ilike(.display_text, "*pay now*", "*view your bill*")
)
// negate replies
and (length(headers.references) == 0 or headers.in_reply_to is null)
and sender.email.domain.root_domain not in~ (
  'enbridge.com',
  'enbridgegas.com',
  // Enbridge Subsidiaries
  'domenergyoheb.com', // Dominion Energy Ohio
  'domenergyuteb.com' // Dominion Energy Utah
)

Detection logic

Scope: inbound message.

Impersonation of the Canadian energy company Enbridge.

  1. inbound message
  2. any of:
    • sender.display_name matches '*enbridge*'
    • sender.email.domain.domain matches '*enbridge*'
    • subject.subject matches '*enbridge*'
  3. any of body.links where:
    • .display_text matches any of 2 patterns
      • *pay now*
      • *view your bill*
  4. any of:
    • length(headers.references) is 0
    • headers.in_reply_to is missing
  5. sender.email.domain.root_domain not in ('enbridge.com', 'enbridgegas.com', 'domenergyoheb.com', 'domenergyuteb.com')

Inspects: body.links, body.links[].display_text, headers.in_reply_to, headers.references, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: strings.ilike.

Indicators matched (3)

FieldMatchValue
strings.ilikesubstring*enbridge*
strings.ilikesubstring*pay now*
strings.ilikesubstring*view your bill*

Stages and Predicates

Stage 1: mql_rule

and
  any(body.links)
    or
      body.links.display_text match "pay now"
      body.links.display_text match "view your bill"
  or
    headers.in_reply_to is_null
    headers.references length_compare "0"
  or
    sender.display_name match "enbridge"
    sender.email.domain.domain match "enbridge"
    subject.subject match "enbridge"
  not
    sender.email.domain.root_domain in ["domenergyoheb.com", "domenergyuteb.com", "enbridge.com", "enbridgegas.com"]
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
sender.email.domain.root_domainindomenergyoheb.com, domenergyuteb.com, enbridge.com, enbridgegas.comexcludes:sender.email.domain.root_domain

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Evite

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

Detects messages impersonating Evite invitations by looking for invitation language while not originating from legitimate Evite domains.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.html
  • body.links
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and strings.contains(body.html.raw, 'evitecdn.com')
and length(filter(html.xpath(body.html, '//img/@src').nodes,
                  // calling parse_url allows url decoding to help us
                  strings.parse_url(.raw).domain.root_domain == 'evitecdn.com'
           )
) >= 2
and length(filter(body.links,
                  .href_url.domain.root_domain == "evite.com"
                  and regex.contains(.href_url.path, '^/_ct/[a-f0-9]{40}/')
           )
) <= 4
and not (
  (subject.is_forward or subject.is_reply)
  and (length(headers.references) != 0 or headers.in_reply_to is not null)
  and length(body.previous_threads) > 0
)
and not (
  sender.email.domain.root_domain == "evite.com"
  and headers.auth_summary.dmarc.pass
)

Detection logic

Scope: inbound message.

Detects messages impersonating Evite invitations by looking for invitation language while not originating from legitimate Evite domains.

  1. inbound message
  2. body.html.raw contains 'evitecdn.com'
  3. length(filter(html.xpath(body.html, '//img/@src').nodes, strings.parse_url(.raw).domain.root_domain == 'evitecdn.com')) ≥ 2
  4. length(filter(body.links, .href_url.domain.root_domain == 'evite.com' and regex.contains(.href_url.path, '^/_ct/[a-f0-9]{40}/'))) ≤ 4
  5. not:
    • all of:
      • any of:
        • subject.is_forward
        • subject.is_reply
      • any of:
        • length(headers.references) is not 0
        • headers.in_reply_to is set
      • length(body.previous_threads) > 0
  6. not:
    • all of:
      • sender.email.domain.root_domain is 'evite.com'
      • headers.auth_summary.dmarc.pass

Inspects: body.html, body.html.raw, body.links, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.previous_threads, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: html.xpath, regex.contains, strings.contains, strings.parse_url.

Indicators matched (3)

FieldMatchValue
strings.containssubstringevitecdn.com
body.links[].href_url.domain.root_domainequalsevite.com
regex.containsregex^/_ct/[a-f0-9]{40}/

Stages and Predicates

Stage 1: mql_rule

and
  not
    and
      or
        headers.in_reply_to is_not_null
        headers.references length_compare "0"
      or
        subject.is_forward eq "true"
        subject.is_reply eq "true"
      body.previous_threads length_compare "0"
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain eq "evite.com"
  body.html.raw contains "evitecdn.com"
  filter(body.links, .href_url.domain.root_domain == 'evite.com' and regex.contains(.href_url.path, '^/_ct/[a-f0-9]{40}/')) length_compare "4"
  filter(html.xpath(body.html, '//img/@src').nodes, strings.parse_url(.raw).domain.root_domain == 'evitecdn.com') length_compare "2"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Fake procurement/RFQ PDF from energy and industrial companies

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

Detects inbound PDF attachments impersonating well-known energy and industrial companies (Neste, TotalEnergies, Vattenfall, MOL Group, Unilever, Shell, Waldinger, Novo Nordisk) using fabricated procurement orders, requests for quotation, or supply chain solicitation documents. OCR is used to identify specific branding, addresses, and keywords embedded in these fraudulent PDF templates.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesImpersonation: Brand, PDF, Social engineering, Image as content

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • attachments
  • type

Rule body

type.inbound
and any(filter(attachments, .file_extension == "pdf"),
        //
        // 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
        //
        (
          strings.icontains(beta.ocr(.).text, "Neste Niederlande")
          and strings.icontains(beta.ocr(.).text, "Antarcticaweg 185")
          and strings.icontains(beta.ocr(.).text,
                                "NESTE PROCUREMENT ORDER",
                                "This is not a Purchase Order"
          )
        )
        or (
          strings.icontains(beta.ocr(.).text, "TotalEnergies Tower")
          and strings.icontains(beta.ocr(.).text, "Louisiana")
          and strings.icontains(beta.ocr(.).text, "SUPPLY CHAIN MANAGEMENT")
        )
        or (
          strings.icontains(beta.ocr(.).text, "Vattenfall")
          and strings.icontains(beta.ocr(.).text, "Hoekenrode 8")
          and strings.icontains(beta.ocr(.).text, "SUPPLY CHAIN MANAGEMENT")
        )
        or (
          strings.icontains(beta.ocr(.).text, "MOLGROUP", "MOL Ceská")
          and strings.icontains(beta.ocr(.).text, "Purkynova 2121/3")
          and strings.icontains(beta.ocr(.).text,
                                "REQUEST FOR PROPOSAL",
                                "This is not a Purchase Order"
          )
        )
        or (
          strings.icontains(beta.ocr(.).text,
                            "219 NORTH ROCKS ROAD",
                            "100 Victoria Embankment",
                            "WEENA 455"
          )
          and strings.icontains(beta.ocr(.).text,
                                "SUPPLY CHAIN MANAGEMENT",
                                "COMPULSORY BIDDERS MUST QUOTE",
                                "INVITATION TO TENDER",
                                "UNILEVER SUPPLY CHAIN RFQ"
          )
        )
        or (
          strings.icontains(beta.ocr(.).text, "Shell USA")
          and strings.icontains(beta.ocr(.).text, "150 N Dairy Ashford Road")
          and strings.icontains(beta.ocr(.).text,
                                "Public Tender Documentation",
                                "This is not a Purchase Order"
          )
        )
        or (
          strings.icontains(beta.ocr(.).text, "Waldinger Corporation")
          and strings.icontains(beta.ocr(.).text, "6200 Scout Trail")
          and strings.icontains(beta.ocr(.).text,
                                "REQUEST FOR QUOTATION",
                                "This is not a Purchase Order"
          )
        )
        or (
          strings.icontains(beta.ocr(.).text,
                            "NOVO NORDISK",
                            "nordisksourcingeu.com"
          )
          and strings.icontains(beta.ocr(.).text, "CARRE MICHELET")
          and strings.icontains(beta.ocr(.).text,
                                "COMPULSORY BIDDERS MUST QUOTE",
                                "This is not a Purchase Order"
          )
        )
)

Detection logic

Scope: inbound message.

Detects inbound PDF attachments impersonating well-known energy and industrial companies (Neste, TotalEnergies, Vattenfall, MOL Group, Unilever, Shell, Waldinger, Novo Nordisk) using fabricated procurement orders, requests for quotation, or supply chain solicitation documents. OCR is used to identify specific branding, addresses, and keywords embedded in these fraudulent PDF templates.

  1. inbound message
  2. any of filter(attachments) where any holds:
    • all of:
      • beta.ocr(.).text contains 'Neste Niederlande'
      • beta.ocr(.).text contains 'Antarcticaweg 185'
      • beta.ocr(.).text contains any of 2 patterns
        • NESTE PROCUREMENT ORDER
        • This is not a Purchase Order
    • all of:
      • beta.ocr(.).text contains 'TotalEnergies Tower'
      • beta.ocr(.).text contains 'Louisiana'
      • beta.ocr(.).text contains 'SUPPLY CHAIN MANAGEMENT'
    • all of:
      • beta.ocr(.).text contains 'Vattenfall'
      • beta.ocr(.).text contains 'Hoekenrode 8'
      • beta.ocr(.).text contains 'SUPPLY CHAIN MANAGEMENT'
    • all of:
      • beta.ocr(.).text contains any of 2 patterns
        • MOLGROUP
        • MOL Ceská
      • beta.ocr(.).text contains 'Purkynova 2121/3'
      • beta.ocr(.).text contains any of 2 patterns
        • REQUEST FOR PROPOSAL
        • This is not a Purchase Order
    • all of:
      • beta.ocr(.).text contains any of 3 patterns
        • 219 NORTH ROCKS ROAD
        • 100 Victoria Embankment
        • WEENA 455
      • beta.ocr(.).text contains any of 4 patterns
        • SUPPLY CHAIN MANAGEMENT
        • COMPULSORY BIDDERS MUST QUOTE
        • INVITATION TO TENDER
        • UNILEVER SUPPLY CHAIN RFQ
    • all of:
      • beta.ocr(.).text contains 'Shell USA'
      • beta.ocr(.).text contains '150 N Dairy Ashford Road'
      • beta.ocr(.).text contains any of 2 patterns
        • Public Tender Documentation
        • This is not a Purchase Order
    • all of:
      • beta.ocr(.).text contains 'Waldinger Corporation'
      • beta.ocr(.).text contains '6200 Scout Trail'
      • beta.ocr(.).text contains any of 2 patterns
        • REQUEST FOR QUOTATION
        • This is not a Purchase Order
    • all of:
      • beta.ocr(.).text contains any of 2 patterns
        • NOVO NORDISK
        • nordisksourcingeu.com
      • beta.ocr(.).text contains 'CARRE MICHELET'
      • beta.ocr(.).text contains any of 2 patterns
        • COMPULSORY BIDDERS MUST QUOTE
        • This is not a Purchase Order

Inspects: attachments[].file_extension, type.inbound. Sensors: beta.ocr, strings.icontains.

Indicators matched (29)

FieldMatchValue
attachments[].file_extensionequalspdf
strings.icontainssubstringNeste Niederlande
strings.icontainssubstringAntarcticaweg 185
strings.icontainssubstringNESTE PROCUREMENT ORDER
strings.icontainssubstringThis is not a Purchase Order
strings.icontainssubstringTotalEnergies Tower
strings.icontainssubstringLouisiana
strings.icontainssubstringSUPPLY CHAIN MANAGEMENT
strings.icontainssubstringVattenfall
strings.icontainssubstringHoekenrode 8
strings.icontainssubstringMOLGROUP
strings.icontainssubstringMOL Ceská
17 more
strings.icontainssubstringPurkynova 2121/3
strings.icontainssubstringREQUEST FOR PROPOSAL
strings.icontainssubstring219 NORTH ROCKS ROAD
strings.icontainssubstring100 Victoria Embankment
strings.icontainssubstringWEENA 455
strings.icontainssubstringCOMPULSORY BIDDERS MUST QUOTE
strings.icontainssubstringINVITATION TO TENDER
strings.icontainssubstringUNILEVER SUPPLY CHAIN RFQ
strings.icontainssubstringShell USA
strings.icontainssubstring150 N Dairy Ashford Road
strings.icontainssubstringPublic Tender Documentation
strings.icontainssubstringWaldinger Corporation
strings.icontainssubstring6200 Scout Trail
strings.icontainssubstringREQUEST FOR QUOTATION
strings.icontainssubstringNOVO NORDISK
strings.icontainssubstringnordisksourcingeu.com
strings.icontainssubstringCARRE MICHELET

Stages and Predicates

Stage 1: mql_rule

and
  any(filter(attachments))
    or
      and
        or
          beta.ocr(filter(attachments)[]).text contains "100 Victoria Embankment"
          beta.ocr(filter(attachments)[]).text contains "219 NORTH ROCKS ROAD"
          beta.ocr(filter(attachments)[]).text contains "WEENA 455"
        or
          beta.ocr(filter(attachments)[]).text contains "COMPULSORY BIDDERS MUST QUOTE"
          beta.ocr(filter(attachments)[]).text contains "INVITATION TO TENDER"
          beta.ocr(filter(attachments)[]).text contains "SUPPLY CHAIN MANAGEMENT"
          beta.ocr(filter(attachments)[]).text contains "UNILEVER SUPPLY CHAIN RFQ"
      and
        or
          beta.ocr(filter(attachments)[]).text contains "COMPULSORY BIDDERS MUST QUOTE"
          beta.ocr(filter(attachments)[]).text contains "This is not a Purchase Order"
        or
          beta.ocr(filter(attachments)[]).text contains "NOVO NORDISK"
          beta.ocr(filter(attachments)[]).text contains "nordisksourcingeu.com"
        beta.ocr(filter(attachments)[]).text contains "CARRE MICHELET"
      and
        or
          beta.ocr(filter(attachments)[]).text contains "MOL Ceská"
          beta.ocr(filter(attachments)[]).text contains "MOLGROUP"
        or
          beta.ocr(filter(attachments)[]).text contains "REQUEST FOR PROPOSAL"
          beta.ocr(filter(attachments)[]).text contains "This is not a Purchase Order"
        beta.ocr(filter(attachments)[]).text contains "Purkynova 2121/3"
      and
        or
          beta.ocr(filter(attachments)[]).text contains "NESTE PROCUREMENT ORDER"
          beta.ocr(filter(attachments)[]).text contains "This is not a Purchase Order"
        beta.ocr(filter(attachments)[]).text contains "Antarcticaweg 185"
        beta.ocr(filter(attachments)[]).text contains "Neste Niederlande"
      and
        or
          beta.ocr(filter(attachments)[]).text contains "Public Tender Documentation"
          beta.ocr(filter(attachments)[]).text contains "This is not a Purchase Order"
        beta.ocr(filter(attachments)[]).text contains "150 N Dairy Ashford Road"
        beta.ocr(filter(attachments)[]).text contains "Shell USA"
      and
        or
          beta.ocr(filter(attachments)[]).text contains "REQUEST FOR QUOTATION"
          beta.ocr(filter(attachments)[]).text contains "This is not a Purchase Order"
        beta.ocr(filter(attachments)[]).text contains "6200 Scout Trail"
        beta.ocr(filter(attachments)[]).text contains "Waldinger Corporation"
      and
        beta.ocr(filter(attachments)[]).text contains "Hoekenrode 8"
        beta.ocr(filter(attachments)[]).text contains "SUPPLY CHAIN MANAGEMENT"
        beta.ocr(filter(attachments)[]).text contains "Vattenfall"
      and
        beta.ocr(filter(attachments)[]).text contains "Louisiana"
        beta.ocr(filter(attachments)[]).text contains "SUPPLY CHAIN MANAGEMENT"
        beta.ocr(filter(attachments)[]).text contains "TotalEnergies Tower"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Figma with malicious document access overlay

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

"Detects malicious Figma design shares containing brand impersonation or credential phishing content. The rule identifies legitimate Figma share notifications where the embedded thumbnail preview contains "access document" text when OCR'd. Attackers create phishing designs (impersonating Microsoft, DocuSign, or other brands) within Figma, then share them via Figma's legitimate infrastructure to bypass sender reputation checks. The malicious content is rendered in the Figma-hosted thumbnail image itself."

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering, Image as content

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • sender.email
  • subject
  • type

Rule body

type.inbound
and sender.email.email == "no-reply@email.figma.com"
and strings.icontains(subject.base, "proposal")
and length(html.xpath(body.html,
                      "//img[contains(@src, 'https://api-cdn.figma.com/resize/thumbnails')]"
           ).nodes
) == 1
//
// 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
//
and strings.icontains(beta.ocr(file.message_screenshot()).text,
                      'access document'
)

Detection logic

Scope: inbound message.

"Detects malicious Figma design shares containing brand impersonation or credential phishing content. The rule identifies legitimate Figma share notifications where the embedded thumbnail preview contains "access document" text when OCR'd. Attackers create phishing designs (impersonating Microsoft, DocuSign, or other brands) within Figma, then share them via Figma's legitimate infrastructure to bypass sender reputation checks. The malicious content is rendered in the Figma-hosted thumbnail image itself."

  1. inbound message
  2. sender.email.email is 'no-reply@email.figma.com'
  3. subject.base contains 'proposal'
  4. length(html.xpath(body.html, "//img[contains(@src, 'https://api-cdn.figma.com/resize/thumbnails')]").nodes) is 1
  5. beta.ocr(file.message_screenshot()).text contains 'access document'

Inspects: body.html, sender.email.email, subject.base, type.inbound. Sensors: beta.ocr, file.message_screenshot, html.xpath, strings.icontains.

Indicators matched (3)

FieldMatchValue
sender.email.emailequalsno-reply@email.figma.com
strings.icontainssubstringproposal
strings.icontainssubstringaccess document

Stages and Predicates

Stage 1: mql_rule

and
  beta.ocr(file.message_screenshot()).text contains "access document"
  html.xpath(body.html, "//img[contains(@src, 'https://api-cdn.figma.com/resize/thumbnails')]").nodes length_compare "1"
  sender.email.email eq "no-reply@email.figma.com"
  subject.base contains "proposal"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Brand Impersonation: Gemini Trust Company

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

Detects messages impersonating Gemini Trust Company through analysis of footer content, social media links, and address verification, excluding legitimate communications from authenticated Gemini domains.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.links
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  // the address in the footer
  (
    regex.icontains(body.current_thread.text,
                    "600 Third Avenue.{1,2}2nd Floor.{1,2}New York, NY"
    )
    and strings.icontains(body.current_thread.text, "Gemini Trust Company")
  )
  // logo detect combined with sender display name 
  // need to be more specific here due to other uses of the word "Gemini"
  or (
    sender.display_name =~ "Gemini"
    and any(ml.logo_detect(file.message_screenshot()).brands,
            .name == "Gemini Trust" and .confidence != "low"
    )
  )
  // copyright footer
  or strings.icontains(body.current_thread.text,
                       '© 2025 Gemini Trust Company, LLC'
  )

  // the social links in the footer
  or (
    length(filter(body.links,
                  strings.icontains(.href_url.url,
                                    'https://www.instagram.com/gemini/'
                  )
                  or strings.icontains(.href_url.url,
                                       'https://www.linkedin.com/company/geminitrust/'
                  )
                  or strings.icontains(.href_url.url,
                                       'https://facebook.com/GeminiTrust'
                  )
                  or strings.icontains(.href_url.url,
                                       'https://twitter.com/Gemini'
                  )
                  or strings.icontains(.href_url.url,
                                       'https://support.gemini.com/hc/en-us/requests/new'
                  )
                  or strings.icontains(.href_url.url,
                                       'https://support.gemini.com/hc/en-us/requests/new'
                  )
           )
    ) >= 4
  )
)
// not forwards/replies
and not (
  length(headers.references) > 0
  and (subject.is_forward or subject.is_reply)
  and length(body.previous_threads) >= 1
)
// not from Gemini actual
and not (
  sender.email.domain.root_domain in (
    "gemini.com",
    "niftygateway.com" // NFT market place owned by Gemini Trust Company
  )
  and headers.auth_summary.dmarc.pass
)

Detection logic

Scope: inbound message.

Detects messages impersonating Gemini Trust Company through analysis of footer content, social media links, and address verification, excluding legitimate communications from authenticated Gemini domains.

  1. inbound message
  2. any of:
    • all of:
      • body.current_thread.text matches '600 Third Avenue.{1,2}2nd Floor.{1,2}New York, NY'
      • body.current_thread.text contains 'Gemini Trust Company'
    • all of:
      • sender.display_name is 'Gemini'
      • any of ml.logo_detect(file.message_screenshot()).brands where all hold:
        • .name is 'Gemini Trust'
        • .confidence is not 'low'
    • body.current_thread.text contains '© 2025 Gemini Trust Company, LLC'
    • length(filter(body.links, strings.icontains(.href_url.url, 'https://www.instagram.com/gemini/') or strings.icontains(.href_url.url, 'https://www.linkedin.com/company/geminitrust/') or strings.icontains(.href_url.url, 'https://facebook.com/GeminiTrust') or strings.icontains(.href_url.url, 'https://twitter.com/Gemini') or strings.icontains(.href_url.url, 'https://support.gemini.com/hc/en-us/requests/new') or strings.icontains(.href_url.url, 'https://support.gemini.com/hc/en-us/requests/new'))) ≥ 4
  3. not:
    • all of:
      • length(headers.references) > 0
      • any of:
        • subject.is_forward
        • subject.is_reply
      • length(body.previous_threads) ≥ 1
  4. not:
    • all of:
      • sender.email.domain.root_domain in ('gemini.com', 'niftygateway.com')
      • headers.auth_summary.dmarc.pass

Inspects: body.current_thread.text, body.links, body.links[].href_url.url, body.previous_threads, headers.auth_summary.dmarc.pass, headers.references, sender.display_name, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: file.message_screenshot, ml.logo_detect, regex.icontains, strings.icontains.

Indicators matched (10)

FieldMatchValue
regex.icontainsregex600 Third Avenue.{1,2}2nd Floor.{1,2}New York, NY
strings.icontainssubstringGemini Trust Company
sender.display_nameequalsGemini
ml.logo_detect(file.message_screenshot()).brands[].nameequalsGemini Trust
strings.icontainssubstring© 2025 Gemini Trust Company, LLC
strings.icontainssubstringhttps://www.instagram.com/gemini/
strings.icontainssubstringhttps://www.linkedin.com/company/geminitrust/
strings.icontainssubstringhttps://facebook.com/GeminiTrust
strings.icontainssubstringhttps://twitter.com/Gemini
strings.icontainssubstringhttps://support.gemini.com/hc/en-us/requests/new

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      any(ml.logo_detect(file.message_screenshot()).brands)
        and
          ml.logo_detect(file.message_screenshot()).brands.confidence ne "low"
          ml.logo_detect(file.message_screenshot()).brands.name eq "Gemini Trust"
      sender.display_name eq "Gemini"
    and
      body.current_thread.text contains "Gemini Trust Company"
      body.current_thread.text regex_match "600 Third Avenue.{1,2}2nd Floor.{1,2}New York, NY"
    body.current_thread.text contains "© 2025 Gemini Trust Company, LLC"
    filter(body.links, strings.icontains(.href_url.url, 'https://www.instagram.com/gemini/') or strings.icontains(.href_url.url, 'https://www.linkedin.com/company/geminitrust/') or strings.icontains(.href_url.url, 'https://facebook.com/GeminiTrust') or strings.icontains(.href_url.url, 'https://twitter.com/Gemini') or strings.icontains(.href_url.url, 'https://support.gemini.com/hc/en-us/requests/new') or strings.icontains(.href_url.url, 'https://support.gemini.com/hc/en-us/requests/new')) length_compare "4"
  not
    and
      or
        subject.is_forward eq "true"
        subject.is_reply eq "true"
      body.previous_threads length_compare "1"
      headers.references length_compare "0"
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["gemini.com", "niftygateway.com"]
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

Brand impersonation: GoDaddy

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

Detects messages where the sender is impersonating GoDaddy through display name manipulation or lookalike domains, while not being legitimately authenticated from GoDaddy's infrastructure.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • headers.auth_summary
  • sender.email
  • type

Rule body

type.inbound
and (
  strings.icontains(sender.display_name, 'godaddy')
  or strings.ilevenshtein(sender.display_name, 'godaddy') <= 1
  or strings.icontains(sender.email.domain.domain, 'godaddy')
)
and not (
  sender.email.domain.root_domain in (
    "godaddy.com",
    "registry.godaddy",
    "sucuri.net"
  )
  and headers.auth_summary.dmarc.pass
)
and not profile.by_sender().solicited
// 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 where the sender is impersonating GoDaddy through display name manipulation or lookalike domains, while not being legitimately authenticated from GoDaddy's infrastructure.

  1. inbound message
  2. any of:
    • sender.display_name contains 'godaddy'
    • sender.display_name is similar to 'godaddy'
    • sender.email.domain.domain contains 'godaddy'
  3. not:
    • all of:
      • sender.email.domain.root_domain in ('godaddy.com', 'registry.godaddy', 'sucuri.net')
      • headers.auth_summary.dmarc.pass
  4. not:
    • profile.by_sender().solicited
  5. 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: headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: profile.by_sender, strings.icontains, strings.ilevenshtein. Reference lists: $high_trust_sender_root_domains.

Indicators matched (2)

FieldMatchValue
strings.icontainssubstringgodaddy
strings.ilevenshteinfuzzygodaddy

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["godaddy.com", "registry.godaddy", "sucuri.net"]
  not
    profile.by_sender func_call "profile.by_sender().solicited"
  or
    sender.display_name contains "godaddy"
    sender.email.domain.domain contains "godaddy"
    strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"godaddy\") <= 1"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Google Careers

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

Detects messages impersonating Google Careers or job opportunities in multiple languages that contain links to domains other than Google's legitimate domains, from senders not authenticated as Google.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.links
  • headers
  • headers.auth_summary
  • sender.email
  • type

Rule body

type.inbound
and (
  strings.icontains(body.current_thread.text, 'Google Careers')
  or strings.icontains(body.current_thread.text, 'GoogleCareers')
  // Spanish
  or strings.icontains(body.current_thread.text, 'Google Carreras')
  or strings.icontains(body.current_thread.text, 'GoogleCarreras')
  // German Norwegian
  or strings.icontains(body.current_thread.text, 'Google Karriere')
  or strings.icontains(body.current_thread.text, 'GoogleKarriere')
  // Swedish
  or strings.icontains(body.current_thread.text, 'Google Karriär')
  or strings.icontains(body.current_thread.text, 'GoogleKarriär')
  // Dutch
  or strings.icontains(body.current_thread.text, 'Google Carrières')
  or strings.icontains(body.current_thread.text, 'GoogleCarrières')
  // Turkish
  or strings.icontains(body.current_thread.text, 'Google Kariyer')
  or strings.icontains(body.current_thread.text, 'GoogleKariyer')
  // The screenshot OCR captures google careers or the google logo
  or (
    sender.email.domain.root_domain == "salesforce.com"
    and (
      regex.icontains(beta.ocr(file.message_screenshot()).text,
                      "google careers"
      )
      or any(ml.logo_detect(file.message_screenshot()).brands,
             strings.starts_with(.name, "Google")
      )
    )
  )
)
and not any(body.links, .href_url.domain.root_domain in ("google.com", "c.gle"))
and not (
  sender.email.domain.root_domain in ("google.com", "sublimesecurity.com")
  and headers.auth_summary.dmarc.pass
)

Detection logic

Scope: inbound message.

Detects messages impersonating Google Careers or job opportunities in multiple languages that contain links to domains other than Google's legitimate domains, from senders not authenticated as Google.

  1. inbound message
  2. any of:
    • body.current_thread.text contains 'Google Careers'
    • body.current_thread.text contains 'GoogleCareers'
    • body.current_thread.text contains 'Google Carreras'
    • body.current_thread.text contains 'GoogleCarreras'
    • body.current_thread.text contains 'Google Karriere'
    • body.current_thread.text contains 'GoogleKarriere'
    • body.current_thread.text contains 'Google Karriär'
    • body.current_thread.text contains 'GoogleKarriär'
    • body.current_thread.text contains 'Google Carrières'
    • body.current_thread.text contains 'GoogleCarrières'
    • body.current_thread.text contains 'Google Kariyer'
    • body.current_thread.text contains 'GoogleKariyer'
    • all of:
      • sender.email.domain.root_domain is 'salesforce.com'
      • any of:
        • beta.ocr(file.message_screenshot()).text matches 'google careers'
        • any of ml.logo_detect(file.message_screenshot()).brands where:
          • .name starts with 'Google'
  3. not:
    • any of body.links where:
      • .href_url.domain.root_domain in ('google.com', 'c.gle')
  4. not:
    • all of:
      • sender.email.domain.root_domain in ('google.com', 'sublimesecurity.com')
      • headers.auth_summary.dmarc.pass

Inspects: body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, regex.icontains, strings.icontains, strings.starts_with.

Indicators matched (15)

FieldMatchValue
strings.icontainssubstringGoogle Careers
strings.icontainssubstringGoogleCareers
strings.icontainssubstringGoogle Carreras
strings.icontainssubstringGoogleCarreras
strings.icontainssubstringGoogle Karriere
strings.icontainssubstringGoogleKarriere
strings.icontainssubstringGoogle Karriär
strings.icontainssubstringGoogleKarriär
strings.icontainssubstringGoogle Carrières
strings.icontainssubstringGoogleCarrières
strings.icontainssubstringGoogle Kariyer
strings.icontainssubstringGoogleKariyer
3 more
sender.email.domain.root_domainequalssalesforce.com
regex.icontainsregexgoogle careers
strings.starts_withprefixGoogle

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      or
        any(ml.logo_detect(file.message_screenshot()).brands)
          ml.logo_detect(file.message_screenshot()).brands.name starts_with "Google"
        beta.ocr(file.message_screenshot()).text regex_match "google careers"
      sender.email.domain.root_domain eq "salesforce.com"
    body.current_thread.text contains "Google Careers"
    body.current_thread.text contains "Google Carreras"
    body.current_thread.text contains "Google Carrières"
    body.current_thread.text contains "Google Kariyer"
    body.current_thread.text contains "Google Karriere"
    body.current_thread.text contains "Google Karriär"
    body.current_thread.text contains "GoogleCareers"
    body.current_thread.text contains "GoogleCarreras"
    body.current_thread.text contains "GoogleCarrières"
    body.current_thread.text contains "GoogleKariyer"
    body.current_thread.text contains "GoogleKarriere"
    body.current_thread.text contains "GoogleKarriär"
  not
    any(body.links)
      body.links.href_url.domain.root_domain in ["c.gle", "google.com"]
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["google.com", "sublimesecurity.com"]
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
beta.ocr(file.message_screenshot()).textregex_match
  • google careers
field:"beta.ocr(file.message_screenshot()).text" kind:regex_match value:"google careers"
body.current_thread.textcontains
  • Google Careers
  • Google Carreras
  • Google Carrières
  • Google Kariyer
  • Google Karriere
  • Google Karriär
  • GoogleCareers
  • GoogleCarreras
  • GoogleCarrières
  • GoogleKariyer
  • GoogleKarriere
  • GoogleKarriär
field:"body.current_thread.text" kind:contains
sender.email.domain.root_domaineq
  • salesforce.com
field:"sender.email.domain.root_domain" kind:eq value:"salesforce.com"
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Google Meet with malicious link

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

Detects messages with 'Join with Google Meet' display text that redirects to domains other than meet.google.com.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • type

Rule body

type.inbound
and any(body.current_thread.links,
        .display_text in (
          "Join with Google Meet",
          "Reply or Join with Google Meet"
        )
        and not strings.contains(.href_url.domain.domain, "meet.google.com")
)
and (
  // finding the logo tag in the html
  any(html.xpath(body.html, '//img[@alt="[Optional Logo]"]').nodes,
      .raw is not null
  )
  or any(html.xpath(body.html, '//img[@alt="Google Meet"]').nodes,
         .raw is not null
  )
  // OR find the green button
  or any(html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes,
         .display_text == "Join with Google Meet"
  )
)
// finding the "Guests"/"Join by phone" tables NOT being present in the message is a good way to filter out the legit messages.
and length(html.xpath(body.html,
                      '//table/tbody/tr/td/h2[contains(@style, "color:rgb(60,64,67)")]'
           ).nodes
) == 0
// we're filtering out some more "generic" table heading for google meets with this one
and not any(distinct(map(html.xpath(body.html, '//table//h2').nodes,
                         .inner_text
                     )
            ),
            . in ("Meeting link", "Join by phone", "Guests")
)

Detection logic

Scope: inbound message.

Detects messages with 'Join with Google Meet' display text that redirects to domains other than meet.google.com.

  1. inbound message
  2. any of body.current_thread.links where all hold:
    • .display_text in ('Join with Google Meet', 'Reply or Join with Google Meet')
    • not:
      • .href_url.domain.domain contains 'meet.google.com'
  3. any of:
    • any of html.xpath(body.html, '//img[@alt="[Optional Logo]"]').nodes where:
      • .raw is set
    • any of html.xpath(body.html, '//img[@alt="Google Meet"]').nodes where:
      • .raw is set
    • any of html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes where:
      • .display_text is 'Join with Google Meet'
  4. length(html.xpath(body.html, '//table/tbody/tr/td/h2[contains(@style, "color:rgb(60,64,67)")]').nodes) is 0
  5. not:
    • any of distinct(...) where:
      • . in ('Meeting link', 'Join by phone', 'Guests')

Inspects: body.current_thread.links, body.current_thread.links[].display_text, body.current_thread.links[].href_url.domain.domain, body.html, type.inbound. Sensors: html.xpath, strings.contains.

Indicators matched (3)

FieldMatchValue
body.current_thread.links[].display_textmemberJoin with Google Meet
body.current_thread.links[].display_textmemberReply or Join with Google Meet
html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes[].display_textequalsJoin with Google Meet

Stages and Predicates

Stage 1: mql_rule

and
  any(body.current_thread.links)
    and
      not
        body.current_thread.links.href_url.domain.domain contains "meet.google.com"
      body.current_thread.links.display_text in ["Join with Google Meet", "Reply or Join with Google Meet"]
  not
    any(distinct(...))
      distinct(...) in ["Guests", "Join by phone", "Meeting link"]
  or
    any(html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes)
      html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes.display_text eq "Join with Google Meet"
    any(html.xpath(body.html, '//img[@alt="Google Meet"]').nodes)
      html.xpath(body.html, '//img[@alt="Google Meet"]').nodes.raw is_not_null
    any(html.xpath(body.html, '//img[@alt="[Optional Logo]"]').nodes)
      html.xpath(body.html, '//img[@alt="[Optional Logo]"]').nodes.raw is_not_null
  html.xpath(body.html, '//table/tbody/tr/td/h2[contains(@style, "color:rgb(60,64,67)")]').nodes length_compare "0"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
distinct(...)array_any(no value, null check)excludes:distinct(...)

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Greenvelope

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

Detects messages impersonating Greenvelope invitations not originating from legitimate Greenvelope domain.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.html
  • body.links
  • headers
  • headers.auth_summary
  • headers.return_path
  • sender.email
  • subject
  • type

Rule body

type.inbound
// Looking for greenvelope phrasing or indicators in HTML
and (
  strings.icontains(body.html.inner_text, "Powered by greenvelope")

  // Look for alt text in HTML for standardized greenvelope formatting if string is not avail.
  or strings.icontains(body.html.raw, 'alt="Greenvelope"')
  or strings.icontains(body.html.raw,
                       'https://www.greenvelope.com/viewer/envelope.ashx'
  )
  or strings.icontains(body.current_thread.text, '© 2025 Greenvelope, LLC')
  or strings.icontains(body.current_thread.text,
                       '8 The Green #8901, Dover, DE 19901'
  )
)

// no links going to greenvlope cards/"admin" links
and length(filter(body.links,
                  .href_url.domain.root_domain == "greenvelope.com"
                  and (
                    // card links
                    strings.istarts_with(.href_url.path, '/card/')
                    // user links are links for the person that created the card
                    or strings.istarts_with(.href_url.path, '/user/')
                  )
           )
) == 0

// Legitimate sender will be from greenvelope, negating known non-associated domains.
and not (
  (
    sender.email.domain.root_domain in (
      "greenvelope.com",
      'greenvelope-email.com'
    )
    and headers.auth_summary.spf.pass
  )
  or headers.return_path.domain.root_domain in (
    "greenvelope.com",
    'greenvelope-email.com'
  )
)

// avoid fwd/replies
and not (
  subject.is_forward 
  or subject.is_reply
  or length(headers.references) != 0 
  or headers.in_reply_to is not null
  or length(body.previous_threads) > 0
)

// Capping length to limit FP's
and length(body.current_thread.text) < 1500

Detection logic

Scope: inbound message.

Detects messages impersonating Greenvelope invitations not originating from legitimate Greenvelope domain.

  1. inbound message
  2. any of:
    • body.html.inner_text contains 'Powered by greenvelope'
    • body.html.raw contains 'alt="Greenvelope"'
    • body.html.raw contains 'https://www.greenvelope.com/viewer/envelope.ashx'
    • body.current_thread.text contains '© 2025 Greenvelope, LLC'
    • body.current_thread.text contains '8 The Green #8901, Dover, DE 19901'
  3. length(filter(body.links, .href_url.domain.root_domain == 'greenvelope.com' and strings.istarts_with(.href_url.path, '/card/') or strings.istarts_with(.href_url.path, '/user/'))) is 0
  4. none of:
    • all of:
      • sender.email.domain.root_domain in ('greenvelope.com', 'greenvelope-email.com')
      • headers.auth_summary.spf.pass
    • headers.return_path.domain.root_domain in ('greenvelope.com', 'greenvelope-email.com')
  5. none of:
    • subject.is_forward
    • subject.is_reply
    • length(headers.references) is not 0
    • headers.in_reply_to is set
    • length(body.previous_threads) > 0
  6. length(body.current_thread.text) < 1500

Inspects: body.current_thread.text, body.html.inner_text, body.html.raw, body.links, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.previous_threads, headers.auth_summary.spf.pass, headers.in_reply_to, headers.references, headers.return_path.domain.root_domain, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: strings.icontains, strings.istarts_with.

Indicators matched (8)

FieldMatchValue
strings.icontainssubstringPowered by greenvelope
strings.icontainssubstringalt="Greenvelope"
strings.icontainssubstringhttps://www.greenvelope.com/viewer/envelope.ashx
strings.icontainssubstring© 2025 Greenvelope, LLC
strings.icontainssubstring8 The Green #8901, Dover, DE 19901
body.links[].href_url.domain.root_domainequalsgreenvelope.com
strings.istarts_withprefix/card/
strings.istarts_withprefix/user/

Stages and Predicates

Stage 1: mql_rule

and
  not
    or
      and
        headers.auth_summary.spf.pass eq "true"
        sender.email.domain.root_domain in ["greenvelope-email.com", "greenvelope.com"]
      headers.return_path.domain.root_domain in ["greenvelope-email.com", "greenvelope.com"]
  not
    or
      body.previous_threads length_compare "0"
      headers.in_reply_to is_not_null
      headers.references length_compare "0"
      subject.is_forward eq "true"
      subject.is_reply eq "true"
  or
    body.current_thread.text contains "8 The Green #8901, Dover, DE 19901"
    body.current_thread.text contains "© 2025 Greenvelope, LLC"
    body.html.inner_text contains "Powered by greenvelope"
    body.html.raw contains "alt=\"Greenvelope\""
    body.html.raw contains "https://www.greenvelope.com/viewer/envelope.ashx"
  body.current_thread.text length_compare "1500"
  filter(body.links, .href_url.domain.root_domain == 'greenvelope.com' and strings.istarts_with(.href_url.path, '/card/') or strings.istarts_with(.href_url.path, '/user/')) length_compare "0"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textcontains
  • 8 The Green #8901, Dover, DE 19901
  • © 2025 Greenvelope, LLC
field:"body.current_thread.text" kind:contains
body.html.inner_textcontains
  • Powered by greenvelope
field:"body.html.inner_text" kind:contains value:"Powered by greenvelope"
body.html.rawcontains
  • alt="Greenvelope"
  • https://www.greenvelope.com/viewer/envelope.ashx
field:"body.html.raw" kind:contains
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Hulu

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

Impersonation of Hulu.

Threat classification

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

CategoryValues
Attack typesCredential Phishing, Spam
Tactics and techniquesFree email provider, Impersonation: Brand, Lookalike domain, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • headers.auth_summary
  • recipients
  • recipients.cc
  • recipients.to
  • sender.email
  • type

Rule body

type.inbound
and (
  regex.icontains(sender.display_name, '\bhulu\b')
  or (
    strings.ilevenshtein(sender.display_name, 'hulu') <= 1
    and not (
      // lulu.com is a self publisher
      sender.display_name =~ "lulu"
      and sender.email.domain.root_domain == "lulu.com"
    )
    and not (
      // hudu.com is an IT documentation management platform
      sender.display_name =~ "hudu"
      and sender.email.domain.root_domain == "hudu.com"
    )
  )
  or strings.ilike(sender.email.domain.domain, '*hulu*')
  or (
    (
      length(recipients.to) == 0
      or (
        all(recipients.to, .email.domain.valid == false)
        and all(recipients.cc, .email.domain.valid == false)
      )
    )
    and any(ml.logo_detect(file.message_screenshot()).brands,
            .name == "Hulu" and .confidence in ("medium", "high")
    )
  )
)
and (
  sender.email.domain.root_domain not in (
    'hulu.com',
    'hulumail.com',
    'hulu.jp',
    'hulu-japan.jp'
  )
  or (
    sender.email.domain.root_domain in (
      'hulu.com',
      'hulumail.com',
      'hulu.jp',
      'hulu-japan.jp'
    )
    and not headers.auth_summary.dmarc.pass
  )
)
and not profile.by_sender().solicited

Detection logic

Scope: inbound message.

Impersonation of Hulu.

  1. inbound message
  2. any of:
    • sender.display_name matches '\\bhulu\\b'
    • all of:
      • sender.display_name is similar to 'hulu'
      • not:
        • all of:
          • sender.display_name is 'lulu'
          • sender.email.domain.root_domain is 'lulu.com'
      • not:
        • all of:
          • sender.display_name is 'hudu'
          • sender.email.domain.root_domain is 'hudu.com'
    • sender.email.domain.domain matches '*hulu*'
    • all of:
      • any of:
        • length(recipients.to) is 0
        • all of:
          • all of recipients.to where:
            • .email.domain.valid is False
          • all of recipients.cc where:
            • .email.domain.valid is False
      • any of ml.logo_detect(file.message_screenshot()).brands where all hold:
        • .name is 'Hulu'
        • .confidence in ('medium', 'high')
  3. any of:
    • sender.email.domain.root_domain not in ('hulu.com', 'hulumail.com', 'hulu.jp', 'hulu-japan.jp')
    • all of:
      • sender.email.domain.root_domain in ('hulu.com', 'hulumail.com', 'hulu.jp', 'hulu-japan.jp')
      • not:
        • headers.auth_summary.dmarc.pass
  4. not:
    • profile.by_sender().solicited

Inspects: headers.auth_summary.dmarc.pass, recipients.cc, recipients.cc[].email.domain.valid, recipients.to, recipients.to[].email.domain.valid, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: file.message_screenshot, ml.logo_detect, profile.by_sender, regex.icontains, strings.ilevenshtein, strings.ilike.

Indicators matched (10)

FieldMatchValue
regex.icontainsregex\bhulu\b
strings.ilevenshteinfuzzyhulu
strings.ilikesubstring*hulu*
ml.logo_detect(file.message_screenshot()).brands[].nameequalsHulu
ml.logo_detect(file.message_screenshot()).brands[].confidencemembermedium
ml.logo_detect(file.message_screenshot()).brands[].confidencememberhigh
sender.email.domain.root_domainmemberhulu.com
sender.email.domain.root_domainmemberhulumail.com
sender.email.domain.root_domainmemberhulu.jp
sender.email.domain.root_domainmemberhulu-japan.jp

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      any(ml.logo_detect(file.message_screenshot()).brands)
        and
          ml.logo_detect(file.message_screenshot()).brands.confidence in ["high", "medium"]
          ml.logo_detect(file.message_screenshot()).brands.name eq "Hulu"
      or
        and
           macro "all(recipients.cc)"
           macro "all(recipients.to)"
        recipients.to length_compare "0"
    and
      not
        and
          sender.display_name eq "hudu"
          sender.email.domain.root_domain eq "hudu.com"
      not
        and
          sender.display_name eq "lulu"
          sender.email.domain.root_domain eq "lulu.com"
      strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"hulu\") <= 1"
    sender.display_name regex_match "\\bhulu\\b"
    sender.email.domain.domain match "hulu"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["hulu-japan.jp", "hulu.com", "hulu.jp", "hulumail.com"]
    not
      sender.email.domain.root_domain in ["hulu-japan.jp", "hulu.com", "hulu.jp", "hulumail.com"]
  not
    profile.by_sender func_call "profile.by_sender().solicited"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Interac

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

Impersonation of the Canadian interbanking network Interac. Seen in the wild impersonating carbon tax rebates and tax return refunds.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesImpersonation: Brand, Lookalike domain, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  strings.ilike(sender.display_name, '*interac e-transfer*')
  or strings.ilike(sender.display_name, "*interac e?trasfer*")
  or strings.ilike(subject.subject, '*interac e-transfer*')
  or strings.ilevenshtein(sender.display_name, 'interac e-transfer') <= 2
)
and sender.email.domain.root_domain not in ('interac.ca')
and 1 of (
  any(ml.nlu_classifier(body.current_thread.text).entities,
      .name == "org" and strings.icontains(.text, "interac")
  ),
  any(ml.nlu_classifier(body.current_thread.text).entities,
      .name == "financial"
  ),
)
and not profile.by_sender().solicited

// 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.

Impersonation of the Canadian interbanking network Interac. Seen in the wild impersonating carbon tax rebates and tax return refunds.

  1. inbound message
  2. any of:
    • sender.display_name matches '*interac e-transfer*'
    • sender.display_name matches '*interac e?trasfer*'
    • subject.subject matches '*interac e-transfer*'
    • sender.display_name is similar to 'interac e-transfer'
  3. sender.email.domain.root_domain not in ('interac.ca')
  4. at least 1 of:
    • any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
      • .name is 'org'
      • .text contains 'interac'
    • any of ml.nlu_classifier(body.current_thread.text).entities where:
      • .name is 'financial'
  5. not:
    • profile.by_sender().solicited
  6. 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, sender.display_name, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender, strings.icontains, strings.ilevenshtein, strings.ilike. Reference lists: $high_trust_sender_root_domains.

Indicators matched (6)

FieldMatchValue
strings.ilikesubstring*interac e-transfer*
strings.ilikesubstring*interac e?trasfer*
strings.ilevenshteinfuzzyinterac e-transfer
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsorg
strings.icontainssubstringinterac
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsfinancial

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    any(ml.nlu_classifier(body.current_thread.text).entities)
      and
        ml.nlu_classifier(body.current_thread.text).entities.name eq "org"
        ml.nlu_classifier(body.current_thread.text).entities.text contains "interac"
    any(ml.nlu_classifier(body.current_thread.text).entities)
      ml.nlu_classifier(body.current_thread.text).entities.name eq "financial"
  not
    profile.by_sender func_call "profile.by_sender().solicited"
  or
    sender.display_name match "interac e-transfer"
    sender.display_name match "interac e?trasfer"
    strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"interac e-transfer\") <= 2"
    subject.subject match "interac e-transfer"
  not
    sender.email.domain.root_domain eq "interac.ca"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
sender.email.domain.root_domaineqinterac.caexcludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"interac.ca"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Internal Revenue Service

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

Detects messages from senders posing as the Internal Revenue Service by checking display name similarity and content indicators from body text and screenshots. Excludes legitimate IRS domains and authenticated senders.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Credential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • headers.hops
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  // display name contains IRS
  (
    strings.ilike(strings.replace_confusables(sender.display_name),
                  '*internal revenue service*'
    )
    or strings.like(strings.replace_confusables(sender.display_name), 'IRS*')
    or regex.icontains(strings.replace_confusables(sender.display_name),
                       '\birs.gov'
    )
    or regex.icontains(strings.replace_confusables(sender.display_name),
                       'internal.{0,5}revenue.{0,5}service'
    )
  )

  // levenshtein distance similar to IRS
  or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                          'internal revenue service'
  ) <= 1
  or (
    strings.like(strings.replace_confusables(subject.base), '*IRS*')
    and any(ml.nlu_classifier(body.current_thread.text).topics,
            .name == "Government Services" and .confidence != "low"
    )
  )
  or 2 of (
    strings.icontains(body.current_thread.text, "Internal Revenue Service"),
    strings.icontains(body.current_thread.text, "4228 Park Ave S"),
    strings.icontains(body.current_thread.text, "1111 Constitution Ave"),
    strings.icontains(body.current_thread.text, "New York, New York 10003"),
    strings.icontains(body.current_thread.text, "Washington, DC 20224")
  )
  or regex.icontains(body.current_thread.text,
                     '©\s*20[0-9]{2}\s*\s*Internal Revenue Service'
  )
)
and (
  (
    any(ml.nlu_classifier(body.current_thread.text).topics,
        .name in ("Security and Authentication", "Financial Communications")
        and .confidence == "high"
    )
    and not any(ml.nlu_classifier(body.current_thread.text).topics,
                .name in (
                  "Advertising and Promotions",
                  "Newsletters and Digests",
                  "Political Mail",
                  "Events and Webinars"
                )
                and .confidence != "low"
    )
  )
  or (
    // OCR length is more than 2x the current_thread length
    // indicating that the body is mostly an image
    (
      (length(beta.ocr(file.message_screenshot()).text) + 0.0) / (
        length(body.current_thread.text) + 0.0
      )
    ) > 2
    and length(body.previous_threads) == 0
    and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
            .name in ("Security and Authentication", "Financial Communications")
            and .confidence == "high"
    )
    and not any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
                .name in (
                  "Advertising and Promotions",
                  "Newsletters and Digests",
                  "Political Mail",
                  "Events and Webinars"
                )
                and .confidence != "low"
    )
  )
  or any(ml.nlu_classifier(body.current_thread.text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
  or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
)
and not (
  (
    length(body.current_thread.text) > 2500
    or any(headers.hops,
           any(.fields,
               .name == 'List-Unsubscribe-Post'
               and .value == 'List-Unsubscribe=One-Click'
           )
    )
  )
  and any(ml.nlu_classifier(body.current_thread.text).intents,
          .name == "benign" and .confidence == "high"
  )
)

// and the sender is not in org_domains or from .gov domains and passes auth
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    (
      sender.email.domain.root_domain in ("govdelivery.com", "ms-cpa.org")
      or sender.email.domain.tld == "gov"
    )
    and headers.auth_summary.dmarc.pass
  )
)
// and the sender is not from high trust sender root domains
and not (
  sender.email.domain.root_domain in $high_trust_sender_root_domains
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

Detection logic

Scope: inbound message.

Detects messages from senders posing as the Internal Revenue Service by checking display name similarity and content indicators from body text and screenshots. Excludes legitimate IRS domains and authenticated senders.

  1. inbound message
  2. any of:
    • strings.replace_confusables(sender.display_name) matches any of 4 patterns
      • *internal revenue service*
      • IRS*
      • \birs.gov
      • internal.{0,5}revenue.{0,5}service
    • strings.replace_confusables(sender.display_name) is similar to 'internal revenue service'
    • all of:
      • strings.replace_confusables(subject.base) matches '*IRS*'
      • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
        • .name is 'Government Services'
        • .confidence is not 'low'
    • at least 2 of 5: body.current_thread.text contains any of 5 patterns
      • Internal Revenue Service
      • 4228 Park Ave S
      • 1111 Constitution Ave
      • New York, New York 10003
      • Washington, DC 20224
    • body.current_thread.text matches '©\\s*20[0-9]{2}\\s*\\s*Internal Revenue Service'
  3. any of:
    • all of:
      • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
        • .name in ('Security and Authentication', 'Financial Communications')
        • .confidence is 'high'
      • not:
        • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
          • .name in ('Advertising and Promotions', 'Newsletters and Digests', 'Political Mail', 'Events and Webinars')
          • .confidence is not 'low'
    • all of:
      • length(beta.ocr(file.message_screenshot()).text) + 0.0 / length(body.current_thread.text) + 0.0 > 2
      • length(body.previous_threads) is 0
      • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
        • .name in ('Security and Authentication', 'Financial Communications')
        • .confidence is 'high'
      • not:
        • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
          • .name in ('Advertising and Promotions', 'Newsletters and Digests', 'Political Mail', 'Events and Webinars')
          • .confidence is not 'low'
    • 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(beta.ocr(file.message_screenshot()).text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence is 'high'
  4. not:
    • all of:
      • any of:
        • length(body.current_thread.text) > 2500
        • any of headers.hops where:
          • any of .fields where all hold:
            • .name is 'List-Unsubscribe-Post'
            • .value is 'List-Unsubscribe=One-Click'
      • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
        • .name is 'benign'
        • .confidence is 'high'
  5. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • any of:
        • sender.email.domain.root_domain in ('govdelivery.com', 'ms-cpa.org')
        • sender.email.domain.tld is 'gov'
      • headers.auth_summary.dmarc.pass
  6. not:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • coalesce(headers.auth_summary.dmarc.pass)

Inspects: body.current_thread.text, body.previous_threads, headers.auth_summary.dmarc.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, sender.display_name, sender.email.domain.root_domain, sender.email.domain.tld, subject.base, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.nlu_classifier, regex.icontains, strings.icontains, strings.ilevenshtein, strings.ilike, strings.like, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (23)

FieldMatchValue
strings.ilikesubstring*internal revenue service*
strings.likesubstringIRS*
regex.icontainsregex\birs.gov
regex.icontainsregexinternal.{0,5}revenue.{0,5}service
strings.ilevenshteinfuzzyinternal revenue service
strings.likesubstring*IRS*
ml.nlu_classifier(body.current_thread.text).topics[].nameequalsGovernment Services
strings.icontainssubstringInternal Revenue Service
strings.icontainssubstring4228 Park Ave S
strings.icontainssubstring1111 Constitution Ave
strings.icontainssubstringNew York, New York 10003
strings.icontainssubstringWashington, DC 20224
11 more
regex.icontainsregex©\s*20[0-9]{2}\s*\s*Internal Revenue Service
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(body.current_thread.text).topics[].namememberFinancial Communications
ml.nlu_classifier(body.current_thread.text).topics[].confidenceequalshigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberFinancial Communications
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidenceequalshigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].nameequalscred_theft
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].confidenceequalshigh

Stages and Predicates

Stage 1: mql_rule

and
  not
    and
      or
        any(headers.hops)
          any(headers.hops.fields)
            and
              headers.hops.fields[].name eq "List-Unsubscribe-Post"
              headers.hops.fields[].value eq "List-Unsubscribe=One-Click"
        body.current_thread.text length_compare "2500"
      any(ml.nlu_classifier(body.current_thread.text).intents)
        and
          ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
          ml.nlu_classifier(body.current_thread.text).intents.name eq "benign"
  or
    and
      not
        any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
          and
            ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence ne "low"
            ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Advertising and Promotions", "Events and Webinars", "Newsletters and Digests", "Political Mail"]
      any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
        and
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence eq "high"
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Financial Communications", "Security and Authentication"]
      body.previous_threads length_compare "0"
       macro "((length(beta.ocr(file.message_screenshot()).text) + 0.0) / (length(body.current_thread.text) + 0.0)) > 2"
    and
      not
        any(ml.nlu_classifier(body.current_thread.text).topics)
          and
            ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
            ml.nlu_classifier(body.current_thread.text).topics.name in ["Advertising and Promotions", "Events and Webinars", "Newsletters and Digests", "Political Mail"]
      any(ml.nlu_classifier(body.current_thread.text).topics)
        and
          ml.nlu_classifier(body.current_thread.text).topics.confidence eq "high"
          ml.nlu_classifier(body.current_thread.text).topics.name in ["Financial Communications", "Security and Authentication"]
    any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
      and
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
  or
    and
      any(ml.nlu_classifier(body.current_thread.text).topics)
        and
          ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
          ml.nlu_classifier(body.current_thread.text).topics.name eq "Government Services"
      strings.replace_confusables(subject.base) match "IRS"
    body.current_thread.text contains "1111 Constitution Ave"
    body.current_thread.text contains "4228 Park Ave S"
    body.current_thread.text contains "Internal Revenue Service"
    body.current_thread.text contains "New York, New York 10003"
    body.current_thread.text contains "Washington, DC 20224"
    body.current_thread.text regex_match "©\\s*20[0-9]{2}\\s*\\s*Internal Revenue Service"
    strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"internal revenue service\") <= 1"
    strings.replace_confusables(sender.display_name) match "internal revenue service"
    strings.replace_confusables(sender.display_name) regex_match "\\birs.gov"
    strings.replace_confusables(sender.display_name) regex_match "internal.{0,5}revenue.{0,5}service"
    strings.replace_confusables(sender.display_name) starts_with "IRS"
  not
    or
      and
        or
          sender.email.domain.root_domain in ["govdelivery.com", "ms-cpa.org"]
          sender.email.domain.tld eq "gov"
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in org_domains"
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.hopsarray_any(no value, null check)excludes:headers.hops
body.current_thread.textlength_compare2500excludes:body.current_thread.text field:"body.current_thread.text" value:"2500"
ml.nlu_classifier(body.current_thread.text).intentsarray_any(no value, null check)excludes:ml.nlu_classifier(body.current_thread.text).intents
sender.email.domain.root_domainingovdelivery.com, ms-cpa.orgexcludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"govdelivery.com" field:"sender.email.domain.root_domain" value:"ms-cpa.org"
sender.email.domain.tldeqgovexcludes:sender.email.domain.tld field:"sender.email.domain.tld" value:"gov"
headers.auth_summary.dmarc.passeqtrueexcludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: KnowBe4

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

Impersonation of KnowBe4.

Threat classification

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

CategoryValues
Attack typesCredential Phishing, Spam
Tactics and techniquesFree email provider, Impersonation: Brand, Lookalike domain, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • headers.auth_summary
  • sender.email
  • type

Rule body

type.inbound
and (
  sender.display_name =~ 'KnowBe4'
  or strings.ilevenshtein(sender.display_name, 'KnowBe4') <= 1
  or strings.icontains(sender.email.domain.domain, '*KnowBe4*')
)
and (
  sender.email.domain.root_domain not in ('knowbe4.com')
  or (
    sender.email.domain.root_domain in ('knowbe4.com')
    and not headers.auth_summary.dmarc.pass
  )
)

// 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.

Impersonation of KnowBe4.

  1. inbound message
  2. any of:
    • sender.display_name is 'KnowBe4'
    • sender.display_name is similar to 'KnowBe4'
    • sender.email.domain.domain contains '*KnowBe4*'
  3. any of:
    • sender.email.domain.root_domain not in ('knowbe4.com')
    • all of:
      • sender.email.domain.root_domain in ('knowbe4.com')
      • not:
        • headers.auth_summary.dmarc.pass
  4. 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: headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: strings.icontains, strings.ilevenshtein. Reference lists: $high_trust_sender_root_domains.

Indicators matched (4)

FieldMatchValue
sender.display_nameequalsKnowBe4
strings.ilevenshteinfuzzyKnowBe4
strings.icontainssubstring*KnowBe4*
sender.email.domain.root_domainmemberknowbe4.com

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain eq "knowbe4.com"
    not
      sender.email.domain.root_domain eq "knowbe4.com"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    sender.display_name eq "KnowBe4"
    sender.email.domain.domain contains "*KnowBe4*"
    strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"KnowBe4\") <= 1"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Mailchimp

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

Detects messages from senders impersonating Mailchimp through display name spoofing or brand logo usage, combined with security-themed content and suspicious authentication patterns.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and (
  // display name contains Mailchimp
  (
    strings.ilike(strings.replace_confusables(sender.display_name),
                  '*mailchimp*'
    )
    // levenshtein distance similar to Mailchimp
    or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                            'mailchimp'
    ) <= 1
    or any(ml.logo_detect(file.message_screenshot()).brands,
           .name == "MailChimp" and .confidence == "high"
    )
  )
)
and (
  any(ml.nlu_classifier(body.current_thread.text).topics,
      .name in (
        "Security and Authentication",
        "Secure Message",
        "Reminders and Notifications"
      )
      and .confidence in ("medium", "high")
  )
  or (
    beta.ocr(file.message_screenshot()).text != ""
    and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
            .name in (
              "Security and Authentication",
              "Secure Message",
              "Reminders and Notifications"
            )
            and .confidence in ("medium", "high")
    )
  )
  or any(ml.nlu_classifier(body.current_thread.text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
  or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
)

// and the sender is not in org_domains or from Mailchimp domains and passes auth
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    sender.email.domain.root_domain in ("intuit.com", "mailchimp.com")
    and headers.auth_summary.dmarc.pass
  )
)
and not strings.ends_with(headers.message_id, ".mailchimp.com>")
// and the sender is not from high trust sender root domains
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().solicited

Detection logic

Scope: inbound message.

Detects messages from senders impersonating Mailchimp through display name spoofing or brand logo usage, combined with security-themed content and suspicious authentication patterns.

  1. inbound message
  2. any of:
    • strings.replace_confusables(sender.display_name) matches '*mailchimp*'
    • strings.replace_confusables(sender.display_name) is similar to 'mailchimp'
    • any of ml.logo_detect(file.message_screenshot()).brands where all hold:
      • .name is 'MailChimp'
      • .confidence is 'high'
  3. any of:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
      • .confidence in ('medium', 'high')
    • all of:
      • beta.ocr(file.message_screenshot()).text is not ''
      • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
        • .confidence in ('medium', 'high')
    • 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(beta.ocr(file.message_screenshot()).text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence is 'high'
  4. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • sender.email.domain.root_domain in ('intuit.com', 'mailchimp.com')
      • headers.auth_summary.dmarc.pass
  5. not:
    • headers.message_id ends with '.mailchimp.com>'
  6. 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
  7. not:
    • profile.by_sender().solicited

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.message_id, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, strings.ends_with, strings.ilevenshtein, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (18)

FieldMatchValue
strings.ilikesubstring*mailchimp*
strings.ilevenshteinfuzzymailchimp
ml.logo_detect(file.message_screenshot()).brands[].nameequalsMailChimp
ml.logo_detect(file.message_screenshot()).brands[].confidenceequalshigh
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecure Message
ml.nlu_classifier(body.current_thread.text).topics[].namememberReminders and Notifications
ml.nlu_classifier(body.current_thread.text).topics[].confidencemembermedium
ml.nlu_classifier(body.current_thread.text).topics[].confidencememberhigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecure Message
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberReminders and Notifications
6 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencemembermedium
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencememberhigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].nameequalscred_theft
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].confidenceequalshigh

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
        and
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
      beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
    any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
      and
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).topics)
      and
        ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
        ml.nlu_classifier(body.current_thread.text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
  not
    or
      and
        headers.auth_summary.dmarc.pass eq "true"
        sender.email.domain.root_domain in ["intuit.com", "mailchimp.com"]
       macro "sender.email.domain.root_domain in org_domains"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    any(ml.logo_detect(file.message_screenshot()).brands)
      and
        ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
        ml.logo_detect(file.message_screenshot()).brands.name eq "MailChimp"
    strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"mailchimp\") <= 1"
    strings.replace_confusables(sender.display_name) match "mailchimp"
  not
    headers.message_id ends_with ".mailchimp.com>"
  not
    profile.by_sender func_call "profile.by_sender().solicited"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Marriott with gift language

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

Detects messages impersonating Marriott brand that contain gift-related language such as 'appreciation gift', 'thank you gift', or 'something special' from senders not associated with legitimate Marriott domains.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  strings.icontains(subject.base, "marriott")
  or strings.icontains(sender.display_name, "marriott")
  or strings.ilevenshtein(sender.display_name, 'marriott') <= 2
)
and any([body.current_thread.text, subject.base],
        regex.icontains(.,
                        '(?:appreciation|thank)(?:\s|-)?(you)?\s+gift',
                        'something special',
                        'special.{0,10}thank(?:\s|-)you'
        )
)
and not (
  sender.email.domain.root_domain in~ (
    "marriott.com",
    "res-marriott.com",
    "email-marriott.com",
    "feedback-marriott.com",
    "marriotthotels.se",
    "bookonline.com"
  )
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

Detection logic

Scope: inbound message.

Detects messages impersonating Marriott brand that contain gift-related language such as 'appreciation gift', 'thank you gift', or 'something special' from senders not associated with legitimate Marriott domains.

  1. inbound message
  2. any of:
    • subject.base contains 'marriott'
    • sender.display_name contains 'marriott'
    • sender.display_name is similar to 'marriott'
  3. any of [body.current_thread.text, subject.base] where:
    • . matches any of 3 patterns
      • (?:appreciation|thank)(?:\s|-)?(you)?\s+gift
      • something special
      • special.{0,10}thank(?:\s|-)you
  4. not:
    • all of:
      • sender.email.domain.root_domain in ('marriott.com', 'res-marriott.com', 'email-marriott.com', 'feedback-marriott.com', 'marriotthotels.se', 'bookonline.com')
      • coalesce(headers.auth_summary.dmarc.pass)

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, subject.base, type.inbound. Sensors: regex.icontains, strings.icontains, strings.ilevenshtein.

Indicators matched (5)

FieldMatchValue
strings.icontainssubstringmarriott
strings.ilevenshteinfuzzymarriott
regex.icontainsregex(?:appreciation|thank)(?:\s|-)?(you)?\s+gift
regex.icontainsregexsomething special
regex.icontainsregexspecial.{0,10}thank(?:\s|-)you

Stages and Predicates

Stage 1: mql_rule

and
  any([body.current_thread.text, subject.base])
    or
      [body.current_thread.text, subject.base] regex_match "(?:appreciation|thank)(?:\\s|-)?(you)?\\s+gift"
      [body.current_thread.text, subject.base] regex_match "something special"
      [body.current_thread.text, subject.base] regex_match "special.{0,10}thank(?:\\s|-)you"
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
      sender.email.domain.root_domain in ["bookonline.com", "email-marriott.com", "feedback-marriott.com", "marriott.com", "marriotthotels.se", "res-marriott.com"]
  or
    sender.display_name contains "marriott"
    strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"marriott\") <= 2"
    subject.base contains "marriott"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
sender.email.domain.root_domaininbookonline.com, email-marriott.com, feedback-marriott.com, marriott.com, marriotthotels.se, res-marriott.comexcludes:sender.email.domain.root_domain

Indicators

These rows show field, operator, and value matches.

Brand impersonation: McAfee

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

Detects messages impersonating McAfee through display name, subject line, body content, or NLU entity detection when the sender is not from verified McAfee domains or other high-trust domains with valid DMARC authentication.

Threat classification

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

CategoryValues
Attack typesCredential Phishing, BEC/Fraud, Callback Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  regex.icontains(body.current_thread.text,
                  'McAfee.{0,30}(?:Defense|Protection)'
  )
  or regex.icontains(subject.base, 'McAfee.{0,30}(?:Defense|Protection)')
  or (
    strings.icontains(sender.email.local_part, "mcafee")
    and regex.icontains(subject.subject, 'billing|account|payment|unpaid')
  )
  or regex.icontains(sender.display_name,
                     '^[\s[:punct:]]*mc\s*a+f+ee+(?:$|[^,])'
  )
  or (
    any(ml.nlu_classifier(body.current_thread.text).entities,
        .name in ("org", "sender") and strings.icontains(.text, 'mcafee')
    )
    and length(filter(ml.nlu_classifier(body.current_thread.text).entities,
                      .name == "urgency"
               )
    ) >= 2
  )
)
and not any(ml.nlu_classifier(body.current_thread.text).topics,
            .name in ("Newsletters and Digests", "Advertising and Promotions")
            and .confidence != "low"
)
and not (
  sender.email.domain.root_domain in ('mcafee.com', 'mcafeesecure.com')
  and coalesce(headers.auth_summary.dmarc.pass, false)
)
and not (
  sender.email.domain.root_domain in $high_trust_sender_root_domains
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

Detection logic

Scope: inbound message.

Detects messages impersonating McAfee through display name, subject line, body content, or NLU entity detection when the sender is not from verified McAfee domains or other high-trust domains with valid DMARC authentication.

  1. inbound message
  2. any of:
    • body.current_thread.text matches 'McAfee.{0,30}(?:Defense|Protection)'
    • subject.base matches 'McAfee.{0,30}(?:Defense|Protection)'
    • all of:
      • sender.email.local_part contains 'mcafee'
      • subject.subject matches 'billing|account|payment|unpaid'
    • sender.display_name matches '^[\\s[:punct:]]*mc\\s*a+f+ee+(?:$|[^,])'
    • all of:
      • any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
        • .name in ('org', 'sender')
        • .text contains 'mcafee'
      • length(filter(ml.nlu_classifier(body.current_thread.text).entities, .name == 'urgency')) ≥ 2
  3. not:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name in ('Newsletters and Digests', 'Advertising and Promotions')
      • .confidence is not 'low'
  4. not:
    • all of:
      • sender.email.domain.root_domain in ('mcafee.com', 'mcafeesecure.com')
      • coalesce(headers.auth_summary.dmarc.pass)
  5. not:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • coalesce(headers.auth_summary.dmarc.pass)

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, sender.email.local_part, subject.base, subject.subject, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains. Reference lists: $high_trust_sender_root_domains.

Indicators matched (7)

FieldMatchValue
regex.icontainsregexMcAfee.{0,30}(?:Defense|Protection)
strings.icontainssubstringmcafee
regex.icontainsregexbilling|account|payment|unpaid
regex.icontainsregex^[\s[:punct:]]*mc\s*a+f+ee+(?:$|[^,])
ml.nlu_classifier(body.current_thread.text).entities[].namememberorg
ml.nlu_classifier(body.current_thread.text).entities[].namemembersender
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsurgency

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      any(ml.nlu_classifier(body.current_thread.text).entities)
        and
          ml.nlu_classifier(body.current_thread.text).entities.name in ["org", "sender"]
          ml.nlu_classifier(body.current_thread.text).entities.text contains "mcafee"
      filter(ml.nlu_classifier(body.current_thread.text).entities, .name == 'urgency') length_compare "2"
    and
      sender.email.local_part contains "mcafee"
      subject.subject regex_match "billing|account|payment|unpaid"
    body.current_thread.text regex_match "McAfee.{0,30}(?:Defense|Protection)"
    sender.display_name regex_match "^[\\s[:punct:]]*mc\\s*a+f+ee+(?:$|[^,])"
    subject.base regex_match "McAfee.{0,30}(?:Defense|Protection)"
  not
    any(ml.nlu_classifier(body.current_thread.text).topics)
      and
        ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
        ml.nlu_classifier(body.current_thread.text).topics.name in ["Advertising and Promotions", "Newsletters and Digests"]
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
      sender.email.domain.root_domain in ["mcafee.com", "mcafeesecure.com"]
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
ml.nlu_classifier(body.current_thread.text).topicsarray_any(no value, null check)excludes:ml.nlu_classifier(body.current_thread.text).topics
sender.email.domain.root_domaininmcafee.com, mcafeesecure.comexcludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"mcafee.com" field:"sender.email.domain.root_domain" value:"mcafeesecure.com"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: MetaMask

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

Detects inbound messages containing links where the sender impersonates MetaMask through display name manipulation and includes the MetaMask logo or suspicious language, while not being from legitimate MetaMask domains. The rule checks for credential theft patterns and validates sender authentication.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Credential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and length(body.links) > 0
and (
  regex.icontains(strings.replace_confusables(sender.display_name),
                  '\bmetamask\b',
                  '\bmetamask\.io\b'
  )
  or strings.contains(strings.replace_confusables(sender.display_name),
                      "METAMASK"
  )
  or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                          'metamask'
  ) <= 2
)
and (
  any(ml.logo_detect(file.message_screenshot()).brands, .name == "MetaMask")
  or any(ml.nlu_classifier(body.current_thread.text).intents,
         .name in ("cred_theft", "callback_scam", "steal_pii")
         and .confidence in ("high")
  )
)
and sender.email.domain.root_domain not in~ ('metamask.io')

// 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
)
and not profile.by_sender().any_messages_benign

Detection logic

Scope: inbound message.

Detects inbound messages containing links where the sender impersonates MetaMask through display name manipulation and includes the MetaMask logo or suspicious language, while not being from legitimate MetaMask domains. The rule checks for credential theft patterns and validates sender authentication.

  1. inbound message
  2. length(body.links) > 0
  3. any of:
    • strings.replace_confusables(sender.display_name) matches any of 2 patterns
      • \bmetamask\b
      • \bmetamask\.io\b
    • strings.replace_confusables(sender.display_name) contains 'METAMASK'
    • strings.replace_confusables(sender.display_name) is similar to 'metamask'
  4. any of:
    • any of ml.logo_detect(file.message_screenshot()).brands where:
      • .name is 'MetaMask'
    • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
      • .name in ('cred_theft', 'callback_scam', 'steal_pii')
      • .confidence in ('high')
  5. sender.email.domain.root_domain not in ('metamask.io')
  6. 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
  7. not:
    • profile.by_sender().any_messages_benign

Inspects: body.current_thread.text, body.links, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, regex.icontains, strings.contains, strings.ilevenshtein, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains.

Indicators matched (9)

FieldMatchValue
regex.icontainsregex\bmetamask\b
regex.icontainsregex\bmetamask\.io\b
strings.containssubstringMETAMASK
strings.ilevenshteinfuzzymetamask
ml.logo_detect(file.message_screenshot()).brands[].nameequalsMetaMask
ml.nlu_classifier(body.current_thread.text).intents[].namemembercred_theft
ml.nlu_classifier(body.current_thread.text).intents[].namemembercallback_scam
ml.nlu_classifier(body.current_thread.text).intents[].namemembersteal_pii
ml.nlu_classifier(body.current_thread.text).intents[].confidencememberhigh

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name in ["callback_scam", "cred_theft", "steal_pii"]
    any(ml.logo_detect(file.message_screenshot()).brands)
      ml.logo_detect(file.message_screenshot()).brands.name eq "MetaMask"
  not
    profile.by_sender func_call "profile.by_sender().any_messages_benign"
  not
    sender.email.domain.root_domain eq "metamask.io"
  or
    strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"metamask\") <= 2"
    strings.replace_confusables(sender.display_name) contains "METAMASK"
    strings.replace_confusables(sender.display_name) regex_match "\\bmetamask\\.io\\b"
    strings.replace_confusables(sender.display_name) regex_match "\\bmetamask\\b"
  body.links length_compare "0"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
sender.email.domain.root_domaineqmetamask.ioexcludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"metamask.io"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Microsoft Planner with suspicious link

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

Impersonation of Microsoft Planner, a component of the Microsoft 365 software suite.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesEvasion, Image as content, Impersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • attachments
  • body
  • body.current_thread
  • body.links
  • headers
  • headers.auth_summary
  • recipients
  • recipients.to
  • sender.email
  • type

Rule body

type.inbound
// suspicious link
and any(body.links,
        (
          .href_url.domain.root_domain not in $tranco_1m
          or .href_url.domain.domain in $free_file_hosts
          or .href_url.domain.root_domain in $free_file_hosts
          or .href_url.domain.root_domain in $free_subdomain_hosts
          or .href_url.domain.domain in $url_shorteners
          or .href_url.domain.domain in $social_landing_hosts
          or .href_url.domain.root_domain in $social_landing_hosts

          // mass mailer link, masks the actual URL
          or .href_url.domain.root_domain in (
            "hubspotlinks.com",
            "mandrillapp.com",
            "sendgrid.net",
            "rs6.net"
          )

          // Google AMP redirect
          or (
            .href_url.domain.sld == "google"
            and strings.starts_with(.href_url.path, "/amp/")
          )

          // Recipient email address in link
          or any(recipients.to,
                 strings.icontains(..href_url.url, .email.email)
                 and .email.domain.valid
          )
          or .href_url.domain.root_domain == "beehiiv.com"
        )

        // exclude sources of potential FPs
        and (
          .href_url.domain.root_domain not in (
            "svc.ms",
            "sharepoint.com",
            "1drv.ms",
            "microsoft.com",
            "aka.ms",
            "msftauthimages.net",
            "mimecastprotect.com",
            "office.com",
            "microsoftproject.com"
          )
          or any(body.links, .href_url.domain.domain in $free_file_hosts)
        )
        and .href_url.domain.root_domain not in $org_domains
        and .href_url.domain.valid
        and regex.icontains(.display_text,
                            "(?:go.?to|view|show|display|access|open.?in|review.?on) (teams?|planner|group|task|intranet|discussions?)"
        )
)

// not a reply
and (length(headers.references) == 0 or headers.in_reply_to is null)

// Planner logo
// LogoDetect coming soon
and (
  all(attachments,
      .file_type in $file_types_images
      and 
      // small, relatively square image
      //
      // 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
      //
      (
        beta.parse_exif(.).image_height / beta.parse_exif(.).image_width
      ) > 0.9
      and (beta.parse_exif(.).image_height + beta.parse_exif(.).image_width) < 500
  )
)

// suspicious content
and (
  2 of (
    strings.ilike(body.current_thread.text, "*assigned*new team*"),
    strings.ilike(body.current_thread.text, "*Microsoft Office 365*"),
    strings.ilike(body.current_thread.text, "*internal planner*"),
    strings.ilike(body.current_thread.text, "*internal task*"),
    any(recipients.to,
        strings.icontains(body.current_thread.text, .email.domain.sld)
    )
  )
  or (
    any(ml.nlu_classifier(body.current_thread.text).intents,
        .name == "cred_theft" and .confidence in~ ("medium", "high")
    )
  )
  // multiple links, but all the same root domain
  or (
    length(distinct(body.links, .href_url.domain.root_domain)) == 1
    and 2 < length(body.links) < 10
    and all(body.links,
            .href_url.domain.root_domain != sender.email.domain.root_domain
    )
  )
)
// skip senders 
and not (
  headers.auth_summary.dmarc.pass
  and sender.email.domain.root_domain in (
    "bing.com",
    "microsoft.com",
    "microsoftonline.com",
    "microsoftproject.com",
    "microsoftstoreemail.com",
    "microsoftsupport.com",
    "microsoft365.com",
    "office.com",
    "office365.com",
    "onedrive.com",
    "sharepointonline.com",
    "yammer.com",
    "outlign.co"
  )
)

// 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
)
and (
  not profile.by_sender().solicited
  or (
    profile.by_sender().any_messages_malicious_or_spam
    and not profile.by_sender().any_messages_benign
  )
)
and not profile.by_sender().any_messages_benign

// exclude marketing jargon from ms partners
and not regex.icontains(body.current_thread.text,
                        '(schedul(e|ing)|set up).{0,20}(call|meeting|demo|zoom|conversation|time|tool|discussion)|book.{0,10}(meeting|demo|call|slot|time)|connect.{0,12}(with me|phone|email)|my.{0,10}(calendar|cal)|reserve.{0,10}s[pl]ot|break the ice|want to know more?|miss your chance|if you no longer wish|if you no longer want|if you wish to opt out|low-code (development|approach|solution|journey|platform)|invite.{0,30}(webinar|presentation)'
)

Detection logic

Scope: inbound message.

Impersonation of Microsoft Planner, a component of the Microsoft 365 software suite.

  1. inbound message
  2. any of body.links where all hold:
    • any of:
      • .href_url.domain.root_domain not in $tranco_1m
      • .href_url.domain.domain in $free_file_hosts
      • .href_url.domain.root_domain in $free_file_hosts
      • .href_url.domain.root_domain in $free_subdomain_hosts
      • .href_url.domain.domain in $url_shorteners
      • .href_url.domain.domain in $social_landing_hosts
      • .href_url.domain.root_domain in $social_landing_hosts
      • .href_url.domain.root_domain in ('hubspotlinks.com', 'mandrillapp.com', 'sendgrid.net', 'rs6.net')
      • all of:
        • .href_url.domain.sld is 'google'
        • .href_url.path starts with '/amp/'
      • any of recipients.to where all hold:
        • strings.icontains(.href_url.url)
        • .email.domain.valid
      • .href_url.domain.root_domain is 'beehiiv.com'
    • any of:
      • .href_url.domain.root_domain not in ('svc.ms', 'sharepoint.com', '1drv.ms', 'microsoft.com', 'aka.ms', 'msftauthimages.net', 'mimecastprotect.com', 'office.com', 'microsoftproject.com')
      • any of body.links where:
        • .href_url.domain.domain in $free_file_hosts
    • .href_url.domain.root_domain not in $org_domains
    • .href_url.domain.valid
    • .display_text matches '(?:go.?to|view|show|display|access|open.?in|review.?on) (teams?|planner|group|task|intranet|discussions?)'
  3. any of:
    • length(headers.references) is 0
    • headers.in_reply_to is missing
  4. all of attachments where all hold:
    • .file_type in $file_types_images
    • beta.parse_exif(.).image_height / beta.parse_exif(.).image_width > 0.9
    • beta.parse_exif(.).image_height + beta.parse_exif(.).image_width < 500
  5. any of:
    • at least 2 of:
      • body.current_thread.text matches '*assigned*new team*'
      • body.current_thread.text matches '*Microsoft Office 365*'
      • body.current_thread.text matches '*internal planner*'
      • body.current_thread.text matches '*internal task*'
      • any of recipients.to where:
        • strings.icontains(body.current_thread.text)
    • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence in ('medium', 'high')
    • all of:
      • length(distinct(body.links, .href_url.domain.root_domain)) is 1
      • all of:
        • length(body.links) > 2
        • length(body.links) < 10
      • all of body.links where:
        • .href_url.domain.root_domain is not sender.email.domain.root_domain
  6. not:
    • all of:
      • headers.auth_summary.dmarc.pass
      • sender.email.domain.root_domain in ('bing.com', 'microsoft.com', 'microsoftonline.com', 'microsoftproject.com', 'microsoftstoreemail.com', 'microsoftsupport.com', 'microsoft365.com', 'office.com', 'office365.com', 'onedrive.com', 'sharepointonline.com', 'yammer.com', 'outlign.co')
  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. any of:
    • not:
      • profile.by_sender().solicited
    • all of:
      • profile.by_sender().any_messages_malicious_or_spam
      • not:
        • profile.by_sender().any_messages_benign
  9. not:
    • profile.by_sender().any_messages_benign
  10. not:
    • body.current_thread.text matches '(schedul(e|ing)|set up).{0,20}(call|meeting|demo|zoom|conversation|time|tool|discussion)|book.{0,10}(meeting|demo|call|slot|time)|connect.{0,12}(with me|phone|email)|my.{0,10}(calendar|cal)|reserve.{0,10}s[pl]ot|break the ice|want to know more?|miss your chance|if you no longer wish|if you no longer want|if you wish to opt out|low-code (development|approach|solution|journey|platform)|invite.{0,30}(webinar|presentation)'

Inspects: attachments[].file_type, body.current_thread.text, body.links, body.links[].display_text, body.links[].href_url.domain.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.domain.sld, body.links[].href_url.domain.valid, body.links[].href_url.path, body.links[].href_url.url, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, recipients.to, recipients.to[].email.domain.sld, recipients.to[].email.domain.valid, recipients.to[].email.email, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, profile.by_sender, regex.icontains, strings.icontains, strings.ilike, strings.starts_with. Reference lists: $file_types_images, $free_file_hosts, $free_subdomain_hosts, $high_trust_sender_root_domains, $org_domains, $social_landing_hosts, $tranco_1m, $url_shorteners.

Indicators matched (15)

FieldMatchValue
body.links[].href_url.domain.root_domainmemberhubspotlinks.com
body.links[].href_url.domain.root_domainmembermandrillapp.com
body.links[].href_url.domain.root_domainmembersendgrid.net
body.links[].href_url.domain.root_domainmemberrs6.net
body.links[].href_url.domain.sldequalsgoogle
strings.starts_withprefix/amp/
body.links[].href_url.domain.root_domainequalsbeehiiv.com
regex.icontainsregex(?:go.?to|view|show|display|access|open.?in|review.?on) (teams?|planner|group|task|intranet|discussions?)
strings.ilikesubstring*assigned*new team*
strings.ilikesubstring*Microsoft Office 365*
strings.ilikesubstring*internal planner*
strings.ilikesubstring*internal task*
3 more
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidencemembermedium
ml.nlu_classifier(body.current_thread.text).intents[].confidencememberhigh

Stages and Predicates

Stage 1: mql_rule

and
  any(body.links)
    and
      or
        any(recipients.to)
          and
            recipients.to.email.domain.valid eq "true"
            strings.icontains func_call "strings.icontains(body.links[].href_url.url)"
        and
          body.links.href_url.domain.sld eq "google"
          body.links.href_url.path starts_with "/amp/"
        body.links.href_url.domain.root_domain eq "beehiiv.com"
        body.links.href_url.domain.root_domain in ["hubspotlinks.com", "mandrillapp.com", "rs6.net", "sendgrid.net"]
         macro "body.links[].href_url.domain.domain in free_file_hosts"
         macro "body.links[].href_url.domain.domain in social_landing_hosts"
         macro "body.links[].href_url.domain.domain in url_shorteners"
         macro "body.links[].href_url.domain.root_domain in free_file_hosts"
         macro "body.links[].href_url.domain.root_domain in free_subdomain_hosts"
         macro "body.links[].href_url.domain.root_domain in social_landing_hosts"
         macro "body.links[].href_url.domain.root_domain not in tranco_1m"
      or
        not
          body.links.href_url.domain.root_domain in ["1drv.ms", "aka.ms", "microsoft.com", "microsoftproject.com", "mimecastprotect.com", "msftauthimages.net", "office.com", "sharepoint.com", "svc.ms"]
        any(body.links)
           macro "body.links[].href_url.domain.domain in free_file_hosts"
      body.links.display_text regex_match "(?:go.?to|view|show|display|access|open.?in|review.?on) (teams?|planner|group|task|intranet|discussions?)"
      body.links.href_url.domain.valid eq "true"
       macro "body.links[].href_url.domain.root_domain not in org_domains"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence in ["high", "medium"]
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
    and
      body.links length_compare "10"
      body.links length_compare "2"
      distinct(body.links, .href_url.domain.root_domain) length_compare "1"
       macro "all(body.links)"
    any(recipients.to)
      strings.icontains func_call "strings.icontains(body.current_thread.text)"
    body.current_thread.text match "Microsoft Office 365"
    body.current_thread.text match "internal planner"
    body.current_thread.text match "internal task"
    body.current_thread.text wildcard "*assigned*new team*"
  or
    and
      not
        profile.by_sender func_call "profile.by_sender().any_messages_benign"
      profile.by_sender func_call "profile.by_sender().any_messages_malicious_or_spam"
    not
      profile.by_sender func_call "profile.by_sender().solicited"
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["bing.com", "microsoft.com", "microsoft365.com", "microsoftonline.com", "microsoftproject.com", "microsoftstoreemail.com", "microsoftsupport.com", "office.com", "office365.com", "onedrive.com", "outlign.co", "sharepointonline.com", "yammer.com"]
  not
    body.current_thread.text regex_match "(schedul(e|ing)|set up).{0,20}(call|meeting|demo|zoom|conversation|time|tool|discussion)|book.{0,10}(meeting|demo|call|slot|time)|connect.{0,12}(with me|phone|email)|my.{0,10}(calendar|cal)|reserve.{0,10}s[pl]ot|break the ice|want to know more?|miss your chance|if you no longer wish|if you no longer want|if you wish to opt out|low-code (development|approach|solution|journey|platform)|invite.{0,30}(webinar|presentation)"
  or
    headers.in_reply_to is_null
    headers.references length_compare "0"
  not
    profile.by_sender func_call "profile.by_sender().any_messages_benign"
  type.inbound eq "true"
   macro "all(attachments)"

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_domaininbing.com, microsoft.com, microsoft365.com, microsoftonline.com, microsoftproject.com, microsoftstoreemail.com, microsoftsupport.com, office.com, office365.com, onedrive.com, outlign.co, sharepointonline.com, yammer.comexcludes:sender.email.domain.root_domain
body.current_thread.textregex_match(schedul(e|ing)|set up).{0,20}(call|meeting|demo|zoom|conversation|time|tool|discussion), book.{0,10}(meeting|demo|call|slot|time), connect.{0,12}(with me|phone|email), my.{0,10}(calendar|cal), reserve.{0,10}s[pl]ot, break the ice, want to know more?, miss your chance, if you no longer wish, if you no longer want, if you wish to opt out, low-code (development|approach|solution|journey|platform), invite.{0,30}(webinar|presentation)excludes:body.current_thread.text

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textwildcard
  • *Microsoft Office 365*
  • *assigned*new team*
  • *internal planner*
  • *internal task*
field:"body.current_thread.text" kind:wildcard
headers.in_reply_tois_null
  • (no value, null check)
field:"headers.in_reply_to" kind:is_null
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Morgan Stanley

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

Detects messages impersonating Morgan Stanley that contain indicators of credential theft or callback scams, including references to secure email systems, client service centers, financial advisors, and registration processes. The rule identifies spoofed communications by checking for Morgan Stanley branding elements while excluding legitimate domains.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • headers.domains
  • headers.hops
  • sender.email
  • type

Rule body

type.inbound
and (
  strings.ilike(strings.replace_confusables(sender.display_name),
                '*morgan stanley*',
                '*morganstanley*'
  )
  or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                          'morgan stanley'
  ) <= 2
  or any(ml.nlu_classifier(body.current_thread.text).entities,
         .name in ("org", "sender")
         and strings.icontains(.text, 'Morgan Stanley')
  )
  or strings.icontains(body.current_thread.text,
                       'secure.emailhelp@morganstanley.com'
  )
)
and strings.icontains(body.current_thread.text, "Morgan Stanley")
and 3 of (
  strings.icontains(body.current_thread.text, "Client Service Center"),
  regex.icontains(body.current_thread.text,
                  'Financial Advis?or\s*[|/]\s*(?:Portfolio\s+)?Manager'
  ),
  regex.icontains(body.current_thread.text, 'Secure (?:E-)?Mail'),
  strings.icontains(body.current_thread.text, "Click here to view"),
  strings.icontains(body.current_thread.text, "encrypted messages"),
  strings.icontains(body.current_thread.text, "1-800-780-0256"),
  strings.icontains(body.current_thread.text,
                    "secure.emailhelp@morganstanley.com"
  ),
  regex.icontains(body.current_thread.text,
                  'Morgan Stanley\s+(?:Smith Barney|Wealth Management|\w+\s+Team)'
  ),
  strings.icontains(body.current_thread.text, "one-time registration"),
  strings.icontains(body.current_thread.text, "see payment activity"),
  regex.icontains(body.current_thread.text,
                  'link will expire on \d{4}-\d{2}-\d{2}'
  ),
  any(ml.nlu_classifier(body.current_thread.text).intents,
      .name in ("cred_theft", "callback_scam") and .confidence == "high"
  )
)
and not (
  sender.email.domain.root_domain in ("docusign.net", "morganstanley.com", )
  and coalesce(headers.auth_summary.dmarc.pass, false)
)
and not (
  any(headers.hops,
      any(.fields,
          .name == "X-ProofpointSecure"
          and strings.icontains(.value, "Encrypted")
      )
  )
  and any(headers.domains, .root_domain == "pphosted.com")
)

Detection logic

Scope: inbound message.

Detects messages impersonating Morgan Stanley that contain indicators of credential theft or callback scams, including references to secure email systems, client service centers, financial advisors, and registration processes. The rule identifies spoofed communications by checking for Morgan Stanley branding elements while excluding legitimate domains.

  1. inbound message
  2. any of:
    • strings.replace_confusables(sender.display_name) matches any of 2 patterns
      • *morgan stanley*
      • *morganstanley*
    • strings.replace_confusables(sender.display_name) is similar to 'morgan stanley'
    • any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
      • .name in ('org', 'sender')
      • .text contains 'Morgan Stanley'
    • body.current_thread.text contains 'secure.emailhelp@morganstanley.com'
  3. body.current_thread.text contains 'Morgan Stanley'
  4. at least 3 of:
    • body.current_thread.text contains 'Client Service Center'
    • body.current_thread.text matches 'Financial Advis?or\\s*[|/]\\s*(?:Portfolio\\s+)?Manager'
    • body.current_thread.text matches 'Secure (?:E-)?Mail'
    • body.current_thread.text contains 'Click here to view'
    • body.current_thread.text contains 'encrypted messages'
    • body.current_thread.text contains '1-800-780-0256'
    • body.current_thread.text contains 'secure.emailhelp@morganstanley.com'
    • body.current_thread.text matches 'Morgan Stanley\\s+(?:Smith Barney|Wealth Management|\\w+\\s+Team)'
    • body.current_thread.text contains 'one-time registration'
    • body.current_thread.text contains 'see payment activity'
    • body.current_thread.text matches 'link will expire on \\d{4}-\\d{2}-\\d{2}'
    • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
      • .name in ('cred_theft', 'callback_scam')
      • .confidence is 'high'
  5. not:
    • all of:
      • sender.email.domain.root_domain in ('docusign.net', 'morganstanley.com')
      • coalesce(headers.auth_summary.dmarc.pass)
  6. not:
    • all of:
      • any of headers.hops where:
        • any of .fields where all hold:
          • .name is 'X-ProofpointSecure'
          • .value contains 'Encrypted'
      • any of headers.domains where:
        • .root_domain is 'pphosted.com'

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.domains, headers.domains[].root_domain, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains, strings.ilevenshtein, strings.ilike, strings.replace_confusables.

Indicators matched (20)

FieldMatchValue
strings.ilikesubstring*morgan stanley*
strings.ilikesubstring*morganstanley*
strings.ilevenshteinfuzzymorgan stanley
ml.nlu_classifier(body.current_thread.text).entities[].namememberorg
ml.nlu_classifier(body.current_thread.text).entities[].namemembersender
strings.icontainssubstringMorgan Stanley
strings.icontainssubstringsecure.emailhelp@morganstanley.com
strings.icontainssubstringClient Service Center
regex.icontainsregexFinancial Advis?or\s*[|/]\s*(?:Portfolio\s+)?Manager
regex.icontainsregexSecure (?:E-)?Mail
strings.icontainssubstringClick here to view
strings.icontainssubstringencrypted messages
8 more
strings.icontainssubstring1-800-780-0256
regex.icontainsregexMorgan Stanley\s+(?:Smith Barney|Wealth Management|\w+\s+Team)
strings.icontainssubstringone-time registration
strings.icontainssubstringsee payment activity
regex.icontainsregexlink will expire on \d{4}-\d{2}-\d{2}
ml.nlu_classifier(body.current_thread.text).intents[].namemembercred_theft
ml.nlu_classifier(body.current_thread.text).intents[].namemembercallback_scam
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh

Stages and Predicates

Stage 1: mql_rule

and
  not
    and
      any(headers.hops)
        any(headers.hops.fields)
          and
            headers.hops.fields[].name eq "X-ProofpointSecure"
            headers.hops.fields[].value contains "Encrypted"
      any(headers.domains)
        headers.domains.root_domain eq "pphosted.com"
  or
    any(ml.nlu_classifier(body.current_thread.text).entities)
      and
        ml.nlu_classifier(body.current_thread.text).entities.name in ["org", "sender"]
        ml.nlu_classifier(body.current_thread.text).entities.text contains "Morgan Stanley"
    body.current_thread.text contains "secure.emailhelp@morganstanley.com"
    strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"morgan stanley\") <= 2"
    strings.replace_confusables(sender.display_name) match "morgan stanley"
    strings.replace_confusables(sender.display_name) match "morganstanley"
  or
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name in ["callback_scam", "cred_theft"]
    body.current_thread.text contains "1-800-780-0256"
    body.current_thread.text contains "Click here to view"
    body.current_thread.text contains "Client Service Center"
    body.current_thread.text contains "encrypted messages"
    body.current_thread.text contains "one-time registration"
    body.current_thread.text contains "secure.emailhelp@morganstanley.com"
    body.current_thread.text contains "see payment activity"
    body.current_thread.text regex_match "Financial Advis?or\\s*[|/]\\s*(?:Portfolio\\s+)?Manager"
    body.current_thread.text regex_match "Morgan Stanley\\s+(?:Smith Barney|Wealth Management|\\w+\\s+Team)"
    body.current_thread.text regex_match "Secure (?:E-)?Mail"
    body.current_thread.text regex_match "link will expire on \\d{4}-\\d{2}-\\d{2}"
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
      sender.email.domain.root_domain in ["docusign.net", "morganstanley.com"]
  body.current_thread.text contains "Morgan Stanley"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.hopsarray_any(no value, null check)excludes:headers.hops
headers.domainsarray_any(no value, null check)excludes:headers.domains
sender.email.domain.root_domainindocusign.net, morganstanley.comexcludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"docusign.net" field:"sender.email.domain.root_domain" value:"morganstanley.com"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textcontains
  • 1-800-780-0256
  • Click here to view
  • Client Service Center
  • Morgan Stanley
  • encrypted messages
  • one-time registration
  • secure.emailhelp@morganstanley.com
  • see payment activity
field:"body.current_thread.text" kind:contains
body.current_thread.textregex_match
  • Financial Advis?or\s*[|/]\s*(?:Portfolio\s+)?Manager
  • Morgan Stanley\s+(?:Smith Barney|Wealth Management|\w+\s+Team)
  • Secure (?:E-)?Mail
  • link will expire on \d{4}-\d{2}-\d{2}
field:"body.current_thread.text" kind:regex_match
strings.replace_confusables(sender.display_name)wildcard
  • *morgan stanley*
  • *morganstanley*
field:"strings.replace_confusables(sender.display_name)" kind:wildcard
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Navan

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

Impersonation of the expense management provider Navan.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering, Spoofing

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  regex.icontains(sender.display_name, '(?:The\s+)?\bNavan\b(?:\s+Team)?')
  or strings.ilike(sender.email.domain.domain, '*Navan*')
  or 2 of (
    strings.icontains(body.current_thread.text, 'Navan'),
    strings.icontains(body.current_thread.text, '3045 Park Blvd'),
    strings.icontains(body.current_thread.text, 'Palo Alto, CA 94306')
  )
)
and (
  any(ml.logo_detect(file.message_screenshot()).brands,
      .name == "Navan" and .confidence in ("medium", "high")
  )
  or (
    regex.icontains(subject.subject,
                    "(?:unrecognized|Unusual|suspicious|unknown) (?:log|sign).?[io]n attempt",
                    "(?:important|urgent|attention|alert) account|accessed|[new|unrecognized|suspicious] location"
    )
    or any(ml.nlu_classifier(body.current_thread.text).entities,
           .name == "urgency"
    )
    or any(ml.nlu_classifier(body.current_thread.text).intents,
           .name in ("cred_theft", "steal_pii")
    )
  )
)
and sender.email.domain.root_domain not in~ ('navan.com')

// 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
)
and (
  not profile.by_sender().solicited
  or (
    profile.by_sender().any_messages_malicious_or_spam
    and not profile.by_sender().any_messages_benign
  )
)
and not profile.by_sender().any_messages_benign

Detection logic

Scope: inbound message.

Impersonation of the expense management provider Navan.

  1. inbound message
  2. any of:
    • sender.display_name matches '(?:The\\s+)?\\bNavan\\b(?:\\s+Team)?'
    • sender.email.domain.domain matches '*Navan*'
    • at least 2 of:
      • body.current_thread.text contains 'Navan'
      • body.current_thread.text contains '3045 Park Blvd'
      • body.current_thread.text contains 'Palo Alto, CA 94306'
  3. any of:
    • any of ml.logo_detect(file.message_screenshot()).brands where all hold:
      • .name is 'Navan'
      • .confidence in ('medium', 'high')
    • any of:
      • subject.subject matches any of 2 patterns
        • (?:unrecognized|Unusual|suspicious|unknown) (?:log|sign).?[io]n attempt
        • (?:important|urgent|attention|alert) account|accessed|[new|unrecognized|suspicious] location
      • any of ml.nlu_classifier(body.current_thread.text).entities where:
        • .name is 'urgency'
      • any of ml.nlu_classifier(body.current_thread.text).intents where:
        • .name in ('cred_theft', 'steal_pii')
  4. sender.email.domain.root_domain not in ('navan.com')
  5. 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
  6. any of:
    • not:
      • profile.by_sender().solicited
    • all of:
      • profile.by_sender().any_messages_malicious_or_spam
      • not:
        • profile.by_sender().any_messages_benign
  7. not:
    • profile.by_sender().any_messages_benign

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, regex.icontains, strings.icontains, strings.ilike. Reference lists: $high_trust_sender_root_domains.

Indicators matched (13)

FieldMatchValue
regex.icontainsregex(?:The\s+)?\bNavan\b(?:\s+Team)?
strings.ilikesubstring*Navan*
strings.icontainssubstringNavan
strings.icontainssubstring3045 Park Blvd
strings.icontainssubstringPalo Alto, CA 94306
ml.logo_detect(file.message_screenshot()).brands[].nameequalsNavan
ml.logo_detect(file.message_screenshot()).brands[].confidencemembermedium
ml.logo_detect(file.message_screenshot()).brands[].confidencememberhigh
regex.icontainsregex(?:unrecognized|Unusual|suspicious|unknown) (?:log|sign).?[io]n attempt
regex.icontainsregex(?:important|urgent|attention|alert) account|accessed|[new|unrecognized|suspicious] location
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsurgency
ml.nlu_classifier(body.current_thread.text).intents[].namemembercred_theft
1 more
ml.nlu_classifier(body.current_thread.text).intents[].namemembersteal_pii

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    any(ml.logo_detect(file.message_screenshot()).brands)
      and
        ml.logo_detect(file.message_screenshot()).brands.confidence in ["high", "medium"]
        ml.logo_detect(file.message_screenshot()).brands.name eq "Navan"
    any(ml.nlu_classifier(body.current_thread.text).entities)
      ml.nlu_classifier(body.current_thread.text).entities.name eq "urgency"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      ml.nlu_classifier(body.current_thread.text).intents.name in ["cred_theft", "steal_pii"]
    subject.subject regex_match "(?:important|urgent|attention|alert) account|accessed|[new|unrecognized|suspicious] location"
    subject.subject regex_match "(?:unrecognized|Unusual|suspicious|unknown) (?:log|sign).?[io]n attempt"
  or
    and
      not
        profile.by_sender func_call "profile.by_sender().any_messages_benign"
      profile.by_sender func_call "profile.by_sender().any_messages_malicious_or_spam"
    not
      profile.by_sender func_call "profile.by_sender().solicited"
  or
    body.current_thread.text contains "3045 Park Blvd"
    body.current_thread.text contains "Navan"
    body.current_thread.text contains "Palo Alto, CA 94306"
    sender.display_name regex_match "(?:The\\s+)?\\bNavan\\b(?:\\s+Team)?"
    sender.email.domain.domain match "Navan"
  not
    profile.by_sender func_call "profile.by_sender().any_messages_benign"
  not
    sender.email.domain.root_domain eq "navan.com"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
sender.email.domain.root_domaineqnavan.comexcludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"navan.com"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textcontains
  • 3045 Park Blvd
  • Navan
  • Palo Alto, CA 94306
field:"body.current_thread.text" kind:contains
sender.display_nameregex_match
  • (?:The\s+)?\bNavan\b(?:\s+Team)?
field:"sender.display_name" kind:regex_match value:"(?:The\s+)?\bNavan\b(?:\s+Team)?"
sender.email.domain.domainwildcard
  • *Navan*
field:"sender.email.domain.domain" kind:wildcard value:"*Navan*"
subject.subjectregex_match
    • (?:important|urgent|attention|alert) account
    • accessed
    • [new|unrecognized|suspicious] location
  • (?:unrecognized|Unusual|suspicious|unknown) (?:log|sign).?[io]n attempt
field:"subject.subject" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand Impersonation: OpenAI with ChatGPT Ads lure

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

Detects messages impersonating OpenAI or ChatGPT, that contain specific references to ChatGPT Ads. Observed harvesting advertisting account credentials.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  // sender or subject contains openai or chatgpt
  regex.icontains(sender.display_name, '\bchat\s*gpt\b')
  or regex.icontains(sender.display_name, '\bopen\s*a[li]\b')
  or regex.icontains(subject.subject, '\bchat\s*gpt\b')
  or regex.icontains(subject.subject, '\bopen\s*a[li]\b')
  or regex.icontains(body.current_thread.text,
                     '(?:regarding\s*your\s*Open\s*A[lI]\s*account|Open\s*A[lI]\s*\.\s*All\s*rights\s*reserved|the\s*open\s*ai\s*team)'
  )
  // display name references OpenAI CEO Sam Altman
  or strings.icontains(sender.display_name, "Sam Altman")
  // OpenAI mailing address
  or regex.icontains(body.current_thread.text,
                     '3180 18(?:th)? St(?:reet)?,? San Francisco,? (?:CA|California)'
  )
)
and 2 of (
  regex.icontains(body.current_thread.text, 'ChatGPT.{0,15}Ads'),
  strings.icontains(body.current_thread.text, "ad account"),
  strings.icontains(body.current_thread.text, "connect account"),
  strings.icontains(body.current_thread.text, "ad campaign"),
  strings.icontains(body.current_thread.text, "invitation"),
)
// suspicious sender domain
and (
  regex.icontains(sender.email.domain.domain, '(?:open.?ai|chat.?gpt)')
  or network.whois(sender.email.domain).days_old < 365
)
// negate highly trusted sender domains unless they fail DMARC authentication
and not (
  sender.email.domain.root_domain in $high_trust_sender_root_domains
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

Detection logic

Scope: inbound message.

Detects messages impersonating OpenAI or ChatGPT, that contain specific references to ChatGPT Ads. Observed harvesting advertisting account credentials.

  1. inbound message
  2. any of:
    • sender.display_name matches '\\bchat\\s*gpt\\b'
    • sender.display_name matches '\\bopen\\s*a[li]\\b'
    • subject.subject matches '\\bchat\\s*gpt\\b'
    • subject.subject matches '\\bopen\\s*a[li]\\b'
    • body.current_thread.text matches '(?:regarding\\s*your\\s*Open\\s*A[lI]\\s*account|Open\\s*A[lI]\\s*\\.\\s*All\\s*rights\\s*reserved|the\\s*open\\s*ai\\s*team)'
    • sender.display_name contains 'Sam Altman'
    • body.current_thread.text matches '3180 18(?:th)? St(?:reet)?,? San Francisco,? (?:CA|California)'
  3. at least 2 of:
    • body.current_thread.text matches 'ChatGPT.{0,15}Ads'
    • body.current_thread.text contains 'ad account'
    • body.current_thread.text contains 'connect account'
    • body.current_thread.text contains 'ad campaign'
    • body.current_thread.text contains 'invitation'
  4. any of:
    • sender.email.domain.domain matches '(?:open.?ai|chat.?gpt)'
    • network.whois(sender.email.domain).days_old < 365
  5. not:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • coalesce(headers.auth_summary.dmarc.pass)

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain, sender.email.domain.domain, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: network.whois, regex.icontains, strings.icontains. Reference lists: $high_trust_sender_root_domains.

Indicators matched (11)

FieldMatchValue
regex.icontainsregex\bchat\s*gpt\b
regex.icontainsregex\bopen\s*a[li]\b
regex.icontainsregex(?:regarding\s*your\s*Open\s*A[lI]\s*account|Open\s*A[lI]\s*\.\s*All\s*rights\s*reserved|the\s*open\s*ai\s*team)
strings.icontainssubstringSam Altman
regex.icontainsregex3180 18(?:th)? St(?:reet)?,? San Francisco,? (?:CA|California)
regex.icontainsregexChatGPT.{0,15}Ads
strings.icontainssubstringad account
strings.icontainssubstringconnect account
strings.icontainssubstringad campaign
strings.icontainssubstringinvitation
regex.icontainsregex(?:open.?ai|chat.?gpt)

Stages and Predicates

Stage 1: mql_rule

and
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
  or
    body.current_thread.text contains "ad account"
    body.current_thread.text contains "ad campaign"
    body.current_thread.text contains "connect account"
    body.current_thread.text contains "invitation"
    body.current_thread.text regex_match "ChatGPT.{0,15}Ads"
  or
    body.current_thread.text regex_match "(?:regarding\\s*your\\s*Open\\s*A[lI]\\s*account|Open\\s*A[lI]\\s*\\.\\s*All\\s*rights\\s*reserved|the\\s*open\\s*ai\\s*team)"
    body.current_thread.text regex_match "3180 18(?:th)? St(?:reet)?,? San Francisco,? (?:CA|California)"
    sender.display_name contains "Sam Altman"
    sender.display_name regex_match "\\bchat\\s*gpt\\b"
    sender.display_name regex_match "\\bopen\\s*a[li]\\b"
    subject.subject regex_match "\\bchat\\s*gpt\\b"
    subject.subject regex_match "\\bopen\\s*a[li]\\b"
  or
    network.whois func_call "network.whois(sender.email.domain).days_old < 365"
    sender.email.domain.domain regex_match "(?:open.?ai|chat.?gpt)"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textcontains
  • ad account
  • ad campaign
  • connect account
  • invitation
field:"body.current_thread.text" kind:contains
body.current_thread.textregex_match
  • (?:regarding\s*your\s*Open\s*A[lI]\s*account|Open\s*A[lI]\s*.\s*All\s*rights\s*reserved|the\s*open\s*ai\s*team)
  • 3180 18(?:th)? St(?:reet)?,? San Francisco,? (?:CA|California)
  • ChatGPT.{0,15}Ads
field:"body.current_thread.text" kind:regex_match
sender.display_namecontains
  • Sam Altman
field:"sender.display_name" kind:contains value:"Sam Altman"
sender.display_nameregex_match
  • \bchat\s*gpt\b
  • \bopen\s*a[li]\b
field:"sender.display_name" kind:regex_match
sender.email.domain.domainregex_match
  • (?:open.?ai|chat.?gpt)
field:"sender.email.domain.domain" kind:regex_match value:"(?:open.?ai|chat.?gpt)"
subject.subjectregex_match
  • \bchat\s*gpt\b
  • \bopen\s*a[li]\b
field:"subject.subject" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Paperless Post

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

Detects messages containing multiple images hosted on ppassets.com (Paperless Post's asset domain) but with fewer than 3 legitimate Paperless Post links, while excluding authentic forwards/replies and messages from verified Paperless Post domains with valid DMARC authentication.

Threat classification

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

CategoryValues
Attack typesCredential Phishing, Malware/Ransomware
Tactics and techniquesImpersonation: Brand

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.html
  • body.links
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and strings.contains(body.html.raw, 'ppassets.com')
and length(filter(html.xpath(body.html, '//img/@src').nodes,
                  // calling parse_url allows url decoding to help us
                  strings.parse_url(.raw).domain.root_domain == 'ppassets.com'
           )
) >= 2
and (
  length(filter(body.links,
                .href_url.domain.domain == "links.paperlesspost.com"
                or (
                  .href_url.domain.root_domain == "paperlesspost.com"
                  and strings.istarts_with(.href_url.path, '/go/')
                )
         )
  ) < 2
  or any(body.links,
         regex.icontains(.display_text, '(?:view the card|view and reply)')
         and .href_url.domain.root_domain != "paperlesspost.com"
  )
)
and not (
  (subject.is_forward or subject.is_reply)
  and (
    (length(headers.references) != 0 or headers.in_reply_to is not null)
    or length(body.previous_threads) > 0
  )
)
and not (
  sender.email.domain.root_domain == "paperlesspost.com"
  and headers.auth_summary.dmarc.pass
)

Detection logic

Scope: inbound message.

Detects messages containing multiple images hosted on ppassets.com (Paperless Post's asset domain) but with fewer than 3 legitimate Paperless Post links, while excluding authentic forwards/replies and messages from verified Paperless Post domains with valid DMARC authentication.

  1. inbound message
  2. body.html.raw contains 'ppassets.com'
  3. length(filter(html.xpath(body.html, '//img/@src').nodes, strings.parse_url(.raw).domain.root_domain == 'ppassets.com')) ≥ 2
  4. any of:
    • length(filter(body.links, .href_url.domain.domain == 'links.paperlesspost.com' or .href_url.domain.root_domain == 'paperlesspost.com' and strings.istarts_with(.href_url.path, '/go/'))) < 2
    • any of body.links where all hold:
      • .display_text matches '(?:view the card|view and reply)'
      • .href_url.domain.root_domain is not 'paperlesspost.com'
  5. not:
    • all of:
      • any of:
        • subject.is_forward
        • subject.is_reply
      • any of:
        • any of:
          • length(headers.references) is not 0
          • headers.in_reply_to is set
        • length(body.previous_threads) > 0
  6. not:
    • all of:
      • sender.email.domain.root_domain is 'paperlesspost.com'
      • headers.auth_summary.dmarc.pass

Inspects: body.html, body.html.raw, body.links, body.links[].display_text, body.links[].href_url.domain.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.previous_threads, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: html.xpath, regex.icontains, strings.contains, strings.istarts_with, strings.parse_url.

Indicators matched (5)

FieldMatchValue
strings.containssubstringppassets.com
body.links[].href_url.domain.domainequalslinks.paperlesspost.com
body.links[].href_url.domain.root_domainequalspaperlesspost.com
strings.istarts_withprefix/go/
regex.icontainsregex(?:view the card|view and reply)

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(body.links)
      and
        body.links.display_text regex_match "(?:view the card|view and reply)"
        body.links.href_url.domain.root_domain ne "paperlesspost.com"
    filter(body.links, .href_url.domain.domain == 'links.paperlesspost.com' or .href_url.domain.root_domain == 'paperlesspost.com' and strings.istarts_with(.href_url.path, '/go/')) length_compare "2"
  not
    and
      or
        body.previous_threads length_compare "0"
        headers.in_reply_to is_not_null
        headers.references length_compare "0"
      or
        subject.is_forward eq "true"
        subject.is_reply eq "true"
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain eq "paperlesspost.com"
  body.html.raw contains "ppassets.com"
  filter(html.xpath(body.html, '//img/@src').nodes, strings.parse_url(.raw).domain.root_domain == 'ppassets.com') length_compare "2"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

Brand Impersonation: Procore

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

Detects messages containing Procore branding language that do not originate from legitimate Procore domains. This has been observed in phishing campaigns.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Credential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and (
  strings.ilike(body.current_thread.text, "*powered by procore*")
  or 2 of (
    strings.icontains(body.current_thread.text, 'Procore'),
    strings.icontains(body.current_thread.text, '6309 Carpinteria Ave'),
    strings.icontains(body.current_thread.text, 'Carpinteria, CA 93013')
  )
  or (
    strings.iends_with(sender.display_name, 'via Procore')
    and any(body.current_thread.links,
            .href_url.domain.root_domain in $free_subdomain_hosts
    )
  )
)
and not (
  sender.email.domain.root_domain in ("procore.com", "procoretech.com")
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

// negating legit replies/forwards
and not (
  (
    strings.istarts_with(subject.subject, "RE:")
    or strings.istarts_with(subject.subject, "FW:")
    or strings.istarts_with(subject.subject, "FWD:")
    or regex.imatch(subject.subject,
                    '(\[[^\]]+\]\s?){0,3}(re|fwd?|automat.*)\s?:.*'
    )
    or strings.istarts_with(subject.subject, "Réponse automatique")
  )
  and (length(headers.references) > 0 and headers.in_reply_to is not null)
)
// negate bounce backs
and not (
  strings.like(sender.email.local_part,
               "*postmaster*",
               "*mailer-daemon*",
               "*administrator*"
  )
  and any(attachments,
          .content_type in (
            "message/rfc822",
            "message/delivery-status",
            "text/calendar"
          )
  )
)

Detection logic

Scope: inbound message.

Detects messages containing Procore branding language that do not originate from legitimate Procore domains. This has been observed in phishing campaigns.

  1. inbound message
  2. any of:
    • body.current_thread.text matches '*powered by procore*'
    • at least 2 of:
      • body.current_thread.text contains 'Procore'
      • body.current_thread.text contains '6309 Carpinteria Ave'
      • body.current_thread.text contains 'Carpinteria, CA 93013'
    • all of:
      • sender.display_name ends with 'via Procore'
      • any of body.current_thread.links where:
        • .href_url.domain.root_domain in $free_subdomain_hosts
  3. not:
    • all of:
      • sender.email.domain.root_domain in ('procore.com', 'procoretech.com')
      • coalesce(headers.auth_summary.dmarc.pass)
  4. not:
    • all of:
      • any of:
        • subject.subject starts with 'RE:'
        • subject.subject starts with 'FW:'
        • subject.subject starts with 'FWD:'
        • subject.subject matches '(\\[[^\\]]+\\]\\s?){0,3}(re|fwd?|automat.*)\\s?:.*'
        • subject.subject starts with 'Réponse automatique'
      • all of:
        • length(headers.references) > 0
        • headers.in_reply_to is set
  5. not:
    • all of:
      • sender.email.local_part matches any of 3 patterns
        • *postmaster*
        • *mailer-daemon*
        • *administrator*
      • any of attachments where:
        • .content_type in ('message/rfc822', 'message/delivery-status', 'text/calendar')

Inspects: attachments[].content_type, body.current_thread.links, body.current_thread.links[].href_url.domain.root_domain, body.current_thread.text, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.display_name, sender.email.domain.root_domain, sender.email.local_part, subject.subject, type.inbound. Sensors: regex.imatch, strings.icontains, strings.iends_with, strings.ilike, strings.istarts_with, strings.like. Reference lists: $free_subdomain_hosts.

Indicators matched (5)

FieldMatchValue
strings.ilikesubstring*powered by procore*
strings.icontainssubstringProcore
strings.icontainssubstring6309 Carpinteria Ave
strings.icontainssubstringCarpinteria, CA 93013
strings.iends_withsuffixvia Procore

Stages and Predicates

Stage 1: mql_rule

and
  not
    and
      any(attachments)
        attachments.content_type in ["message/delivery-status", "message/rfc822", "text/calendar"]
      or
        sender.email.local_part match "administrator"
        sender.email.local_part match "mailer-daemon"
        sender.email.local_part match "postmaster"
  not
    and
      or
        subject.subject regex_match "(\\[[^\\]]+\\]\\s?){0,3}(re|fwd?|automat.*)\\s?:.*"
        subject.subject starts_with "FW:"
        subject.subject starts_with "FWD:"
        subject.subject starts_with "RE:"
        subject.subject starts_with "Réponse automatique"
      headers.in_reply_to is_not_null
      headers.references length_compare "0"
  or
    and
      any(body.current_thread.links)
         macro "body.current_thread.links[].href_url.domain.root_domain in free_subdomain_hosts"
      sender.display_name ends_with "via Procore"
    body.current_thread.text contains "6309 Carpinteria Ave"
    body.current_thread.text contains "Carpinteria, CA 93013"
    body.current_thread.text contains "Procore"
    body.current_thread.text match "powered by procore"
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
      sender.email.domain.root_domain in ["procore.com", "procoretech.com"]
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Proofpoint secure messaging without legitimate indicators

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

Detects messages impersonating Proofpoint secure messaging services that contain Proofpoint branding text but lack legitimate Proofpoint secure sharing URIs or authentic attachment indicators, suggesting fraudulent use of the brand.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • attachments
  • body
  • body.current_thread
  • body.html
  • body.links
  • sender.email
  • type

Rule body

type.inbound
and (
  // matching proofpoint secure messaging
  (
    strings.contains(body.current_thread.text,
                     "Secured by Proofpoint Encryption,"
    )
    and not strings.iends_with(body.current_thread.text,
                               "Secured by Proofpoint Encryption, Copyright © 2009-2016 Proofpoint, Inc. All rights reserved."
    )
  )
  or regex.icontains(body.current_thread.text,
                     ('Copyright © 2009-202\d Proofpoint, Inc.')
  )
  or strings.icontains(body.html.raw, '<h1>Proofpoint |')
  // body.html contains a suspicious title impersonating proofpoint
  or (
    any(html.xpath(body.html, '//title').nodes,
        strings.icontains(.raw, "secure access")
        and strings.icontains(.raw, 'Proofpoint')
    )
  )
  // no links but has attachments which impersonate proofpoint
  or any(attachments,
         strings.icontains(file.parse_text(.).text, '<h1>Proofpoint |')
         or any(html.xpath(file.parse_html(.), '//title').nodes,
                strings.icontains(.raw, "secure access")
                and strings.icontains(.raw, 'Proofpoint')
         )
  )
)
and (
  // contains a link
  length(body.current_thread.links) >= 1
  // or an attachment (legit attachments negated in stanza below)
  or length(attachments) > 0
)

// pfpt secure share uri
and not (
  any(body.links,
      // negate the actual dest of the legit "click here" link
      .href_url.path == "/formpostdir/securereader"
      // negate where the link domain is mimecast and check LA for the pfpt URI
      or (
        .href_url.domain.root_domain == "mimecastprotect.com"
        and (
          ml.link_analysis(., mode="aggressive").effective_url.path == "/formpostdir/securereader"
          or any(ml.link_analysis(., mode="aggressive").redirect_history,
                 .path == "/formpostdir/securereader"
          )
        )
      )
      or (
        .href_url.domain.root_domain == "mimecastprotect.com"
        and .display_text =~ "Click here"
        and strings.parse_domain(.href_url.query_params_decoded["domain"][0]).root_domain == sender.email.domain.root_domain
      )
  )
)
// negate actual SecureMessageAtt.html links that ave been quarantined by mimecast
and not any(attachments,
            // pfpt attachment file
            .file_name == "SecureMessageAtt.html"
            // mimecast quarantine details
            or (
              .content_type == "message/rfc822"
              and length(file.parse_eml(.).body.links) == 1
              and any(file.parse_eml(.).body.links,
                      .display_text == "download it"
                      and .href_url.domain.root_domain == "mimecast.com"
              )
              and strings.ends_with(file.parse_eml(.).headers.message_id,
                                    "@localhost>"
              )
            )
)

Detection logic

Scope: inbound message.

Detects messages impersonating Proofpoint secure messaging services that contain Proofpoint branding text but lack legitimate Proofpoint secure sharing URIs or authentic attachment indicators, suggesting fraudulent use of the brand.

  1. inbound message
  2. any of:
    • all of:
      • body.current_thread.text contains 'Secured by Proofpoint Encryption,'
      • not:
        • body.current_thread.text ends with 'Secured by Proofpoint Encryption, Copyright © 2009-2016 Proofpoint, Inc. All rights reserved.'
    • body.current_thread.text matches 'Copyright © 2009-202\\d Proofpoint, Inc.'
    • body.html.raw contains '<h1>Proofpoint |'
    • any of html.xpath(body.html, '//title').nodes where all hold:
      • .raw contains 'secure access'
      • .raw contains 'Proofpoint'
    • any of attachments where any holds:
      • file.parse_text(.).text contains '<h1>Proofpoint |'
      • any of html.xpath(file.parse_html(.), '//title').nodes where all hold:
        • .raw contains 'secure access'
        • .raw contains 'Proofpoint'
  3. any of:
    • length(body.current_thread.links) ≥ 1
    • length(attachments) > 0
  4. not:
    • any of body.links where any holds:
      • .href_url.path is '/formpostdir/securereader'
      • all of:
        • .href_url.domain.root_domain is 'mimecastprotect.com'
        • any of:
          • ml.link_analysis(.).effective_url.path is '/formpostdir/securereader'
          • any of ml.link_analysis(., mode='aggressive').redirect_history where:
            • .path is '/formpostdir/securereader'
      • all of:
        • .href_url.domain.root_domain is 'mimecastprotect.com'
        • .display_text is 'Click here'
        • strings.parse_domain(.href_url.query_params_decoded['domain'][0]).root_domain is sender.email.domain.root_domain
  5. not:
    • any of attachments where any holds:
      • .file_name is 'SecureMessageAtt.html'
      • all of:
        • .content_type is 'message/rfc822'
        • length(file.parse_eml(.).body.links) is 1
        • any of file.parse_eml(.).body.links where all hold:
          • .display_text is 'download it'
          • .href_url.domain.root_domain is 'mimecast.com'
        • file.parse_eml(.).headers.message_id ends with '@localhost>'

Inspects: attachments[].content_type, attachments[].file_name, body.current_thread.links, body.current_thread.text, body.html, body.html.raw, body.links, body.links[].display_text, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.links[].href_url.query_params_decoded['domain'][0], sender.email.domain.root_domain, type.inbound. Sensors: file.parse_eml, file.parse_html, file.parse_text, html.xpath, ml.link_analysis, regex.icontains, strings.contains, strings.ends_with, strings.icontains, strings.iends_with, strings.parse_domain.

Indicators matched (5)

FieldMatchValue
strings.containssubstringSecured by Proofpoint Encryption,
regex.icontainsregexCopyright © 2009-202\d Proofpoint, Inc.
strings.icontainssubstring<h1>Proofpoint |
strings.icontainssubstringsecure access
strings.icontainssubstringProofpoint

Stages and Predicates

Stage 1: mql_rule

and
  not
    any(attachments)
      or
        and
          any(file.parse_eml(attachments).body.links)
            and
              file.parse_eml(attachments[]).body.links[].display_text eq "download it"
              file.parse_eml(attachments[]).body.links[].href_url.domain.root_domain eq "mimecast.com"
          attachments.content_type eq "message/rfc822"
          file.parse_eml(attachments[]).body.links length_compare "1"
          file.parse_eml(attachments[]).headers.message_id ends_with "@localhost>"
        attachments.file_name eq "SecureMessageAtt.html"
  not
    any(body.links)
      or
        and
          or
            any(ml.link_analysis(body.links, mode='aggressive').redirect_history)
              ml.link_analysis(body.links, mode='aggressive').redirect_history.path eq "/formpostdir/securereader"
            ml.link_analysis func_call "ml.link_analysis(body.links[]).effective_url.path == /formpostdir/securereader"
          body.links.href_url.domain.root_domain eq "mimecastprotect.com"
        and
          body.links.display_text eq "Click here"
          body.links.href_url.domain.root_domain eq "mimecastprotect.com"
          strings.parse_domain func_call "strings.parse_domain(body.links[].href_url.query_params_decoded['domain'][0]).root_domain == sender.email.domain.root_domain"
        body.links.href_url.path eq "/formpostdir/securereader"
  or
    any(attachments)
      or
        any(html.xpath(file.parse_html(attachments), '//title').nodes)
          and
            html.xpath(file.parse_html(attachments[]), '//title').nodes[].raw contains "Proofpoint"
            html.xpath(file.parse_html(attachments[]), '//title').nodes[].raw contains "secure access"
        file.parse_text(attachments[]).text contains "<h1>Proofpoint |"
    and
      not
        body.current_thread.text ends_with "Secured by Proofpoint Encryption, Copyright © 2009-2016 Proofpoint, Inc. All rights reserved."
      body.current_thread.text contains "Secured by Proofpoint Encryption,"
    any(html.xpath(body.html, '//title').nodes)
      and
        html.xpath(body.html, '//title').nodes.raw contains "Proofpoint"
        html.xpath(body.html, '//title').nodes.raw contains "secure access"
    body.current_thread.text regex_match "Copyright © 2009-202\\d Proofpoint, Inc."
    body.html.raw contains "<h1>Proofpoint |"
  or
    attachments length_compare "0"
    body.current_thread.links length_compare "1"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
attachmentsarray_any(no value, null check)excludes:attachments
body.linksarray_any(no value, null check)excludes:body.links

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Punchbowl

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

Detects messages impersonating Punchbowl invitations not originating from legitimate Punchbowl domain.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.html
  • sender.email
  • type

Rule body

type.inbound
// Looking for Punchbowl phrasing in all body threads
and (
  strings.icontains(body.current_thread.text, "punchbowl")
  // Look for alt text in HTML for standardized Punchbowl formatting if string is not avail.
  or strings.icontains(body.html.raw, 'alt="Punchbowl"')
  // image sourced from punchbowl
  or any(html.xpath(body.html, '//img/@src').nodes,
         strings.parse_url(.raw).domain.domain == "static.punchbowl.com"
         and strings.icontains(strings.parse_url(.raw).path,
                               '/invitation',
                               '/invite'
         )
  )
)
// Phrasing is typically "You're invited"
and (
  strings.icontains(body.current_thread.text, "you're invited")
  //
  // 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 (
    regex.icontains(beta.ocr(file.message_screenshot()).text,
                    "you're invited",
                    "open me",
                    "manage invitation"
    )
    and regex.icontains(body.current_thread.text,
                        'don.t want .{1,40}\?',
                        '(?:view|open|click|access).{1,10}(?:computer|(?:lap|desk)top)' // instruction to open link on a computer
    )
  )
  or any([
           html.xpath(body.html,
                      '//a//img[contains(@src, "btn_open_invitation")]'
           ).nodes,
           html.xpath(body.html,
                      '//a//img[contains(@src, "btn_open_save_the_date")]'
           ).nodes,
         ],
         any(.,
             regex.icontains(.inner_text,
                             '(?:open|save).{0,10}(?:invitation|the date)'
             )
         )
  )
)
// Legitimate sender will be from punchbowl, negating known non-associated domains.
and not sender.email.domain.root_domain in ("punchbowl.com", "punchbowl.news")
// Capping length to limit FP's
and length(body.current_thread.text) < 1500

Detection logic

Scope: inbound message.

Detects messages impersonating Punchbowl invitations not originating from legitimate Punchbowl domain.

  1. inbound message
  2. any of:
    • body.current_thread.text contains 'punchbowl'
    • body.html.raw contains 'alt="Punchbowl"'
    • any of html.xpath(body.html, '//img/@src').nodes where all hold:
      • strings.parse_url(.raw).domain.domain is 'static.punchbowl.com'
      • strings.parse_url(.raw).path contains any of 2 patterns
        • /invitation
        • /invite
  3. any of:
    • body.current_thread.text contains "you're invited"
    • all of:
      • beta.ocr(file.message_screenshot()).text matches any of 3 patterns
        • you're invited
        • open me
        • manage invitation
      • body.current_thread.text matches any of 2 patterns
        • don.t want .{1,40}\?
        • (?:view|open|click|access).{1,10}(?:computer|(?:lap|desk)top)
    • any of [html.xpath(body.html, '//a//img[contains(@src, "btn_open_invitation")]').nodes, html.xpath(body.html, '//a//img[contains(@src, "btn_open_save_the_date")]').nodes] where:
      • any of . where:
        • .inner_text matches '(?:open|save).{0,10}(?:invitation|the date)'
  4. not:
    • sender.email.domain.root_domain in ('punchbowl.com', 'punchbowl.news')
  5. length(body.current_thread.text) < 1500

Inspects: body.current_thread.text, body.html, body.html.raw, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, html.xpath, regex.icontains, strings.icontains, strings.parse_url.

Indicators matched (11)

FieldMatchValue
strings.icontainssubstringpunchbowl
strings.icontainssubstringalt="Punchbowl"
strings.icontainssubstring/invitation
strings.icontainssubstring/invite
strings.icontainssubstringyou're invited
regex.icontainsregexyou're invited
regex.icontainsregexopen me
regex.icontainsregexmanage invitation
regex.icontainsregexdon.t want .{1,40}\?
regex.icontainsregex(?:view|open|click|access).{1,10}(?:computer|(?:lap|desk)top)
regex.icontainsregex(?:open|save).{0,10}(?:invitation|the date)

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(html.xpath(body.html, '//img/@src').nodes)
      and
        or
          strings.parse_url(html.xpath(body.html, '//img/@src').nodes[].raw).path contains "/invitation"
          strings.parse_url(html.xpath(body.html, '//img/@src').nodes[].raw).path contains "/invite"
        strings.parse_url func_call "strings.parse_url(html.xpath(body.html, '//img/@src').nodes[].raw).domain.domain == static.punchbowl.com"
    body.current_thread.text contains "punchbowl"
    body.html.raw contains "alt=\"Punchbowl\""
  or
    any([html.xpath(body.html, '//a//img[contains(@src, "btn_open_invitation")]').nodes, html.xpath(body.html, '//a//img[contains(@src, "btn_open_save_the_date")]').nodes])
      any([html.xpath(body.html, '//a//img[contains(@src, "btn_open_invitation")]').nodes, html.xpath(body.html, '//a//img[contains(@src, "btn_open_save_the_date")]').nodes])
        [html.xpath(body.html, '//a//img[contains(@src, "btn_open_invitation")]').nodes, html.xpath(body.html, '//a//img[contains(@src, "btn_open_save_the_date")]').nodes].inner_text regex_match "(?:open|save).{0,10}(?:invitation|the date)"
    and
      or
        beta.ocr(file.message_screenshot()).text regex_match "manage invitation"
        beta.ocr(file.message_screenshot()).text regex_match "open me"
        beta.ocr(file.message_screenshot()).text regex_match "you're invited"
      or
        body.current_thread.text regex_match "(?:view|open|click|access).{1,10}(?:computer|(?:lap|desk)top)"
        body.current_thread.text regex_match "don.t want .{1,40}\\?"
    body.current_thread.text contains "you're invited"
  not
    sender.email.domain.root_domain in ["punchbowl.com", "punchbowl.news"]
  body.current_thread.text length_compare "1500"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
beta.ocr(file.message_screenshot()).textregex_match
  • manage invitation
  • open me
  • you're invited
field:"beta.ocr(file.message_screenshot()).text" kind:regex_match
body.current_thread.textcontains
  • punchbowl
  • you're invited
field:"body.current_thread.text" kind:contains
body.current_thread.textregex_match
  • (?:view|open|click|access).{1,10}(?:computer|(?:lap|desk)top)
  • don.t want .{1,40}?
field:"body.current_thread.text" kind:regex_match
body.html.rawcontains
  • alt="Punchbowl"
field:"body.html.raw" kind:contains
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Robert Half

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

Detects messages impersonating Robert Half, a staffing and recruiting company, by analyzing sender display names, logo detection in message screenshots, and specific company address references in the message body. The rule flags messages from senders not authenticated from legitimate Robert Half domains.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Credential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and (
  strings.icontains(sender.display_name, "Robert Half")
  or (
    any(ml.logo_detect(file.message_screenshot()).brands,
        .name == "Robert Half"
    )
    and strings.icontains(sender.display_name, "Robert Half")
  )
  or 2 of (
    strings.icontains(body.current_thread.text, 'Robert Half'),
    strings.icontains(body.current_thread.text, '2884 Sand Hill Road'),
    strings.icontains(body.current_thread.text, 'Menlo Park, CA 94025')
  )
)
// not a forward or reply
and (headers.in_reply_to is null or length(headers.references) == 0)
and not any(ml.nlu_classifier(body.current_thread.text).topics,
            .name in (
              "Newsletters and Digests",
              "Voicemail Call and Missed Call Notifications",
              "Advertising and Promotions"
            )
            and .confidence != "low"
)
// and the sender is not in org_domains or from Robert Half domains and passes auth
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    sender.email.domain.root_domain in (
      "roberthalf.com",
      "roberthalf.be",
      "service-now.com",
      "protiviti.com",
      "atlassian.net",
      "workday.com",
      "myworkday.com"
    )
    and headers.auth_summary.dmarc.pass
  )
)

Detection logic

Scope: inbound message.

Detects messages impersonating Robert Half, a staffing and recruiting company, by analyzing sender display names, logo detection in message screenshots, and specific company address references in the message body. The rule flags messages from senders not authenticated from legitimate Robert Half domains.

  1. inbound message
  2. any of:
    • sender.display_name contains 'Robert Half'
    • all of:
      • any of ml.logo_detect(file.message_screenshot()).brands where:
        • .name is 'Robert Half'
      • sender.display_name contains 'Robert Half'
    • at least 2 of:
      • body.current_thread.text contains 'Robert Half'
      • body.current_thread.text contains '2884 Sand Hill Road'
      • body.current_thread.text contains 'Menlo Park, CA 94025'
  3. any of:
    • headers.in_reply_to is missing
    • length(headers.references) is 0
  4. not:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name in ('Newsletters and Digests', 'Voicemail Call and Missed Call Notifications', 'Advertising and Promotions')
      • .confidence is not 'low'
  5. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • sender.email.domain.root_domain in ('roberthalf.com', 'roberthalf.be', 'service-now.com', 'protiviti.com', 'atlassian.net', 'workday.com', 'myworkday.com')
      • headers.auth_summary.dmarc.pass

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: file.message_screenshot, ml.logo_detect, ml.nlu_classifier, strings.icontains. Reference lists: $org_domains.

Indicators matched (4)

FieldMatchValue
strings.icontainssubstringRobert Half
ml.logo_detect(file.message_screenshot()).brands[].nameequalsRobert Half
strings.icontainssubstring2884 Sand Hill Road
strings.icontainssubstringMenlo Park, CA 94025

Stages and Predicates

Stage 1: mql_rule

and
  not
    or
      and
        headers.auth_summary.dmarc.pass eq "true"
        sender.email.domain.root_domain in ["atlassian.net", "myworkday.com", "protiviti.com", "roberthalf.be", "roberthalf.com", "service-now.com", "workday.com"]
       macro "sender.email.domain.root_domain in org_domains"
  or
    and
      any(ml.logo_detect(file.message_screenshot()).brands)
        ml.logo_detect(file.message_screenshot()).brands.name eq "Robert Half"
      sender.display_name contains "Robert Half"
    body.current_thread.text contains "2884 Sand Hill Road"
    body.current_thread.text contains "Menlo Park, CA 94025"
    body.current_thread.text contains "Robert Half"
    sender.display_name contains "Robert Half"
  not
    any(ml.nlu_classifier(body.current_thread.text).topics)
      and
        ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
        ml.nlu_classifier(body.current_thread.text).topics.name in ["Advertising and Promotions", "Newsletters and Digests", "Voicemail Call and Missed Call Notifications"]
  or
    headers.in_reply_to is_null
    headers.references length_compare "0"
  type.inbound eq "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_domaininatlassian.net, myworkday.com, protiviti.com, roberthalf.be, roberthalf.com, service-now.com, workday.comexcludes:sender.email.domain.root_domain
ml.nlu_classifier(body.current_thread.text).topicsarray_any(no value, null check)excludes:ml.nlu_classifier(body.current_thread.text).topics

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Robinhood

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

Detects messages impersonating Robinhood by analyzing sender display name, domain, body content including specific address references, and social media links, while excluding legitimate Robinhood communications with proper DMARC authentication.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.html
  • body.links
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  (
    any(ml.nlu_classifier(body.current_thread.text).entities,
        .name in ("org", "sender") and strings.icontains(.text, 'Robinhood')
    )
    and (
      any(ml.nlu_classifier(body.current_thread.text).intents,
          .name == "callback_scam" and .confidence != "low"
      )
    )
  )
  or strings.icontains(body.current_thread.text, 'The Robinhood Team')
  or strings.icontains(body.current_thread.text, 'robinhood automated message')
  or regex.icontains(body.current_thread.text, '©\s*20[0-9]{2}\s*\s*Robinhood')
  or regex.icontains(body.current_thread.text,
                     '(?:\+?\d{0,2}[\s\-\.]*)?(?:\(?888\)?)[\s\-\.]*344[\s\-\.]*3957'
  )
  or regex.icontains(body.current_thread.text,
                     'brokerage clearing (?:service|company|business)'
  )
  or regex.icontains(body.html.raw, 'new passkey was recently added')
  or 2 of (
    strings.icontains(body.current_thread.text, "Robinhood"),
    regex.icontains(body.current_thread.text, '42 Willow (?:Road|St)'),
    strings.icontains(body.current_thread.text, "Menlo Park, CA 97095")
  )
  or (
    strings.icontains(sender.display_name, 'Robinhood')
    and (
      3 of (
        regex.icontains(body.current_thread.text, 'Location:?'),
        regex.icontains(body.current_thread.text, 'Time:'),
        regex.icontains(body.current_thread.text, 'Device:?'),
        regex.icontains(body.current_thread.text, 'IP Address:?'),
        regex.icontains(body.current_thread.text, 'Date:'),
        regex.icontains(body.current_thread.text, 'Region:?'),
        regex.icontains(body.current_thread.text, 'App:?'),
        regex.icontains(body.current_thread.text, 'Email ID:?')
      )
      or strings.icontains(body.current_thread.text, "new passkey added")
      or strings.icontains(body.current_thread.text,
                           "Security support phone number"
      )
    )
  )
  or (
    length(filter(body.links,
                  strings.icontains(.href_url.url,
                                    'https://www.facebook.com/robinhood'
                  )
                  or strings.icontains(.href_url.url,
                                       'https://twitter.com/robinhoodapp'
                  )
                  or strings.icontains(.href_url.url,
                                       'https://www.youtube.com/@RobinhoodApp'
                  )
                  or strings.icontains(.href_url.url,
                                       'https://www.instagram.com/robinhood'
                  )
           )
    ) >= 2
  )
)
// negate legitimate replies and forwards
and (
  (
    (length(headers.references) > 0 or headers.in_reply_to is null)
    and not (subject.is_reply or subject.is_forward)
  )
  or length(headers.references) == 0
)
// negate newsletters and webinars
and not any(ml.nlu_classifier(body.current_thread.text).topics,
            .name in (
              "Newsletters and Digests",
              "Health and Wellness",
              "Events and Webinars"
            )
            and .confidence == "high"
)
and not any(ml.nlu_classifier(body.current_thread.text).intents,
            .name == "benign" and .confidence == "high"
)
and not (
  sender.email.domain.root_domain in (
    "robinhood.com",
    "robinhood.org",
    "duck.com", // unrelated domain
    "robinhoodauctions.com", // unrelated domain
    "bitstamp.net", // robinhood acquisition
    "sinch.com" // unrelated domain
  )
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

Detection logic

Scope: inbound message.

Detects messages impersonating Robinhood by analyzing sender display name, domain, body content including specific address references, and social media links, while excluding legitimate Robinhood communications with proper DMARC authentication.

  1. inbound message
  2. any of:
    • all of:
      • any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
        • .name in ('org', 'sender')
        • .text contains 'Robinhood'
      • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
        • .name is 'callback_scam'
        • .confidence is not 'low'
    • body.current_thread.text contains 'The Robinhood Team'
    • body.current_thread.text contains 'robinhood automated message'
    • body.current_thread.text matches '©\\s*20[0-9]{2}\\s*\\s*Robinhood'
    • body.current_thread.text matches '(?:\\+?\\d{0,2}[\\s\\-\\.]*)?(?:\\(?888\\)?)[\\s\\-\\.]*344[\\s\\-\\.]*3957'
    • body.current_thread.text matches 'brokerage clearing (?:service|company|business)'
    • body.html.raw matches 'new passkey was recently added'
    • at least 2 of:
      • body.current_thread.text contains 'Robinhood'
      • body.current_thread.text matches '42 Willow (?:Road|St)'
      • body.current_thread.text contains 'Menlo Park, CA 97095'
    • all of:
      • sender.display_name contains 'Robinhood'
      • any of:
        • at least 3 of 8: body.current_thread.text matches any of 8 patterns
          • Location:?
          • Time:
          • Device:?
          • IP Address:?
          • Date:
          • Region:?
          • App:?
          • Email ID:?
        • body.current_thread.text contains 'new passkey added'
        • body.current_thread.text contains 'Security support phone number'
    • length(filter(body.links, strings.icontains(.href_url.url, 'https://www.facebook.com/robinhood') or strings.icontains(.href_url.url, 'https://twitter.com/robinhoodapp') or strings.icontains(.href_url.url, 'https://www.youtube.com/@RobinhoodApp') or strings.icontains(.href_url.url, 'https://www.instagram.com/robinhood'))) ≥ 2
  3. any of:
    • all of:
      • any of:
        • length(headers.references) > 0
        • headers.in_reply_to is missing
      • none of:
        • subject.is_reply
        • subject.is_forward
    • length(headers.references) is 0
  4. not:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name in ('Newsletters and Digests', 'Health and Wellness', 'Events and Webinars')
      • .confidence is 'high'
  5. not:
    • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
      • .name is 'benign'
      • .confidence is 'high'
  6. not:
    • all of:
      • sender.email.domain.root_domain in ('robinhood.com', 'robinhood.org', 'duck.com', 'robinhoodauctions.com', 'bitstamp.net', 'sinch.com')
      • coalesce(headers.auth_summary.dmarc.pass)

Inspects: body.current_thread.text, body.html.raw, body.links, body.links[].href_url.url, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.display_name, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains.

Indicators matched (26)

FieldMatchValue
ml.nlu_classifier(body.current_thread.text).entities[].namememberorg
ml.nlu_classifier(body.current_thread.text).entities[].namemembersender
strings.icontainssubstringRobinhood
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscallback_scam
strings.icontainssubstringThe Robinhood Team
strings.icontainssubstringrobinhood automated message
regex.icontainsregex©\s*20[0-9]{2}\s*\s*Robinhood
regex.icontainsregex(?:\+?\d{0,2}[\s\-\.]*)?(?:\(?888\)?)[\s\-\.]*344[\s\-\.]*3957
regex.icontainsregexbrokerage clearing (?:service|company|business)
regex.icontainsregexnew passkey was recently added
regex.icontainsregex42 Willow (?:Road|St)
strings.icontainssubstringMenlo Park, CA 97095
14 more
regex.icontainsregexLocation:?
regex.icontainsregexTime:
regex.icontainsregexDevice:?
regex.icontainsregexIP Address:?
regex.icontainsregexDate:
regex.icontainsregexRegion:?
regex.icontainsregexApp:?
regex.icontainsregexEmail ID:?
strings.icontainssubstringnew passkey added
strings.icontainssubstringSecurity support phone number
strings.icontainssubstringhttps://www.facebook.com/robinhood
strings.icontainssubstringhttps://twitter.com/robinhoodapp
strings.icontainssubstringhttps://www.youtube.com/@RobinhoodApp
strings.icontainssubstringhttps://www.instagram.com/robinhood

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      any(ml.nlu_classifier(body.current_thread.text).entities)
        and
          ml.nlu_classifier(body.current_thread.text).entities.name in ["org", "sender"]
          ml.nlu_classifier(body.current_thread.text).entities.text contains "Robinhood"
      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 eq "callback_scam"
    and
      or
        body.current_thread.text contains "Security support phone number"
        body.current_thread.text contains "new passkey added"
        body.current_thread.text regex_match "App:?"
        body.current_thread.text regex_match "Date:"
        body.current_thread.text regex_match "Device:?"
        body.current_thread.text regex_match "Email ID:?"
        body.current_thread.text regex_match "IP Address:?"
        body.current_thread.text regex_match "Location:?"
        body.current_thread.text regex_match "Region:?"
        body.current_thread.text regex_match "Time:"
      sender.display_name contains "Robinhood"
    body.current_thread.text contains "Menlo Park, CA 97095"
    body.current_thread.text contains "Robinhood"
    body.current_thread.text contains "The Robinhood Team"
    body.current_thread.text contains "robinhood automated message"
    body.current_thread.text regex_match "(?:\\+?\\d{0,2}[\\s\\-\\.]*)?(?:\\(?888\\)?)[\\s\\-\\.]*344[\\s\\-\\.]*3957"
    body.current_thread.text regex_match "42 Willow (?:Road|St)"
    body.current_thread.text regex_match "brokerage clearing (?:service|company|business)"
    body.current_thread.text regex_match "©\\s*20[0-9]{2}\\s*\\s*Robinhood"
    body.html.raw regex_match "new passkey was recently added"
    filter(body.links, strings.icontains(.href_url.url, 'https://www.facebook.com/robinhood') or strings.icontains(.href_url.url, 'https://twitter.com/robinhoodapp') or strings.icontains(.href_url.url, 'https://www.youtube.com/@RobinhoodApp') or strings.icontains(.href_url.url, 'https://www.instagram.com/robinhood')) length_compare "2"
  or
    and
      not
        or
          subject.is_forward eq "true"
          subject.is_reply eq "true"
      or
        headers.in_reply_to is_null
        headers.references length_compare "0"
    headers.references length_compare "0"
  not
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name eq "benign"
  not
    any(ml.nlu_classifier(body.current_thread.text).topics)
      and
        ml.nlu_classifier(body.current_thread.text).topics.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).topics.name in ["Events and Webinars", "Health and Wellness", "Newsletters and Digests"]
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
      sender.email.domain.root_domain in ["bitstamp.net", "duck.com", "robinhood.com", "robinhood.org", "robinhoodauctions.com", "sinch.com"]
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
ml.nlu_classifier(body.current_thread.text).intentsarray_any(no value, null check)excludes:ml.nlu_classifier(body.current_thread.text).intents
ml.nlu_classifier(body.current_thread.text).topicsarray_any(no value, null check)excludes:ml.nlu_classifier(body.current_thread.text).topics
sender.email.domain.root_domaininbitstamp.net, duck.com, robinhood.com, robinhood.org, robinhoodauctions.com, sinch.comexcludes:sender.email.domain.root_domain

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textcontains
  • Menlo Park, CA 97095
  • Robinhood
  • Security support phone number
  • The Robinhood Team
  • new passkey added
  • robinhood automated message
field:"body.current_thread.text" kind:contains
body.current_thread.textregex_match
  • (?:+?\d{0,2}[\s\-.]*)?(?:(?888)?)[\s\-.]*344[\s\-.]*3957
  • 42 Willow (?:Road|St)
  • App:?
  • Date:
  • Device:?
  • Email ID:?
  • IP Address:?
  • Location:?
  • Region:?
  • Time:
  • brokerage clearing (?:service|company|business)
  • ©\s*20[0-9]{2}\s*\s*Robinhood
field:"body.current_thread.text" kind:regex_match
body.html.rawregex_match
  • new passkey was recently added
field:"body.html.raw" kind:regex_match value:"new passkey was recently added"
headers.in_reply_tois_null
  • (no value, null check)
field:"headers.in_reply_to" kind:is_null
sender.display_namecontains
  • Robinhood
field:"sender.display_name" kind:contains value:"Robinhood"
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: SendGrid

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

Detects inbound messages that impersonate Twilio/SendGrid through display name or domain manipulation, combined with security or authentication-themed content, while failing authentication checks and originating from untrusted sources.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Credential Phishing, Spam
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.links
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  (
    // SendGrid impersonation patterns
    strings.ilike(strings.replace_confusables(sender.display_name),
                  '*sendgrid*'
    )
    or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                            'sendgrid'
    ) <= 1
    or regex.icontains(sender.display_name,
                       's[\x{2063}\x{200B}]+e[\x{2063}\x{200B}]+n[\x{2063}\x{200B}]+d[\x{2063}\x{200B}]+g[\x{2063}\x{200B}]+r[\x{2063}\x{200B}]+i[\x{2063}\x{200B}]+d'
    )
    or (
      strings.ilike(strings.replace_confusables(sender.email.local_part),
                    '*sendgrid*'
      )
      and (
        sender.display_name is null
        or strings.ilike(strings.replace_confusables(subject.base),
                         '*sendgrid*'
        )
      )
    )
    or any(ml.logo_detect(file.message_screenshot()).brands,
           .name == "SendGrid" and .confidence == "high"
    )
  )
  or (
    // Twilio impersonation patterns
    strings.ilike(strings.replace_confusables(sender.display_name), '*twilio*')
    or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                            'twilio'
    ) <= 1
    or (
      strings.ilike(strings.replace_confusables(sender.email.local_part),
                    '*twilio*'
      )
      and (
        sender.display_name is null
        or strings.ilike(strings.replace_confusables(subject.base), '*twilio*')
      )
    )
  )
  or strings.icontains(body.current_thread.text, "the sendgrid team")
  or 2 of (
    regex.icontains(body.current_thread.text, '(?:Twilio|SendGrid)'),
    strings.icontains(body.current_thread.text, '1801 California St'),
    strings.icontains(body.current_thread.text, 'Denver, CO 80202')
  )
  // SendGrid content from non-SendGrid marketing platforms
  or (
    sender.email.domain.root_domain in (
      "selfcast.com",
      "mailchimp.com",
      "constantcontact.com",
      "hubspot.com",
      "klaviyo.com",
      "mailgun.com"
    )
    and (
      (
        (
          strings.icontains(body.current_thread.text, "sendgrid")
          or strings.icontains(subject.base, "sendgrid")
        )
        and 3 of (
          strings.icontains(body.current_thread.text, "webhook"),
          strings.icontains(body.current_thread.text, "endpoint"),
          strings.icontains(body.current_thread.text, "api"),
          strings.icontains(body.current_thread.text, "delivery"),
          strings.icontains(body.current_thread.text, "event notification")
        )
      )
      and (
        // Look for SendGrid-related content with non-SendGrid tracking links
        any(body.links,
            strings.icontains(.href_url.url, "selfcast.com")
            or (
              .display_url.url is not null
              and strings.icontains(.display_url.url, "sendgrid.com")
            )
        )
      )
    )
  )
)
and (
  // Content analysis using ML/NLU
  any(ml.nlu_classifier(body.current_thread.text).topics,
      .name in (
        "Security and Authentication",
        "Secure Message",
        "Reminders and Notifications",
        "Software and App Updates",
        "Customer Service and Support"
      )
      and .confidence in ("medium", "high")
  )
  or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
         .name in (
           "Security and Authentication",
           "Secure Message",
           "Reminders and Notifications",
           "Software and App Updates",
           "Customer Service and Support"
         )
         and .confidence in ("medium", "high")
  )
  or any(ml.nlu_classifier(body.current_thread.text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
  or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,
         .name == "cred_theft" and .confidence == "high"
  )

  // any capacity or limits mentioned
  or any([subject.base, body.current_thread.text],
         (strings.icontains(., "capacity") or strings.icontains(., "limit"))
         and regex.icontains(., '\breach(?:\b|ed)')
  )
)

// and the sender is not in org_domains or from sendgrid domains and passes auth
and not (
  sender.email.domain.valid
  and (
    sender.email.domain.root_domain in $org_domains
    or (
      sender.email.domain.root_domain in (
        "sendgrid.com",
        "sendgrid.net",
        "twilio.com",
        "swoogo.com", // events planning software used by Twillio
        "sendsafely.com", // secure delivery used by Twillio
        "evolve.com", // same address as Twillio
        "sendgridsolutions.com"
      )
    )
  )
  and headers.auth_summary.dmarc.pass
)
// negate highly trusted sender domains unless they fail DMARC authentication
and not (
  sender.email.domain.root_domain in $high_trust_sender_root_domains
  and coalesce(headers.auth_summary.dmarc.pass, false)
)
and not profile.by_sender().solicited

Detection logic

Scope: inbound message.

Detects inbound messages that impersonate Twilio/SendGrid through display name or domain manipulation, combined with security or authentication-themed content, while failing authentication checks and originating from untrusted sources.

  1. inbound message
  2. any of:
    • any of:
      • strings.replace_confusables(sender.display_name) matches '*sendgrid*'
      • strings.replace_confusables(sender.display_name) is similar to 'sendgrid'
      • sender.display_name matches 's[\\x{2063}\\x{200B}]+e[\\x{2063}\\x{200B}]+n[\\x{2063}\\x{200B}]+d[\\x{2063}\\x{200B}]+g[\\x{2063}\\x{200B}]+r[\\x{2063}\\x{200B}]+i[\\x{2063}\\x{200B}]+d'
      • all of:
        • strings.replace_confusables(sender.email.local_part) matches '*sendgrid*'
        • any of:
          • sender.display_name is missing
          • strings.replace_confusables(subject.base) matches '*sendgrid*'
      • any of ml.logo_detect(file.message_screenshot()).brands where all hold:
        • .name is 'SendGrid'
        • .confidence is 'high'
    • any of:
      • strings.replace_confusables(sender.display_name) matches '*twilio*'
      • strings.replace_confusables(sender.display_name) is similar to 'twilio'
      • all of:
        • strings.replace_confusables(sender.email.local_part) matches '*twilio*'
        • any of:
          • sender.display_name is missing
          • strings.replace_confusables(subject.base) matches '*twilio*'
    • body.current_thread.text contains 'the sendgrid team'
    • at least 2 of:
      • body.current_thread.text matches '(?:Twilio|SendGrid)'
      • body.current_thread.text contains '1801 California St'
      • body.current_thread.text contains 'Denver, CO 80202'
    • all of:
      • sender.email.domain.root_domain in ('selfcast.com', 'mailchimp.com', 'constantcontact.com', 'hubspot.com', 'klaviyo.com', 'mailgun.com')
      • all of:
        • all of:
          • any of:
            • body.current_thread.text contains 'sendgrid'
            • subject.base contains 'sendgrid'
          • at least 3 of 5: body.current_thread.text contains any of 5 patterns
            • webhook
            • endpoint
            • api
            • delivery
            • event notification
        • any of body.links where any holds:
          • .href_url.url contains 'selfcast.com'
          • all of:
            • .display_url.url is set
            • .display_url.url contains 'sendgrid.com'
  3. any of:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications', 'Software and App Updates', 'Customer Service and Support')
      • .confidence in ('medium', 'high')
    • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
      • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications', 'Software and App Updates', 'Customer Service and Support')
      • .confidence in ('medium', 'high')
    • 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(beta.ocr(file.message_screenshot()).text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence is 'high'
    • any of [subject.base, body.current_thread.text] where all hold:
      • any of:
        • . contains 'capacity'
        • . contains 'limit'
      • . matches '\\breach(?:\\b|ed)'
  4. not:
    • all of:
      • sender.email.domain.valid
      • any of:
        • sender.email.domain.root_domain in $org_domains
        • sender.email.domain.root_domain in ('sendgrid.com', 'sendgrid.net', 'twilio.com', 'swoogo.com', 'sendsafely.com', 'evolve.com', 'sendgridsolutions.com')
      • headers.auth_summary.dmarc.pass
  5. not:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • coalesce(headers.auth_summary.dmarc.pass)
  6. not:
    • profile.by_sender().solicited

Inspects: body.current_thread.text, body.links, body.links[].display_url.url, body.links[].href_url.url, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, sender.email.domain.valid, sender.email.local_part, subject.base, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, regex.icontains, strings.icontains, strings.ilevenshtein, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (46)

FieldMatchValue
strings.ilikesubstring*sendgrid*
strings.ilevenshteinfuzzysendgrid
regex.icontainsregexs[\x{2063}\x{200B}]+e[\x{2063}\x{200B}]+n[\x{2063}\x{200B}]+d[\x{2063}\x{200B}]+g[\x{2063}\x{200B}]+r[\x{2063}\x{200B}]+i[\x{2063}\x{200B}]+d
ml.logo_detect(file.message_screenshot()).brands[].nameequalsSendGrid
ml.logo_detect(file.message_screenshot()).brands[].confidenceequalshigh
strings.ilikesubstring*twilio*
strings.ilevenshteinfuzzytwilio
strings.icontainssubstringthe sendgrid team
regex.icontainsregex(?:Twilio|SendGrid)
strings.icontainssubstring1801 California St
strings.icontainssubstringDenver, CO 80202
sender.email.domain.root_domainmemberselfcast.com
34 more
sender.email.domain.root_domainmembermailchimp.com
sender.email.domain.root_domainmemberconstantcontact.com
sender.email.domain.root_domainmemberhubspot.com
sender.email.domain.root_domainmemberklaviyo.com
sender.email.domain.root_domainmembermailgun.com
strings.icontainssubstringsendgrid
strings.icontainssubstringwebhook
strings.icontainssubstringendpoint
strings.icontainssubstringapi
strings.icontainssubstringdelivery
strings.icontainssubstringevent notification
strings.icontainssubstringselfcast.com
strings.icontainssubstringsendgrid.com
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecure Message
ml.nlu_classifier(body.current_thread.text).topics[].namememberReminders and Notifications
ml.nlu_classifier(body.current_thread.text).topics[].namememberSoftware and App Updates
ml.nlu_classifier(body.current_thread.text).topics[].namememberCustomer Service and Support
ml.nlu_classifier(body.current_thread.text).topics[].confidencemembermedium
ml.nlu_classifier(body.current_thread.text).topics[].confidencememberhigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecure Message
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberReminders and Notifications
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSoftware and App Updates
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberCustomer Service and Support
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencemembermedium
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencememberhigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].nameequalscred_theft
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].confidenceequalshigh
strings.icontainssubstringcapacity
strings.icontainssubstringlimit
regex.icontainsregex\breach(?:\b|ed)

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      any(body.links)
        or
          and
            body.links.display_url.url contains "sendgrid.com"
            body.links.display_url.url is_not_null
          body.links.href_url.url contains "selfcast.com"
      or
        body.current_thread.text contains "api"
        body.current_thread.text contains "delivery"
        body.current_thread.text contains "endpoint"
        body.current_thread.text contains "event notification"
        body.current_thread.text contains "webhook"
      or
        body.current_thread.text contains "sendgrid"
        subject.base contains "sendgrid"
      sender.email.domain.root_domain in ["constantcontact.com", "hubspot.com", "klaviyo.com", "mailchimp.com", "mailgun.com", "selfcast.com"]
    any(ml.logo_detect(file.message_screenshot()).brands)
      and
        ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
        ml.logo_detect(file.message_screenshot()).brands.name eq "SendGrid"
    and
      or
        sender.display_name is_null
        strings.replace_confusables(subject.base) match "sendgrid"
      strings.replace_confusables(sender.email.local_part) match "sendgrid"
    and
      or
        sender.display_name is_null
        strings.replace_confusables(subject.base) match "twilio"
      strings.replace_confusables(sender.email.local_part) match "twilio"
    body.current_thread.text contains "1801 California St"
    body.current_thread.text contains "Denver, CO 80202"
    body.current_thread.text contains "the sendgrid team"
    body.current_thread.text regex_match "(?:Twilio|SendGrid)"
    sender.display_name regex_match "s[\\x{2063}\\x{200B}]+e[\\x{2063}\\x{200B}]+n[\\x{2063}\\x{200B}]+d[\\x{2063}\\x{200B}]+g[\\x{2063}\\x{200B}]+r[\\x{2063}\\x{200B}]+i[\\x{2063}\\x{200B}]+d"
    strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"sendgrid\") <= 1"
    strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"twilio\") <= 1"
    strings.replace_confusables(sender.display_name) match "sendgrid"
    strings.replace_confusables(sender.display_name) match "twilio"
  or
    any([subject.base, body.current_thread.text])
      and
        or
          [subject.base, body.current_thread.text] contains "capacity"
          [subject.base, body.current_thread.text] contains "limit"
        [subject.base, body.current_thread.text] regex_match "\\breach(?:\\b|ed)"
    any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
      and
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
      and
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Customer Service and Support", "Reminders and Notifications", "Secure Message", "Security and Authentication", "Software and App Updates"]
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).topics)
      and
        ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
        ml.nlu_classifier(body.current_thread.text).topics.name in ["Customer Service and Support", "Reminders and Notifications", "Secure Message", "Security and Authentication", "Software and App Updates"]
  not
    and
      or
        sender.email.domain.root_domain in ["evolve.com", "sendgrid.com", "sendgrid.net", "sendgridsolutions.com", "sendsafely.com", "swoogo.com", "twilio.com"]
         macro "sender.email.domain.root_domain in org_domains"
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.valid eq "true"
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
  not
    profile.by_sender func_call "profile.by_sender().solicited"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
sender.email.domain.root_domaininevolve.com, sendgrid.com, sendgrid.net, sendgridsolutions.com, sendsafely.com, swoogo.com, twilio.comexcludes:sender.email.domain.root_domain
headers.auth_summary.dmarc.passeqtrueexcludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true"
sender.email.domain.valideqtrueexcludes:sender.email.domain.valid field:"sender.email.domain.valid" value:"true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textcontains
  • 1801 California St
  • Denver, CO 80202
  • api
  • delivery
  • endpoint
  • event notification
  • sendgrid
  • the sendgrid team
  • webhook
field:"body.current_thread.text" kind:contains
body.current_thread.textregex_match
  • (?:Twilio|SendGrid)
field:"body.current_thread.text" kind:regex_match value:"(?:Twilio|SendGrid)"
sender.display_nameis_null
  • (no value, null check)
field:"sender.display_name" kind:is_null
sender.display_nameregex_match
  • s[\x{2063}\x{200B}]+e[\x{2063}\x{200B}]+n[\x{2063}\x{200B}]+d[\x{2063}\x{200B}]+g[\x{2063}\x{200B}]+r[\x{2063}\x{200B}]+i[\x{2063}\x{200B}]+d
field:"sender.display_name" kind:regex_match value:"s[\x{2063}\x{200B}]+e[\x{2063}\x{200B}]+n[\x{2063}\x{200B}]+d[\x{2063}\x{200B}]+g[\x{2063}\x{200B}]+r[\x{2063}\x{200B}]+i[\x{2063}\x{200B}]+d"
sender.email.domain.root_domainin
  • constantcontact.com
  • hubspot.com
  • klaviyo.com
  • mailchimp.com
  • mailgun.com
  • selfcast.com
field:"sender.email.domain.root_domain" kind:in
strings.replace_confusables(sender.display_name)wildcard
  • *sendgrid*
  • *twilio*
field:"strings.replace_confusables(sender.display_name)" kind:wildcard
strings.replace_confusables(sender.email.local_part)wildcard
  • *sendgrid*
  • *twilio*
field:"strings.replace_confusables(sender.email.local_part)" kind:wildcard
strings.replace_confusables(subject.base)wildcard
  • *sendgrid*
  • *twilio*
field:"strings.replace_confusables(subject.base)" kind:wildcard
subject.basecontains
  • sendgrid
field:"subject.base" kind:contains value:"sendgrid"
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: SharePoint PDF attachment with credential theft language

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

PDF attachment contains SharePoint logo and high-confidence credential theft language detected via OCR analysis. The attachment includes URLs and originates from an unsolicited or low-reputation sender, excluding legitimate SharePoint file sharing notifications.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering, PDF, Evasion

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • attachments
  • body
  • body.links
  • headers
  • headers.auth_summary
  • headers.hops
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  any(attachments,
      (
        .file_type == "pdf"
        and any(ml.logo_detect(.).brands, .name == "Microsoft SharePoint")
        and any(file.explode(.), length(.scan.url.urls) > 0)
        and any(file.explode(.),
                any(ml.nlu_classifier(.scan.ocr.raw).intents,
                    .name == "cred_theft" and .confidence == "high"
                )
        )
      )
  )
)
// negate sharepoint file share
and not (
  // based on the message id format
  (
    (
      strings.starts_with(headers.message_id, '<Share-')
      and strings.ends_with(headers.message_id, '@odspnotify>')
    )
    // negate legitimate access request to file
    or (
      strings.starts_with(headers.message_id, '<Sharing')
      and strings.ends_with(headers.message_id, '@odspnotify>')
    )
    // deal with Google thinking the message ID is "broke"
    or (
      strings.icontains(headers.message_id, 'SMTPIN_ADDED_BROKEN')
      and any(headers.hops,
              any(.fields,
                  .name == "X-Google-Original-Message-ID"
                  and strings.starts_with(.value, '<Share-')
                  and strings.ends_with(.value, '@odspnotify>')
              )
      )
    )
  )
  // all of the "action" links are sharepoint/ms
  and all(filter(body.links,
                 strings.icontains(subject.subject, .display_text)
                 or .display_text == "Open"
          ),
          .href_url.domain.root_domain in ("sharepoint.com")
          or (
            .href_url.domain.tld == "ms"
            // Microsoft does not own the .ms TLD, this checks to ensure it is one of their domains
            and (
              network.whois(.href_url.domain).registrant_company == "Microsoft Corporation"
              or strings.ilike(network.whois(.href_url.domain).registrar_name,
                               "*MarkMonitor*",
                               "*CSC Corporate*",
                               "*com laude*"
              )
            )
          )
  )
)
and not (
  (
    (subject.is_reply or subject.is_forward)
    and (
      (length(headers.references) > 0 or headers.in_reply_to is not null)
      // ensure that there are actual threads
      and (
        length(body.previous_threads) > 0
        or (length(body.html.display_text) - length(body.current_thread.text)) > 200
      )
    )
  )
)
// 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.

PDF attachment contains SharePoint logo and high-confidence credential theft language detected via OCR analysis. The attachment includes URLs and originates from an unsolicited or low-reputation sender, excluding legitimate SharePoint file sharing notifications.

  1. inbound message
  2. any of attachments where all hold:
    • .file_type is 'pdf'
    • any of ml.logo_detect(.).brands where:
      • .name is 'Microsoft SharePoint'
    • any of file.explode(.) where:
      • length(.scan.url.urls) > 0
    • any of file.explode(.) where:
      • any of ml.nlu_classifier(.scan.ocr.raw).intents where all hold:
        • .name is 'cred_theft'
        • .confidence is 'high'
  3. not:
    • all of:
      • any of:
        • all of:
          • headers.message_id starts with '<Share-'
          • headers.message_id ends with '@odspnotify>'
        • all of:
          • headers.message_id starts with '<Sharing'
          • headers.message_id ends with '@odspnotify>'
        • all of:
          • headers.message_id contains 'SMTPIN_ADDED_BROKEN'
          • any of headers.hops where:
            • any of .fields where all hold:
              • .name is 'X-Google-Original-Message-ID'
              • .value starts with '<Share-'
              • .value ends with '@odspnotify>'
      • all of filter(body.links) where any holds:
        • .href_url.domain.root_domain in ('sharepoint.com')
        • all of:
          • .href_url.domain.tld is 'ms'
          • any of:
            • network.whois(.href_url.domain).registrant_company is 'Microsoft Corporation'
            • network.whois(.href_url.domain).registrar_name matches any of 3 patterns
              • *MarkMonitor*
              • *CSC Corporate*
              • *com laude*
  4. not:
    • all of:
      • any of:
        • subject.is_reply
        • subject.is_forward
      • all of:
        • any of:
          • length(headers.references) > 0
          • headers.in_reply_to is set
        • any of:
          • length(body.previous_threads) > 0
          • length(body.html.display_text) - length(body.current_thread.text) > 200
  5. 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: attachments[].file_type, body.links, body.links[].display_text, body.previous_threads, headers.auth_summary.dmarc.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, headers.in_reply_to, headers.message_id, headers.references, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, subject.subject, type.inbound. Sensors: file.explode, ml.logo_detect, ml.nlu_classifier, network.whois, strings.ends_with, strings.icontains, strings.ilike, strings.starts_with. Reference lists: $high_trust_sender_root_domains.

Indicators matched (4)

FieldMatchValue
attachments[].file_typeequalspdf
ml.logo_detect(attachments[]).brands[].nameequalsMicrosoft SharePoint
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).intents[].nameequalscred_theft
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).intents[].confidenceequalshigh

Stages and Predicates

Stage 1: mql_rule

and
  not
    and
      or
        and
          any(headers.hops)
            any(headers.hops.fields)
              and
                headers.hops.fields[].name eq "X-Google-Original-Message-ID"
                headers.hops.fields[].value ends_with "@odspnotify>"
                headers.hops.fields[].value starts_with "<Share-"
          headers.message_id contains "SMTPIN_ADDED_BROKEN"
        and
          headers.message_id ends_with "@odspnotify>"
          headers.message_id starts_with "<Share-"
        and
          headers.message_id ends_with "@odspnotify>"
          headers.message_id starts_with "<Sharing"
       macro "all(filter(body.links))"
  any(attachments)
    and
      any(file.explode(attachments))
        any(ml.nlu_classifier(file.explode(attachments).scan.ocr.raw).intents)
          and
            ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).intents[].confidence eq "high"
            ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).intents[].name eq "cred_theft"
      any(file.explode(attachments))
        file.explode(attachments).scan.url.urls length_compare "0"
      any(ml.logo_detect(attachments).brands)
        ml.logo_detect(attachments).brands.name eq "Microsoft SharePoint"
      attachments.file_type eq "pdf"
  not
    and
      or
        body.previous_threads length_compare "0"
         macro "(length(body.html.display_text) - length(body.current_thread.text)) > 200"
      or
        headers.in_reply_to is_not_null
        headers.references length_compare "0"
      or
        subject.is_forward eq "true"
        subject.is_reply eq "true"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.hopsarray_any(no value, null check)excludes:headers.hops
headers.message_idcontainsSMTPIN_ADDED_BROKENexcludes:headers.message_id field:"headers.message_id" value:"SMTPIN_ADDED_BROKEN"
headers.message_idends_with@odspnotify>excludes:headers.message_id field:"headers.message_id" value:"@odspnotify>"
headers.message_idstarts_with<Share-excludes:headers.message_id field:"headers.message_id" value:"<Share-"
headers.message_idstarts_with<Sharingexcludes:headers.message_id field:"headers.message_id" value:"<Sharing"
body.previous_threadslength_compare0excludes:body.previous_threads field:"body.previous_threads" value:"0"
headers.in_reply_tois_not_null(no value, null check)excludes:headers.in_reply_to
headers.referenceslength_compare0excludes:headers.references field:"headers.references" value:"0"
subject.is_forwardeqtrueexcludes:subject.is_forward field:"subject.is_forward" value:"true"
subject.is_replyeqtrueexcludes:subject.is_reply field:"subject.is_reply" value:"true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand Impersonation: Shein

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

Detects suspicious Shein-branded communications using display name impersonation, logo detection, and deceptive content analysis. Includes checks for security/authentication topics, secure messages, notifications, and promotional content like fake surveys or giveaways. Excludes legitimate Shein domains with proper authentication and known trusted senders.

Threat classification

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

CategoryValues
Attack typesCredential Phishing, Spam
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and (
  // display name contains Shein
  (
    (
      regex.icontains(strings.replace_confusables(sender.display_name),
                      '\bsh[ie]{2}n\b'
      )
      and not strings.icontains(sender.display_name, "sheen")
    )
    or (
      length(ml.logo_detect(file.message_screenshot()).brands) == 1
      and all(ml.logo_detect(file.message_screenshot()).brands,
              .name == "Shein" and .confidence == "high"
      )
    )
  )
)
and (
  (
    length(ml.nlu_classifier(body.current_thread.text).topics) > 0
    and all(ml.nlu_classifier(body.current_thread.text).topics,
            .name in (
              "Security and Authentication",
              "Secure Message",
              "Reminders and Notifications",
              "Advertising and Promotions" // fake surveys/giveaways have been observed
            )
            and .confidence in ("medium", "high")
    )
  )
  or (
    beta.ocr(file.message_screenshot()).text != ""
    and length(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics
    ) > 0
    and all(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
            .name in (
              "Security and Authentication",
              "Secure Message",
              "Reminders and Notifications",
              "Advertising and Promotions" // fake surveys/giveaways have been observed
            )
            and .confidence in ("medium", "high")
    )
  )
  or any(ml.nlu_classifier(body.current_thread.text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
  or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
)

// and the sender is not in org_domains or from Shein domains and passes auth
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    length(attachments) == 1
    // this is Shein's return label generator
    and all(attachments,
            .file_type == "pdf"
            and strings.icontains(beta.parse_exif(.).creator, "MondialRelay")
    )
  )
  or (
    sender.email.domain.root_domain in (
      "shein.com",
      "shein.com.mx",
      "sheinemail.com",
      "shein.co.uk",
      "sheingroup.com",
      "sheinnotice.com",
      "cash.app",
      "capitaloneshopping.com"
    )
    and (
      headers.auth_summary.dmarc.pass
      // for when DMARC fails, but it's still a legit Shein newsletter
      or (
        length(body.links) > 10
        and ratio(body.links,
                  .href_url.domain.root_domain in (
                    "shein.com",
                    "sheinemail.com",
                    "shein.co.uk",
                    "sheingroup.com",
                    "sheinnotice.com",
                    "cash.app",
                    "capitaloneshopping.com"
                  )
        ) > 0.6
      )
    )
  )
  // parse out original sender domain from Apple Private Relay info
  or (
    sender.email.domain.domain in ("privaterelay.appleid.com", "icloud.com")
    and strings.ilike(sender.email.local_part,
                      '*shein_com*',
                      '*sheinemail_com*'
    )
  )
)
// and the sender is not from high trust sender root domains
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().solicited
  or not headers.auth_summary.dmarc.pass
  or not headers.auth_summary.spf.pass
)

Detection logic

Scope: inbound message.

Detects suspicious Shein-branded communications using display name impersonation, logo detection, and deceptive content analysis. Includes checks for security/authentication topics, secure messages, notifications, and promotional content like fake surveys or giveaways. Excludes legitimate Shein domains with proper authentication and known trusted senders.

  1. inbound message
  2. any of:
    • all of:
      • strings.replace_confusables(sender.display_name) matches '\\bsh[ie]{2}n\\b'
      • not:
        • sender.display_name contains 'sheen'
    • all of:
      • length(ml.logo_detect(file.message_screenshot()).brands) is 1
      • all of ml.logo_detect(file.message_screenshot()).brands where all hold:
        • .name is 'Shein'
        • .confidence is 'high'
  3. any of:
    • all of:
      • length(ml.nlu_classifier(body.current_thread.text).topics) > 0
      • all of ml.nlu_classifier(body.current_thread.text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications', 'Advertising and Promotions')
        • .confidence in ('medium', 'high')
    • all of:
      • beta.ocr(file.message_screenshot()).text is not ''
      • length(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics) > 0
      • all of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications', 'Advertising and Promotions')
        • .confidence in ('medium', 'high')
    • 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(beta.ocr(file.message_screenshot()).text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence is 'high'
  4. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • length(attachments) is 1
      • all of attachments where all hold:
        • .file_type is 'pdf'
        • beta.parse_exif(.).creator contains 'MondialRelay'
    • all of:
      • sender.email.domain.root_domain in ('shein.com', 'shein.com.mx', 'sheinemail.com', 'shein.co.uk', 'sheingroup.com', 'sheinnotice.com', 'cash.app', 'capitaloneshopping.com')
      • any of:
        • headers.auth_summary.dmarc.pass
        • all of:
          • length(body.links) > 10
          • ratio(body.links) > 0.6
    • all of:
      • sender.email.domain.domain in ('privaterelay.appleid.com', 'icloud.com')
      • sender.email.local_part matches any of 2 patterns
        • *shein_com*
        • *sheinemail_com*
  5. 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
  6. any of:
    • not:
      • profile.by_sender().solicited
    • not:
      • headers.auth_summary.dmarc.pass
    • not:
      • headers.auth_summary.spf.pass

Inspects: attachments[].file_type, body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, sender.email.local_part, type.inbound. Sensors: beta.ocr, beta.parse_exif, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, regex.icontains, strings.icontains, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (19)

FieldMatchValue
regex.icontainsregex\bsh[ie]{2}n\b
ml.logo_detect(file.message_screenshot()).brands[].nameequalsShein
ml.logo_detect(file.message_screenshot()).brands[].confidenceequalshigh
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecure Message
ml.nlu_classifier(body.current_thread.text).topics[].namememberReminders and Notifications
ml.nlu_classifier(body.current_thread.text).topics[].namememberAdvertising and Promotions
ml.nlu_classifier(body.current_thread.text).topics[].confidencemembermedium
ml.nlu_classifier(body.current_thread.text).topics[].confidencememberhigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecure Message
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberReminders and Notifications
7 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberAdvertising and Promotions
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencemembermedium
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencememberhigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].nameequalscred_theft
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].confidenceequalshigh

Stages and Predicates

Stage 1: mql_rule

and
  not
    or
      and
        or
          and
            body.links length_compare "10"
            ratio func_call "ratio(body.links) > 0.6"
          headers.auth_summary.dmarc.pass eq "true"
        sender.email.domain.root_domain in ["capitaloneshopping.com", "cash.app", "shein.co.uk", "shein.com", "shein.com.mx", "sheinemail.com", "sheingroup.com", "sheinnotice.com"]
      and
        or
          sender.email.local_part match "shein_com"
          sender.email.local_part match "sheinemail_com"
        sender.email.domain.domain in ["icloud.com", "privaterelay.appleid.com"]
      and
        attachments length_compare "1"
         macro "all(attachments)"
       macro "sender.email.domain.root_domain in org_domains"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
      and
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
    and
      beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
      ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics length_compare "0"
       macro "all(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)"
    and
      ml.nlu_classifier(body.current_thread.text).topics length_compare "0"
       macro "all(ml.nlu_classifier(body.current_thread.text).topics)"
  or
    and
      not
        sender.display_name contains "sheen"
      strings.replace_confusables(sender.display_name) regex_match "\\bsh[ie]{2}n\\b"
    and
      ml.logo_detect(file.message_screenshot()).brands length_compare "1"
       macro "all(ml.logo_detect(file.message_screenshot()).brands)"
  or
    not
      headers.auth_summary.dmarc.pass eq "true"
    not
      headers.auth_summary.spf.pass eq "true"
    not
      profile.by_sender func_call "profile.by_sender().solicited"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
body.linkslength_compare10excludes:body.links field:"body.links" value:"10"
headers.auth_summary.dmarc.passeqtrueexcludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true"
sender.email.domain.root_domainincapitaloneshopping.com, cash.app, shein.co.uk, shein.com, shein.com.mx, sheinemail.com, sheingroup.com, sheinnotice.comexcludes:sender.email.domain.root_domain
sender.email.local_partmatchshein_comexcludes:sender.email.local_part field:"sender.email.local_part" value:"shein_com"
sender.email.local_partmatchsheinemail_comexcludes:sender.email.local_part field:"sender.email.local_part" value:"sheinemail_com"
sender.email.domain.domaininicloud.com, privaterelay.appleid.comexcludes:sender.email.domain.domain field:"sender.email.domain.domain" value:"icloud.com" field:"sender.email.domain.domain" value:"privaterelay.appleid.com"
attachmentslength_compare1excludes:attachments field:"attachments" value:"1"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: SiriusXM

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

Impersonation of the broadcasting corporation SiriusXM.

Threat classification

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

CategoryValues
Attack typesCallback Phishing, Credential Phishing, Spam
Tactics and techniquesFree email provider, Impersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and (
  regex.icontains(sender.display_name, 'sirius[._-]?xm')
  or strings.ilevenshtein(sender.display_name, 'siriusxm') <= 1
  or strings.ilike(sender.email.domain.domain, '*siriusxm*')
  or (
    strings.istarts_with(body.current_thread.text, 'sirius xm')
    and regex.contains(body.current_thread.text,
                       '[\x{1F600}-\x{1F64F}]|[\x{1F300}-\x{1F5FF}]|[\x{1F680}-\x{1F6FF}]|[\x{1F1E0}-\x{1F1FF}]|[\x{2600}-\x{26FF}]|[\x{2700}-\x{27BF}]'
    )
  )
)
and (
  sender.email.domain.root_domain not in (
    'siriusxm.com',
    'siriusxmmedia.com',
    'siriusxm.ca',
    'engagement360.net', // SiriusXM survey vendor
    'sciquest.com' // SiriusXM Procurement
  )
  or (
    sender.email.domain.root_domain in (
      'siriusxm.com',
      'siriusxmmedia.com',
      'siriusxm.ca',
      'engagement360.net', // SiriusXM survey vendor
      'sciquest.com' // SiriusXM Procurement
    )
    and not headers.auth_summary.dmarc.pass
  )
)
and not profile.by_sender().solicited
// negate highly trusted sender domains unless they fail DMARC authentication
and not (
  sender.email.domain.root_domain in $high_trust_sender_root_domains
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

Detection logic

Scope: inbound message.

Impersonation of the broadcasting corporation SiriusXM.

  1. inbound message
  2. any of:
    • sender.display_name matches 'sirius[._-]?xm'
    • sender.display_name is similar to 'siriusxm'
    • sender.email.domain.domain matches '*siriusxm*'
    • all of:
      • body.current_thread.text starts with 'sirius xm'
      • body.current_thread.text matches '[\\x{1F600}-\\x{1F64F}]|[\\x{1F300}-\\x{1F5FF}]|[\\x{1F680}-\\x{1F6FF}]|[\\x{1F1E0}-\\x{1F1FF}]|[\\x{2600}-\\x{26FF}]|[\\x{2700}-\\x{27BF}]'
  3. any of:
    • sender.email.domain.root_domain not in ('siriusxm.com', 'siriusxmmedia.com', 'siriusxm.ca', 'engagement360.net', 'sciquest.com')
    • all of:
      • sender.email.domain.root_domain in ('siriusxm.com', 'siriusxmmedia.com', 'siriusxm.ca', 'engagement360.net', 'sciquest.com')
      • not:
        • headers.auth_summary.dmarc.pass
  4. not:
    • profile.by_sender().solicited
  5. not:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • coalesce(headers.auth_summary.dmarc.pass)

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: profile.by_sender, regex.contains, regex.icontains, strings.ilevenshtein, strings.ilike, strings.istarts_with. Reference lists: $high_trust_sender_root_domains.

Indicators matched (10)

FieldMatchValue
regex.icontainsregexsirius[._-]?xm
strings.ilevenshteinfuzzysiriusxm
strings.ilikesubstring*siriusxm*
strings.istarts_withprefixsirius xm
regex.containsregex[\x{1F600}-\x{1F64F}]|[\x{1F300}-\x{1F5FF}]|[\x{1F680}-\x{1F6FF}]|[\x{1F1E0}-\x{1F1FF}]|[\x{2600}-\x{26FF}]|[\x{2700}-\x{27BF}]
sender.email.domain.root_domainmembersiriusxm.com
sender.email.domain.root_domainmembersiriusxmmedia.com
sender.email.domain.root_domainmembersiriusxm.ca
sender.email.domain.root_domainmemberengagement360.net
sender.email.domain.root_domainmembersciquest.com

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["engagement360.net", "sciquest.com", "siriusxm.ca", "siriusxm.com", "siriusxmmedia.com"]
    not
      sender.email.domain.root_domain in ["engagement360.net", "sciquest.com", "siriusxm.ca", "siriusxm.com", "siriusxmmedia.com"]
  or
    and
      body.current_thread.text regex_match "[\\x{1F600}-\\x{1F64F}]|[\\x{1F300}-\\x{1F5FF}]|[\\x{1F680}-\\x{1F6FF}]|[\\x{1F1E0}-\\x{1F1FF}]|[\\x{2600}-\\x{26FF}]|[\\x{2700}-\\x{27BF}]"
      body.current_thread.text starts_with "sirius xm"
    sender.display_name regex_match "sirius[._-]?xm"
    sender.email.domain.domain match "siriusxm"
    strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"siriusxm\") <= 1"
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
  not
    profile.by_sender func_call "profile.by_sender().solicited"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: SoFi

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

Detects messages impersonating SoFi by analyzing sender display name, domain, body content including specific address references and phone numbers, while excluding legitimate SoFi communications with proper DMARC authentication.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
// standard brand template
and (
  // disclaimer
  (
    regex.icontains(body.current_thread.text,
                    '\bsofi (?:bank|invest|securities|team|tech|wealth)\b'
    )
    and regex.icontains(body.current_thread.text,
                        '©.20[0-9]{2}.(?:sofi|social finance)'
    )
    // phone numbers
    and regex.icontains(body.current_thread.text,
                        '\(855\)[\s\-\.]456[\s\-\.]7634',
                        '\(844\)[\s\-\.]908[\s\-\.]7634'
    )
  )

  // address
  or (
    regex.icontains(body.current_thread.text, '\bsofi\b')
    and strings.icontains(body.current_thread.text, "2750 E Cottonwood Pkwy")
    and strings.icontains(body.current_thread.text, "Salt Lake City, UT 84121")
  )

  // observed cred theft ttp
  or (
    regex.icontains(sender.display_name, '\bsofi\b')
    and strings.icontains(body.current_thread.text,
                          "trade confirmation",
                          "self-directed investing account"
    )
  )
)

// negate legitimate replies
and not (
  (length(headers.references) > 0 or headers.in_reply_to is not null)
  and (subject.is_forward or subject.is_reply)
  and length(body.previous_threads) >= 1
)

// topic negations
and not any(ml.nlu_classifier(body.current_thread.text).topics,
            .name in ("Newsletters and Digests")
)

// negate sofi & related domains
and not (
  sender.email.domain.root_domain in (
    "sofi.com", // parent domain
    "sofi.org", // observed sender domain
    "samsung.com", // financial partnership
    "investordelivery.com" // financials delivery platform
  )
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

// negate high trust sender root domains unless they fail authentication
and not (
  sender.email.domain.root_domain in $high_trust_sender_root_domains
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

Detection logic

Scope: inbound message.

Detects messages impersonating SoFi by analyzing sender display name, domain, body content including specific address references and phone numbers, while excluding legitimate SoFi communications with proper DMARC authentication.

  1. inbound message
  2. any of:
    • all of:
      • body.current_thread.text matches '\\bsofi (?:bank|invest|securities|team|tech|wealth)\\b'
      • body.current_thread.text matches '©.20[0-9]{2}.(?:sofi|social finance)'
      • body.current_thread.text matches any of 2 patterns
        • \(855\)[\s\-\.]456[\s\-\.]7634
        • \(844\)[\s\-\.]908[\s\-\.]7634
    • all of:
      • body.current_thread.text matches '\\bsofi\\b'
      • body.current_thread.text contains '2750 E Cottonwood Pkwy'
      • body.current_thread.text contains 'Salt Lake City, UT 84121'
    • all of:
      • sender.display_name matches '\\bsofi\\b'
      • body.current_thread.text contains any of 2 patterns
        • trade confirmation
        • self-directed investing account
  3. not:
    • all of:
      • any of:
        • length(headers.references) > 0
        • headers.in_reply_to is set
      • any of:
        • subject.is_forward
        • subject.is_reply
      • length(body.previous_threads) ≥ 1
  4. not:
    • any of ml.nlu_classifier(body.current_thread.text).topics where:
      • .name in ('Newsletters and Digests')
  5. not:
    • all of:
      • sender.email.domain.root_domain in ('sofi.com', 'sofi.org', 'samsung.com', 'investordelivery.com')
      • coalesce(headers.auth_summary.dmarc.pass)
  6. not:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • coalesce(headers.auth_summary.dmarc.pass)

Inspects: body.current_thread.text, body.previous_threads, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.display_name, sender.email.domain.root_domain, subject.is_forward, subject.is_reply, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains. Reference lists: $high_trust_sender_root_domains.

Indicators matched (9)

FieldMatchValue
regex.icontainsregex\bsofi (?:bank|invest|securities|team|tech|wealth)\b
regex.icontainsregex©.20[0-9]{2}.(?:sofi|social finance)
regex.icontainsregex\(855\)[\s\-\.]456[\s\-\.]7634
regex.icontainsregex\(844\)[\s\-\.]908[\s\-\.]7634
regex.icontainsregex\bsofi\b
strings.icontainssubstring2750 E Cottonwood Pkwy
strings.icontainssubstringSalt Lake City, UT 84121
strings.icontainssubstringtrade confirmation
strings.icontainssubstringself-directed investing account

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      or
        body.current_thread.text contains "self-directed investing account"
        body.current_thread.text contains "trade confirmation"
      sender.display_name regex_match "\\bsofi\\b"
    and
      or
        body.current_thread.text regex_match "\\(844\\)[\\s\\-\\.]908[\\s\\-\\.]7634"
        body.current_thread.text regex_match "\\(855\\)[\\s\\-\\.]456[\\s\\-\\.]7634"
      body.current_thread.text regex_match "\\bsofi (?:bank|invest|securities|team|tech|wealth)\\b"
      body.current_thread.text regex_match "©.20[0-9]{2}.(?:sofi|social finance)"
    and
      body.current_thread.text contains "2750 E Cottonwood Pkwy"
      body.current_thread.text contains "Salt Lake City, UT 84121"
      body.current_thread.text regex_match "\\bsofi\\b"
  not
    and
      or
        headers.in_reply_to is_not_null
        headers.references length_compare "0"
      or
        subject.is_forward eq "true"
        subject.is_reply eq "true"
      body.previous_threads length_compare "1"
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
      sender.email.domain.root_domain in ["investordelivery.com", "samsung.com", "sofi.com", "sofi.org"]
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
  not
    any(ml.nlu_classifier(body.current_thread.text).topics)
      ml.nlu_classifier(body.current_thread.text).topics.name eq "Newsletters and Digests"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.in_reply_tois_not_null(no value, null check)excludes:headers.in_reply_to
headers.referenceslength_compare0excludes:headers.references field:"headers.references" value:"0"
subject.is_forwardeqtrueexcludes:subject.is_forward field:"subject.is_forward" value:"true"
subject.is_replyeqtrueexcludes:subject.is_reply field:"subject.is_reply" value:"true"
body.previous_threadslength_compare1excludes:body.previous_threads field:"body.previous_threads" value:"1"
sender.email.domain.root_domainininvestordelivery.com, samsung.com, sofi.com, sofi.orgexcludes:sender.email.domain.root_domain
ml.nlu_classifier(body.current_thread.text).topicsarray_any(no value, null check)excludes:ml.nlu_classifier(body.current_thread.text).topics

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textcontains
  • 2750 E Cottonwood Pkwy
  • Salt Lake City, UT 84121
  • self-directed investing account
  • trade confirmation
field:"body.current_thread.text" kind:contains
body.current_thread.textregex_match
  • (844)[\s\-.]908[\s\-.]7634
  • (855)[\s\-.]456[\s\-.]7634
  • \bsofi (?:bank|invest|securities|team|tech|wealth)\b
  • \bsofi\b
  • ©.20[0-9]{2}.(?:sofi|social finance)
field:"body.current_thread.text" kind:regex_match
sender.display_nameregex_match
  • \bsofi\b
field:"sender.display_name" kind:regex_match value:"\bsofi\b"
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Square

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

Impersonation of Square, typically containing security-related language, secure message notifications, or credential theft indicators from unauthorized senders.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and (
  // levenshtein distance similar to Square
  (
    strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                         'square'
    ) <= 1
    and sender.display_name not in ("SquareX")
  )
  or any(ml.logo_detect(file.message_screenshot()).brands,
         .name == "Square" and .confidence == "high"
  )
)
and (
  (
    any(ml.nlu_classifier(body.current_thread.text).topics,
        .name in (
          "Security and Authentication",
          "Secure Message",
          "Reminders and Notifications"
        )
        and .confidence in ("medium", "high")
    )
    and not any(ml.nlu_classifier(body.current_thread.text).topics,
                .name in ("Newsletters and Digests", "Entertainment and Sports")
                and .confidence in ("medium", "high")
    )
  )
  or (
    beta.ocr(file.message_screenshot()).text != ""
    and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
            .name in (
              "Security and Authentication",
              "Secure Message",
              "Reminders and Notifications"
            )
            and .confidence in ("medium", "high")
    )
    and not any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
                .name in ("Newsletters and Digests", "Entertainment and Sports")
                and .confidence in ("medium", "high")
    )
  )
  or any(ml.nlu_classifier(body.current_thread.text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
  or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
)

// and the sender is not in org_domains or from Square domains and passes auth
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    sender.email.domain.root_domain in (
      "square.com",
      "squareup.com",
      "block.com"
    )
    and headers.auth_summary.dmarc.pass
  )
)
// and the sender is not from high trust sender root domains
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().solicited
  or not headers.auth_summary.dmarc.pass
  or not headers.auth_summary.spf.pass
)

Detection logic

Scope: inbound message.

Impersonation of Square, typically containing security-related language, secure message notifications, or credential theft indicators from unauthorized senders.

  1. inbound message
  2. any of:
    • all of:
      • strings.replace_confusables(sender.display_name) is similar to 'square'
      • sender.display_name not in ('SquareX')
    • any of ml.logo_detect(file.message_screenshot()).brands where all hold:
      • .name is 'Square'
      • .confidence is 'high'
  3. any of:
    • all of:
      • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
        • .confidence in ('medium', 'high')
      • not:
        • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
          • .name in ('Newsletters and Digests', 'Entertainment and Sports')
          • .confidence in ('medium', 'high')
    • all of:
      • beta.ocr(file.message_screenshot()).text is not ''
      • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
        • .confidence in ('medium', 'high')
      • not:
        • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
          • .name in ('Newsletters and Digests', 'Entertainment and Sports')
          • .confidence in ('medium', 'high')
    • 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(beta.ocr(file.message_screenshot()).text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence is 'high'
  4. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • sender.email.domain.root_domain in ('square.com', 'squareup.com', 'block.com')
      • headers.auth_summary.dmarc.pass
  5. 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
  6. any of:
    • not:
      • profile.by_sender().solicited
    • not:
      • headers.auth_summary.dmarc.pass
    • not:
      • headers.auth_summary.spf.pass

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, strings.ilevenshtein, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (17)

FieldMatchValue
strings.ilevenshteinfuzzysquare
ml.logo_detect(file.message_screenshot()).brands[].nameequalsSquare
ml.logo_detect(file.message_screenshot()).brands[].confidenceequalshigh
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecure Message
ml.nlu_classifier(body.current_thread.text).topics[].namememberReminders and Notifications
ml.nlu_classifier(body.current_thread.text).topics[].confidencemembermedium
ml.nlu_classifier(body.current_thread.text).topics[].confidencememberhigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecure Message
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberReminders and Notifications
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencemembermedium
5 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencememberhigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].nameequalscred_theft
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].confidenceequalshigh

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
          and
            ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
            ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Entertainment and Sports", "Newsletters and Digests"]
      any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
        and
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
      beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
    and
      not
        any(ml.nlu_classifier(body.current_thread.text).topics)
          and
            ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
            ml.nlu_classifier(body.current_thread.text).topics.name in ["Entertainment and Sports", "Newsletters and Digests"]
      any(ml.nlu_classifier(body.current_thread.text).topics)
        and
          ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
          ml.nlu_classifier(body.current_thread.text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
    any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
      and
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
  not
    or
      and
        headers.auth_summary.dmarc.pass eq "true"
        sender.email.domain.root_domain in ["block.com", "square.com", "squareup.com"]
       macro "sender.email.domain.root_domain in org_domains"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    any(ml.logo_detect(file.message_screenshot()).brands)
      and
        ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
        ml.logo_detect(file.message_screenshot()).brands.name eq "Square"
    and
      not
        sender.display_name eq "SquareX"
      strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"square\") <= 1"
  or
    not
      headers.auth_summary.dmarc.pass eq "true"
    not
      headers.auth_summary.spf.pass eq "true"
    not
      profile.by_sender func_call "profile.by_sender().solicited"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Squarespace

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

Detects impersonation of Squarespace through sender display name or subject line similarity, where the sender is not from legitimate Squarespace domains or fails authentication checks.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • headers.auth_summary
  • sender.email
  • type

Rule body

type.inbound
and (
  strings.icontains(strings.replace_confusables(sender.display_name),
                    "squarespace"
  )
  or strings.ilevenshtein(sender.display_name, "squarespace") < 2
  or regex.icontains(sender.display_name,
                     's\x{206E}+q\x{206E}+u\x{206E}+a\x{206E}+r\x{206E}+e\x{206E}+s\x{206E}+p\x{206E}+a\x{206E}+c\x{206E}+e'
  )
)
// and the sender is not in org_domains or from Squarespace domains and passes auth
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    sender.email.domain.root_domain in (
      "squarespace.com",
      "squarespace.info",
      "shipstation.com"
    )
    and headers.auth_summary.dmarc.pass
  )
)
// negate highly trusted sender domains unless they fail DMARC authentication
and not (
  sender.email.domain.root_domain in $high_trust_sender_root_domains
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

Detection logic

Scope: inbound message.

Detects impersonation of Squarespace through sender display name or subject line similarity, where the sender is not from legitimate Squarespace domains or fails authentication checks.

  1. inbound message
  2. any of:
    • strings.replace_confusables(sender.display_name) contains 'squarespace'
    • sender.display_name is similar to 'squarespace'
    • sender.display_name matches 's\\x{206E}+q\\x{206E}+u\\x{206E}+a\\x{206E}+r\\x{206E}+e\\x{206E}+s\\x{206E}+p\\x{206E}+a\\x{206E}+c\\x{206E}+e'
  3. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • sender.email.domain.root_domain in ('squarespace.com', 'squarespace.info', 'shipstation.com')
      • headers.auth_summary.dmarc.pass
  4. not:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • coalesce(headers.auth_summary.dmarc.pass)

Inspects: headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: regex.icontains, strings.icontains, strings.ilevenshtein, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (3)

FieldMatchValue
strings.icontainssubstringsquarespace
strings.ilevenshteinfuzzysquarespace
regex.icontainsregexs\x{206E}+q\x{206E}+u\x{206E}+a\x{206E}+r\x{206E}+e\x{206E}+s\x{206E}+p\x{206E}+a\x{206E}+c\x{206E}+e

Stages and Predicates

Stage 1: mql_rule

and
  not
    or
      and
        headers.auth_summary.dmarc.pass eq "true"
        sender.email.domain.root_domain in ["shipstation.com", "squarespace.com", "squarespace.info"]
       macro "sender.email.domain.root_domain in org_domains"
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
  or
    sender.display_name regex_match "s\\x{206E}+q\\x{206E}+u\\x{206E}+a\\x{206E}+r\\x{206E}+e\\x{206E}+s\\x{206E}+p\\x{206E}+a\\x{206E}+c\\x{206E}+e"
    strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"squarespace\") < 2"
    strings.replace_confusables(sender.display_name) contains "squarespace"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

Brand impersonation: State Farm

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

Detects messages impersonating State Farm insurance company through display name spoofing or similar variations, excluding legitimate communications from verified State Farm domains with proper DMARC authentication.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering, Spoofing

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • headers.auth_summary
  • sender.email
  • type

Rule body

type.inbound
and (
  regex.icontains(sender.display_name, 'state\s?farm')
  and not (
    strings.icontains(sender.display_name, "state farm")
    and (
      strings.icontains(sender.display_name, "center")
      or strings.icontains(sender.display_name, "arena")
      or strings.icontains(sender.display_name, "stadium")
      or strings.icontains(sender.display_name, "hall")
      or strings.icontains(sender.display_name, "classic")
      or strings.icontains(sender.display_name, "showdown")
      or strings.icontains(sender.display_name, "perks at work")
    )
  )
)

// and the sender is not in org_domains or from State Farm domains
and not (
  (
    sender.email.domain.root_domain in $org_domains
    or sender.email.domain.root_domain in $high_trust_sender_root_domains
    or sender.email.domain.root_domain in (
      "statefarm.com",
      "statefarminsurance.com",
      "statefarm.ca",
      "statefarmbank.com",
      "sfauthentication.com",
      "statefarmarena.com",
      "statefarmservice.com",
      "statefarmisthere.com",
      "digitalpayouts.com", // State Farm use this domain for claim payouts
      "aravo.com", // risk management company State Farm uses
      "statefarmclaims.com",
      "statefarmfeedback.com", // legit survey
      "statefarmsurveys.com", // legit survey
      "nationalesurvey.com"
    )
  )
)
// negate highly trusted sender domains unless they fail DMARC authentication
and not (
  sender.email.domain.root_domain in $high_trust_sender_root_domains
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

Detection logic

Scope: inbound message.

Detects messages impersonating State Farm insurance company through display name spoofing or similar variations, excluding legitimate communications from verified State Farm domains with proper DMARC authentication.

  1. inbound message
  2. all of:
    • sender.display_name matches 'state\\s?farm'
    • not:
      • all of:
        • sender.display_name contains 'state farm'
        • sender.display_name contains any of 7 patterns
          • center
          • arena
          • stadium
          • hall
          • classic
          • showdown
          • perks at work
  3. none of:
    • sender.email.domain.root_domain in $org_domains
    • sender.email.domain.root_domain in $high_trust_sender_root_domains
    • sender.email.domain.root_domain in ('statefarm.com', 'statefarminsurance.com', 'statefarm.ca', 'statefarmbank.com', 'sfauthentication.com', 'statefarmarena.com', 'statefarmservice.com', 'statefarmisthere.com', 'digitalpayouts.com', 'aravo.com', 'statefarmclaims.com', 'statefarmfeedback.com', 'statefarmsurveys.com', 'nationalesurvey.com')
  4. not:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • coalesce(headers.auth_summary.dmarc.pass)

Inspects: headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: regex.icontains, strings.icontains. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (1)

FieldMatchValue
regex.icontainsregexstate\s?farm

Stages and Predicates

Stage 1: mql_rule

and
  not
    and
      or
        sender.display_name contains "arena"
        sender.display_name contains "center"
        sender.display_name contains "classic"
        sender.display_name contains "hall"
        sender.display_name contains "perks at work"
        sender.display_name contains "showdown"
        sender.display_name contains "stadium"
      sender.display_name contains "state farm"
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
  not
    or
      sender.email.domain.root_domain in ["aravo.com", "digitalpayouts.com", "nationalesurvey.com", "sfauthentication.com", "statefarm.ca", "statefarm.com", "statefarmarena.com", "statefarmbank.com", "statefarmclaims.com", "statefarmfeedback.com", "statefarminsurance.com", "statefarmisthere.com", "statefarmservice.com", "statefarmsurveys.com"]
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
       macro "sender.email.domain.root_domain in org_domains"
  sender.display_name regex_match "state\\s?farm"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
sender.display_namecontainsarenaexcludes:sender.display_name field:"sender.display_name" value:"arena"
sender.display_namecontainscenterexcludes:sender.display_name field:"sender.display_name" value:"center"
sender.display_namecontainsclassicexcludes:sender.display_name field:"sender.display_name" value:"classic"
sender.display_namecontainshallexcludes:sender.display_name field:"sender.display_name" value:"hall"
sender.display_namecontainsperks at workexcludes:sender.display_name field:"sender.display_name" value:"perks at work"
sender.display_namecontainsshowdownexcludes:sender.display_name field:"sender.display_name" value:"showdown"
sender.display_namecontainsstadiumexcludes:sender.display_name field:"sender.display_name" value:"stadium"
sender.display_namecontainsstate farmexcludes:sender.display_name field:"sender.display_name" value:"state farm"
sender.email.domain.root_domaininaravo.com, digitalpayouts.com, nationalesurvey.com, sfauthentication.com, statefarm.ca, statefarm.com, statefarmarena.com, statefarmbank.com, statefarmclaims.com, statefarmfeedback.com, statefarminsurance.com, statefarmisthere.com, statefarmservice.com, statefarmsurveys.comexcludes:sender.email.domain.root_domain

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Stripe notification

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

Campaigns have been observed sending templated Stripe notification emails with the call-to-action button link replaced, clicking through to a malicious credential phishing page.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesEvasion, Impersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.links
  • headers
  • headers.auth_summary
  • sender.email
  • type

Rule body

type.inbound
and (
  strings.ilike(sender.display_name, 'stripe*')
  or strings.ilevenshtein(sender.display_name, 'stripe') <= 1
  or strings.ilike(sender.email.domain.domain, '*stripe*')
)
and (
  any(body.links,
      (
        .display_text in~ ("view in dashboard")
        or (
          network.whois(.href_url.domain).days_old < 30
          and regex.icontains(.display_text, 'view|click|dashboard|portal')
        )
      )
      and .href_url.domain.root_domain != "stripe.com"
  )
  // if it's a well done fake payment notification, the only 2 links that aren't from Stripe
  // are the customer's email address and the CTA button (view in dashboard, click for more info, etc.)
  or (
    length(filter(body.links,
                  .href_url.domain.root_domain != 'stripe.com'
                  and .display_text is not null
           )
    ) == 2
    and length(body.links) > 2
  )
)
and not (
  sender.email.domain.root_domain in ("stripe.com", "pinstripes.com")
  and headers.auth_summary.dmarc.pass
)
// 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
)
and (
  (
    profile.by_sender().prevalence in ("new", "outlier")
    and not profile.by_sender().solicited
  )
  or (
    profile.by_sender().any_messages_malicious_or_spam
    and not profile.by_sender().any_messages_benign
  )
)
and not profile.by_sender().any_messages_benign

Detection logic

Scope: inbound message.

Campaigns have been observed sending templated Stripe notification emails with the call-to-action button link replaced, clicking through to a malicious credential phishing page.

  1. inbound message
  2. any of:
    • sender.display_name matches 'stripe*'
    • sender.display_name is similar to 'stripe'
    • sender.email.domain.domain matches '*stripe*'
  3. any of:
    • any of body.links where all hold:
      • any of:
        • .display_text in ('view in dashboard')
        • all of:
          • network.whois(.href_url.domain).days_old < 30
          • .display_text matches 'view|click|dashboard|portal'
      • .href_url.domain.root_domain is not 'stripe.com'
    • all of:
      • length(filter(body.links, .href_url.domain.root_domain != 'stripe.com' and .display_text is not null)) is 2
      • length(body.links) > 2
  4. not:
    • all of:
      • sender.email.domain.root_domain in ('stripe.com', 'pinstripes.com')
      • headers.auth_summary.dmarc.pass
  5. 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
  6. any of:
    • all of:
      • profile.by_sender().prevalence in ('new', 'outlier')
      • not:
        • profile.by_sender().solicited
    • all of:
      • profile.by_sender().any_messages_malicious_or_spam
      • not:
        • profile.by_sender().any_messages_benign
  7. not:
    • profile.by_sender().any_messages_benign

Inspects: body.links, body.links[].display_text, body.links[].href_url.domain, body.links[].href_url.domain.root_domain, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: network.whois, profile.by_sender, regex.icontains, strings.ilevenshtein, strings.ilike. Reference lists: $high_trust_sender_root_domains.

Indicators matched (5)

FieldMatchValue
strings.ilikesubstringstripe*
strings.ilevenshteinfuzzystripe
strings.ilikesubstring*stripe*
body.links[].display_textmemberview in dashboard
regex.icontainsregexview|click|dashboard|portal

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(body.links)
      and
        or
          and
            body.links.display_text regex_match "view|click|dashboard|portal"
            network.whois func_call "network.whois(body.links[].href_url.domain).days_old < 30"
          body.links.display_text eq "view in dashboard"
        body.links.href_url.domain.root_domain ne "stripe.com"
    and
      body.links length_compare "2"
      filter(body.links, .href_url.domain.root_domain != 'stripe.com' and .display_text is not null) length_compare "2"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    and
      not
        profile.by_sender func_call "profile.by_sender().any_messages_benign"
      profile.by_sender func_call "profile.by_sender().any_messages_malicious_or_spam"
    and
      not
        profile.by_sender func_call "profile.by_sender().solicited"
      profile.by_sender func_call "profile.by_sender().prevalence in (new, outlier)"
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["pinstripes.com", "stripe.com"]
  not
    profile.by_sender func_call "profile.by_sender().any_messages_benign"
  or
    sender.display_name starts_with "stripe"
    sender.email.domain.domain match "stripe"
    strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"stripe\") <= 1"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Survey request with credential theft indicators

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

Detects messages containing credential theft language disguised as survey requests from promotional content, targeting organizations from untrusted or spoofed high-trust domains.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesSocial engineering, Impersonation: Brand, Spoofing

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and (
  any(ml.nlu_classifier(body.current_thread.text).intents,
      .name == "cred_theft" and .confidence == "high"
  )
  or any(ml.nlu_classifier(body.current_thread.text).entities,
         .name == "org" and .text in ('AAA', 'Medicare Kit')
  )
  or any(ml.nlu_classifier(body.current_thread.text).entities,
         .name == "request"
         and regex.icontains(.text, 'claim\s+your\s+(?:free|medical)?\s+kit')
  )
  or length(filter(ml.nlu_classifier(body.current_thread.text).entities,
                   .name == "financial"
                   and regex.icontains(.text, '\d{2}%\s*discount$')
            )
  ) >= 2
)
and any(ml.nlu_classifier(body.current_thread.text).topics,
        .name == "Advertising and Promotions" and .confidence != "low"
)
and any(ml.nlu_classifier(body.current_thread.text).entities,
        .name in ("request", "org") and strings.icontains(.text, "survey")
)
// and the sender is not from high trust sender root domains
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 containing credential theft language disguised as survey requests from promotional content, targeting organizations from untrusted or spoofed high-trust domains.

  1. inbound message
  2. any 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 'org'
      • .text in ('AAA', 'Medicare Kit')
    • any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
      • .name is 'request'
      • .text matches 'claim\\s+your\\s+(?:free|medical)?\\s+kit'
    • length(filter(ml.nlu_classifier(body.current_thread.text).entities, .name == 'financial' and regex.icontains(.text, '\\d{2}%\\s*discount$'))) ≥ 2
  3. any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
    • .name is 'Advertising and Promotions'
    • .confidence is not 'low'
  4. any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
    • .name in ('request', 'org')
    • .text contains 'survey'
  5. 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, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains. Reference lists: $high_trust_sender_root_domains.

Indicators matched (13)

FieldMatchValue
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[].nameequalsorg
ml.nlu_classifier(body.current_thread.text).entities[].textmemberAAA
ml.nlu_classifier(body.current_thread.text).entities[].textmemberMedicare Kit
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsrequest
regex.icontainsregexclaim\s+your\s+(?:free|medical)?\s+kit
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsfinancial
regex.icontainsregex\d{2}%\s*discount$
ml.nlu_classifier(body.current_thread.text).topics[].nameequalsAdvertising and Promotions
ml.nlu_classifier(body.current_thread.text).entities[].namememberrequest
ml.nlu_classifier(body.current_thread.text).entities[].namememberorg
1 more
strings.icontainssubstringsurvey

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    any(ml.nlu_classifier(body.current_thread.text).entities)
      and
        ml.nlu_classifier(body.current_thread.text).entities.name eq "org"
        ml.nlu_classifier(body.current_thread.text).entities.text in ["AAA", "Medicare Kit"]
    any(ml.nlu_classifier(body.current_thread.text).entities)
      and
        ml.nlu_classifier(body.current_thread.text).entities.name eq "request"
        ml.nlu_classifier(body.current_thread.text).entities.text regex_match "claim\\s+your\\s+(?:free|medical)?\\s+kit"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
    filter(ml.nlu_classifier(body.current_thread.text).entities, .name == 'financial' and regex.icontains(.text, '\\d{2}%\\s*discount$')) length_compare "2"
  any(ml.nlu_classifier(body.current_thread.text).entities)
    and
      ml.nlu_classifier(body.current_thread.text).entities.name in ["org", "request"]
      ml.nlu_classifier(body.current_thread.text).entities.text contains "survey"
  any(ml.nlu_classifier(body.current_thread.text).topics)
    and
      ml.nlu_classifier(body.current_thread.text).topics.confidence ne "low"
      ml.nlu_classifier(body.current_thread.text).topics.name eq "Advertising and Promotions"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: TikTok

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

Detects messages impersonating TikTok through similar display names or logo detection, combined with security-themed content and authentication failures. Excludes legitimate TikTok communications and trusted senders.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • headers.hops
  • sender.email
  • type

Rule body

type.inbound
and (
  // TikTok Brand Detection 
  (
    // display name contains tiktok
    strings.ilike(strings.replace_confusables(sender.display_name), '*tiktok*')
    // levenshtein distance similar to tiktok
    or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                            'tiktok'
    ) <= 1
    or (
      length(ml.logo_detect(file.message_screenshot()).brands) == 1
      and any(ml.logo_detect(file.message_screenshot()).brands,
              .name == "TikTok" and .confidence == "high"
      )
    )
    // hyphenated sender domain contains tiktok
    or strings.iends_with(sender.email.domain.root_domain, "-tiktok.com")
  )
  // OR TikTok verification language
  or (
    strings.icontains(body.current_thread.text, "tiktok")
    and (
      strings.icontains(body.current_thread.text, "verified badge")
      or strings.icontains(body.current_thread.text, "verification criteria")
      or strings.icontains(body.current_thread.text, "activate badge")
      or strings.icontains(body.current_thread.text, "verification complete")
      or strings.icontains(body.current_thread.text, "almost verified")
      or strings.icontains(body.current_thread.text, "review complete")
      or strings.icontains(body.current_thread.text, "verify profile")
    )
  )
)
and (
  // ML Topic Analysis and Credential Theft Detection
  any(ml.nlu_classifier(body.current_thread.text).topics,
      .name in (
        "Security and Authentication",
        "Secure Message",
        "Reminders and Notifications"
      )
      and .confidence in ("medium", "high")
  )
  or (
    beta.ocr(file.message_screenshot()).text != ""
    and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
            .name in (
              "Security and Authentication",
              "Secure Message",
              "Reminders and Notifications"
            )
            and .confidence in ("medium", "high")
    )
  )
  or any(ml.nlu_classifier(body.current_thread.text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
  or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
)
// Not from legitimate TikTok or Google domains with DMARC pass
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    sender.email.domain.root_domain in (
      "tiktok.com",
      "tiktokglobalshop.com",
      "tiktokusds.com",
      "bytedance.com",
      "tiktokacademy.com",
      "webassessor.com" // used for this https://ads.tiktok.com/business/en-US/academy/tiktok-certification
    )
    and headers.auth_summary.dmarc.pass
  )
)
// negate iCloud Private Message Relay
and not (
  sender.email.domain.domain == "privaterelay.appleid.com"
  or any(headers.hops, any(.fields, .name == "X-ICLOUD-HME"))
)
// 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
)
and not profile.by_sender().solicited

Detection logic

Scope: inbound message.

Detects messages impersonating TikTok through similar display names or logo detection, combined with security-themed content and authentication failures. Excludes legitimate TikTok communications and trusted senders.

  1. inbound message
  2. any of:
    • any of:
      • strings.replace_confusables(sender.display_name) matches '*tiktok*'
      • strings.replace_confusables(sender.display_name) is similar to 'tiktok'
      • all of:
        • length(ml.logo_detect(file.message_screenshot()).brands) is 1
        • any of ml.logo_detect(file.message_screenshot()).brands where all hold:
          • .name is 'TikTok'
          • .confidence is 'high'
      • sender.email.domain.root_domain ends with '-tiktok.com'
    • all of:
      • body.current_thread.text contains 'tiktok'
      • body.current_thread.text contains any of 7 patterns
        • verified badge
        • verification criteria
        • activate badge
        • verification complete
        • almost verified
        • review complete
        • verify profile
  3. any of:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
      • .confidence in ('medium', 'high')
    • all of:
      • beta.ocr(file.message_screenshot()).text is not ''
      • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
        • .confidence in ('medium', 'high')
    • 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(beta.ocr(file.message_screenshot()).text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence is 'high'
  4. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • sender.email.domain.root_domain in ('tiktok.com', 'tiktokglobalshop.com', 'tiktokusds.com', 'bytedance.com', 'tiktokacademy.com', 'webassessor.com')
      • headers.auth_summary.dmarc.pass
  5. none of:
    • sender.email.domain.domain is 'privaterelay.appleid.com'
    • any of headers.hops where:
      • any of .fields where:
        • .name is 'X-ICLOUD-HME'
  6. 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
  7. not:
    • profile.by_sender().solicited

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, strings.icontains, strings.iends_with, strings.ilevenshtein, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (27)

FieldMatchValue
strings.ilikesubstring*tiktok*
strings.ilevenshteinfuzzytiktok
ml.logo_detect(file.message_screenshot()).brands[].nameequalsTikTok
ml.logo_detect(file.message_screenshot()).brands[].confidenceequalshigh
strings.iends_withsuffix-tiktok.com
strings.icontainssubstringtiktok
strings.icontainssubstringverified badge
strings.icontainssubstringverification criteria
strings.icontainssubstringactivate badge
strings.icontainssubstringverification complete
strings.icontainssubstringalmost verified
strings.icontainssubstringreview complete
15 more
strings.icontainssubstringverify profile
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecure Message
ml.nlu_classifier(body.current_thread.text).topics[].namememberReminders and Notifications
ml.nlu_classifier(body.current_thread.text).topics[].confidencemembermedium
ml.nlu_classifier(body.current_thread.text).topics[].confidencememberhigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecure Message
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberReminders and Notifications
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencemembermedium
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencememberhigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].nameequalscred_theft
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].confidenceequalshigh

Stages and Predicates

Stage 1: mql_rule

and
  not
    or
      any(headers.hops)
        any(headers.hops.fields)
          headers.hops.fields.name eq "X-ICLOUD-HME"
      sender.email.domain.domain eq "privaterelay.appleid.com"
  or
    and
      any(ml.logo_detect(file.message_screenshot()).brands)
        and
          ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
          ml.logo_detect(file.message_screenshot()).brands.name eq "TikTok"
      ml.logo_detect(file.message_screenshot()).brands length_compare "1"
    and
      or
        body.current_thread.text contains "activate badge"
        body.current_thread.text contains "almost verified"
        body.current_thread.text contains "review complete"
        body.current_thread.text contains "verification complete"
        body.current_thread.text contains "verification criteria"
        body.current_thread.text contains "verified badge"
        body.current_thread.text contains "verify profile"
      body.current_thread.text contains "tiktok"
    sender.email.domain.root_domain ends_with "-tiktok.com"
    strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"tiktok\") <= 1"
    strings.replace_confusables(sender.display_name) match "tiktok"
  or
    and
      any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
        and
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
      beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
    any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
      and
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).topics)
      and
        ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
        ml.nlu_classifier(body.current_thread.text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
  not
    or
      and
        headers.auth_summary.dmarc.pass eq "true"
        sender.email.domain.root_domain in ["bytedance.com", "tiktok.com", "tiktokacademy.com", "tiktokglobalshop.com", "tiktokusds.com", "webassessor.com"]
       macro "sender.email.domain.root_domain in org_domains"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  not
    profile.by_sender func_call "profile.by_sender().solicited"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.hopsarray_any(no value, null check)excludes:headers.hops
sender.email.domain.domaineqprivaterelay.appleid.comexcludes:sender.email.domain.domain field:"sender.email.domain.domain" value:"privaterelay.appleid.com"
headers.auth_summary.dmarc.passeqtrueexcludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true"
sender.email.domain.root_domaininbytedance.com, tiktok.com, tiktokacademy.com, tiktokglobalshop.com, tiktokusds.com, webassessor.comexcludes:sender.email.domain.root_domain

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Toronto-Dominion Bank

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

Impersonation of TD Bank or TD Canada Trust using display name spoofing or logo detection, combined with suspicious content related to security authentication or credential theft from unauthorized senders.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  // display name contains TD Bank
  (
    strings.ilike(strings.replace_confusables(sender.display_name), '*TD Bank*')
    or strings.ilike(strings.replace_confusables(sender.display_name),
                     '*TD Canada Trust*'
    )
    // levenshtein distance similar to TD bank
    or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                            'TD Bank'
    ) <= 1
    or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                            'TD Canada Trust'
    ) <= 1
    or any(ml.logo_detect(file.message_screenshot()).brands,
           .name == "TD Bank" and .confidence == "high"
    )
    // TD Secure Email
    or any([subject.base, sender.display_name], strings.ilike(., "*TD?Secure*"))
  )
)
and (
  (
    any(ml.nlu_classifier(body.current_thread.text).topics,
        .name in (
          "Security and Authentication",
          "Secure Message",
          "Reminders and Notifications"
        )
        and .confidence in ("medium", "high")
    )
    and not any(ml.nlu_classifier(body.current_thread.text).topics,
                .name in ("Newsletters and Digests", "Entertainment and Sports")
                and .confidence in ("medium", "high")
    )
  )
  or (
    beta.ocr(file.message_screenshot()).text != ""
    and any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
            .name in (
              "Security and Authentication",
              "Secure Message",
              "Reminders and Notifications"
            )
            and .confidence in ("medium", "high")
    )
    and not any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics,
                .name in ("Newsletters and Digests", "Entertainment and Sports")
                and .confidence in ("medium", "high")
    )
  )
  or any(ml.nlu_classifier(body.current_thread.text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
  or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,
         .name == "cred_theft" and .confidence == "high"
  )
)

// and the sender is not in org_domains or from TD domains and passes auth
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    sender.email.domain.root_domain in (
      "td.com",
      "tdbank.com",
      "tdcanadatrust.com",
      "tdameritrade.com",
      "tdwaterhouse.ca",
      "tdwaterhouse.com",
      "tdassetmanagement.com",
      "tdinsurance.com",
      "tdautofinance.com",
      "tdautofinance.ca",
      "email-td.com",
      "feedback-td.com",
      "interac.ca"
    )
    and headers.auth_summary.dmarc.pass
  )
)
// and the sender is not from high trust sender root domains
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().solicited
  or not headers.auth_summary.dmarc.pass
  or not headers.auth_summary.spf.pass
)

Detection logic

Scope: inbound message.

Impersonation of TD Bank or TD Canada Trust using display name spoofing or logo detection, combined with suspicious content related to security authentication or credential theft from unauthorized senders.

  1. inbound message
  2. any of:
    • strings.replace_confusables(sender.display_name) matches '*TD Bank*'
    • strings.replace_confusables(sender.display_name) matches '*TD Canada Trust*'
    • strings.replace_confusables(sender.display_name) is similar to 'TD Bank'
    • strings.replace_confusables(sender.display_name) is similar to 'TD Canada Trust'
    • any of ml.logo_detect(file.message_screenshot()).brands where all hold:
      • .name is 'TD Bank'
      • .confidence is 'high'
    • any of [subject.base, sender.display_name] where:
      • . matches '*TD?Secure*'
  3. any of:
    • all of:
      • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
        • .confidence in ('medium', 'high')
      • not:
        • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
          • .name in ('Newsletters and Digests', 'Entertainment and Sports')
          • .confidence in ('medium', 'high')
    • all of:
      • beta.ocr(file.message_screenshot()).text is not ''
      • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Reminders and Notifications')
        • .confidence in ('medium', 'high')
      • not:
        • any of ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics where all hold:
          • .name in ('Newsletters and Digests', 'Entertainment and Sports')
          • .confidence in ('medium', 'high')
    • 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(beta.ocr(file.message_screenshot()).text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence is 'high'
  4. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • sender.email.domain.root_domain in ('td.com', 'tdbank.com', 'tdcanadatrust.com', 'tdameritrade.com', 'tdwaterhouse.ca', 'tdwaterhouse.com', 'tdassetmanagement.com', 'tdinsurance.com', 'tdautofinance.com', 'tdautofinance.ca', 'email-td.com', 'feedback-td.com', 'interac.ca')
      • headers.auth_summary.dmarc.pass
  5. 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
  6. any of:
    • not:
      • profile.by_sender().solicited
    • not:
      • headers.auth_summary.dmarc.pass
    • not:
      • headers.auth_summary.spf.pass

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, sender.display_name, sender.email.domain.root_domain, subject.base, type.inbound. Sensors: beta.ocr, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, strings.ilevenshtein, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (21)

FieldMatchValue
strings.ilikesubstring*TD Bank*
strings.ilikesubstring*TD Canada Trust*
strings.ilevenshteinfuzzyTD Bank
strings.ilevenshteinfuzzyTD Canada Trust
ml.logo_detect(file.message_screenshot()).brands[].nameequalsTD Bank
ml.logo_detect(file.message_screenshot()).brands[].confidenceequalshigh
strings.ilikesubstring*TD?Secure*
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecure Message
ml.nlu_classifier(body.current_thread.text).topics[].namememberReminders and Notifications
ml.nlu_classifier(body.current_thread.text).topics[].confidencemembermedium
ml.nlu_classifier(body.current_thread.text).topics[].confidencememberhigh
9 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecurity and Authentication
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberSecure Message
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].namememberReminders and Notifications
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencemembermedium
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics[].confidencememberhigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].nameequalscred_theft
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].confidenceequalshigh

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
          and
            ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
            ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Entertainment and Sports", "Newsletters and Digests"]
      any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics)
        and
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.confidence in ["high", "medium"]
          ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
      beta.ocr func_call "beta.ocr(file.message_screenshot()).text != "
    and
      not
        any(ml.nlu_classifier(body.current_thread.text).topics)
          and
            ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
            ml.nlu_classifier(body.current_thread.text).topics.name in ["Entertainment and Sports", "Newsletters and Digests"]
      any(ml.nlu_classifier(body.current_thread.text).topics)
        and
          ml.nlu_classifier(body.current_thread.text).topics.confidence in ["high", "medium"]
          ml.nlu_classifier(body.current_thread.text).topics.name in ["Reminders and Notifications", "Secure Message", "Security and Authentication"]
    any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
      and
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
  not
    or
      and
        headers.auth_summary.dmarc.pass eq "true"
        sender.email.domain.root_domain in ["email-td.com", "feedback-td.com", "interac.ca", "td.com", "tdameritrade.com", "tdassetmanagement.com", "tdautofinance.ca", "tdautofinance.com", "tdbank.com", "tdcanadatrust.com", "tdinsurance.com", "tdwaterhouse.ca", "tdwaterhouse.com"]
       macro "sender.email.domain.root_domain in org_domains"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    any(ml.logo_detect(file.message_screenshot()).brands)
      and
        ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
        ml.logo_detect(file.message_screenshot()).brands.name eq "TD Bank"
    any([subject.base, sender.display_name])
      [subject.base, sender.display_name] match "TD?Secure"
    strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"TD Bank\") <= 1"
    strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"TD Canada Trust\") <= 1"
    strings.replace_confusables(sender.display_name) match "TD Bank"
    strings.replace_confusables(sender.display_name) match "TD Canada Trust"
  or
    not
      headers.auth_summary.dmarc.pass eq "true"
    not
      headers.auth_summary.spf.pass eq "true"
    not
      profile.by_sender func_call "profile.by_sender().solicited"
  type.inbound eq "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_domaininemail-td.com, feedback-td.com, interac.ca, td.com, tdameritrade.com, tdassetmanagement.com, tdautofinance.ca, tdautofinance.com, tdbank.com, tdcanadatrust.com, tdinsurance.com, tdwaterhouse.ca, tdwaterhouse.comexcludes:sender.email.domain.root_domain

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Trust Wallet

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

Detects inbound messages containing links where the sender impersonates Trust Wallet through display name manipulation and suspicious language, while not being from legitimate Trust Wallet domains. The rule checks for credential theft patterns and validates sender authentication.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Credential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and length(body.links) > 0
and (
  regex.icontains(strings.replace_confusables(sender.display_name),
                  '\btrust wa[li1]{2}et\b'
  )
  or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                          'trust wallet'
  ) <= 2
)
and (
  any(ml.nlu_classifier(body.current_thread.text).intents,
      .name in ("cred_theft", "callback_scam", "steal_pii", "extortion")
      and .confidence in ("high")
  )
)
and sender.email.domain.root_domain not in~ ('trustwallet.com')

// 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 inbound messages containing links where the sender impersonates Trust Wallet through display name manipulation and suspicious language, while not being from legitimate Trust Wallet domains. The rule checks for credential theft patterns and validates sender authentication.

  1. inbound message
  2. length(body.links) > 0
  3. any of:
    • strings.replace_confusables(sender.display_name) matches '\\btrust wa[li1]{2}et\\b'
    • strings.replace_confusables(sender.display_name) is similar to 'trust wallet'
  4. any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
    • .name in ('cred_theft', 'callback_scam', 'steal_pii', 'extortion')
    • .confidence in ('high')
  5. sender.email.domain.root_domain not in ('trustwallet.com')
  6. 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, body.links, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.ilevenshtein, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains.

Indicators matched (7)

FieldMatchValue
regex.icontainsregex\btrust wa[li1]{2}et\b
strings.ilevenshteinfuzzytrust wallet
ml.nlu_classifier(body.current_thread.text).intents[].namemembercred_theft
ml.nlu_classifier(body.current_thread.text).intents[].namemembercallback_scam
ml.nlu_classifier(body.current_thread.text).intents[].namemembersteal_pii
ml.nlu_classifier(body.current_thread.text).intents[].namememberextortion
ml.nlu_classifier(body.current_thread.text).intents[].confidencememberhigh

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  any(ml.nlu_classifier(body.current_thread.text).intents)
    and
      ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
      ml.nlu_classifier(body.current_thread.text).intents.name in ["callback_scam", "cred_theft", "extortion", "steal_pii"]
  not
    sender.email.domain.root_domain eq "trustwallet.com"
  or
    strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"trust wallet\") <= 2"
    strings.replace_confusables(sender.display_name) regex_match "\\btrust wa[li1]{2}et\\b"
  body.links length_compare "0"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
sender.email.domain.root_domaineqtrustwallet.comexcludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"trustwallet.com"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: UK government Home Office

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

Detects messages impersonating UK government agencies (Home Office, UK Visas and Immigration, gov.uk) that contain links not leading to legitimate gov.uk domains or show credential theft language, from senders not authenticated as official government domains.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Credential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering, Lookalike domain

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.html
  • body.links
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound

// UK government agencies in display name or subject with homograph protection
and (
  any([
        strings.replace_confusables(sender.display_name),
        strings.replace_confusables(subject.subject)
      ],
      strings.ilike(.,
                    "*sponsorship management system*",
                    "*Sponsor Management System*"
      )
      // exact match of high confidence
      or . in~ ("Home Office", "uk home office", "UK Visas and Immigration")
  )
  // image is srced from the actual home office URL
  or strings.icontains(body.html.raw,
                       '"https://www.points.homeoffice.gov.uk/gui-sms-jsf/images/'
  )
  // observed footers in messages
  or 2 of (
    strings.icontains(body.current_thread.text, '© Crown Copyright '),
    strings.icontains(body.current_thread.text, '© 2025 Home Office'),
    strings.icontains(body.current_thread.text, '© UK Visas and Immigration'),
    regex.icontains(body.current_thread.text, ' [||–-—] Home Office'),
    regex.icontains(body.current_thread.text,
                    ' [|–-—] UK Visas and Immigration'
    ),
    strings.icontains(body.current_thread.text,
                      'This is an automated message from UK Visas and Immigration.'
    ),
    strings.icontains(body.current_thread.text,
                      'This is an automated notification from the Home Office'
    ),
    regex.icontains(body.current_thread.text,
                    'You(?: are|''re) receiving this notification as a registered SMS user'
    ),
    regex.icontains(body.current_thread.text,
                    'If you are not the designated.{0,50}SMS user'
    ),
  )
)

//  Not from legitimate UK government domains
and not (
  sender.email.domain.tld == "gov.uk" and headers.auth_summary.dmarc.pass
)

// 
and (
  // there are links that do not link to "gov.uk"
  not all(body.links, .href_url.domain.tld == "gov.uk")
  // OR credential theft intent detected  
  or any(ml.nlu_classifier(body.current_thread.text).intents,
         .name == "cred_theft" and .confidence in ("medium", "high")
  )
  // link based indicators
  or any(body.links,
         // suspicious display text
         (
           .display_text in (
             "Access SMS",
             "Login to SMS",
             "Log in to SMS",
             "Access UKVI Account"
           )
           and .href_url.domain.tld != "gov.uk"
         )
         // there are mismatched links
         or (
           .display_url.domain.tld == "gov.uk"
           and .href_url.domain.tld != "gov.uk"
           and .mismatched
         )

         // the path refers to the uk stuff
         or (
           .href_url.domain.tld != "gov.uk"
           and strings.icontains(.href_url.path, 'gov.uk')
         )
  )
)

// no previous threads
and not (length(headers.references) > 0 or length(body.previous_threads) > 0)
// negate a high amount of links or newsletters
and not (
  length(body.links) > 20
  or any(ml.nlu_classifier(body.html.display_text).topics,
         .name == "Newsletters and Digests"
  )
)
//  High-trust domain exclusion
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 impersonating UK government agencies (Home Office, UK Visas and Immigration, gov.uk) that contain links not leading to legitimate gov.uk domains or show credential theft language, from senders not authenticated as official government domains.

  1. inbound message
  2. any of:
    • any of [strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)] where any holds:
      • . matches any of 2 patterns
        • *sponsorship management system*
        • *Sponsor Management System*
      • . in ('Home Office', 'uk home office', 'UK Visas and Immigration')
    • body.html.raw contains '"https://www.points.homeoffice.gov.uk/gui-sms-jsf/images/'
    • at least 2 of:
      • body.current_thread.text contains '© Crown Copyright '
      • body.current_thread.text contains '© 2025 Home Office'
      • body.current_thread.text contains '© UK Visas and Immigration'
      • body.current_thread.text matches ' [||–-—] Home Office'
      • body.current_thread.text matches ' [|–-—] UK Visas and Immigration'
      • body.current_thread.text contains 'This is an automated message from UK Visas and Immigration.'
      • body.current_thread.text contains 'This is an automated notification from the Home Office'
      • body.current_thread.text matches "You(?: are|'re) receiving this notification as a registered SMS user"
      • body.current_thread.text matches 'If you are not the designated.{0,50}SMS user'
  3. not:
    • all of:
      • sender.email.domain.tld is 'gov.uk'
      • headers.auth_summary.dmarc.pass
  4. any of:
    • not:
      • all of body.links where:
        • .href_url.domain.tld is 'gov.uk'
    • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence in ('medium', 'high')
    • any of body.links where any holds:
      • all of:
        • .display_text in ('Access SMS', 'Login to SMS', 'Log in to SMS', 'Access UKVI Account')
        • .href_url.domain.tld is not 'gov.uk'
      • all of:
        • .display_url.domain.tld is 'gov.uk'
        • .href_url.domain.tld is not 'gov.uk'
        • .mismatched
      • all of:
        • .href_url.domain.tld is not 'gov.uk'
        • .href_url.path contains 'gov.uk'
  5. none of:
    • length(headers.references) > 0
    • length(body.previous_threads) > 0
  6. none of:
    • length(body.links) > 20
    • any of ml.nlu_classifier(body.html.display_text).topics where:
      • .name is 'Newsletters and Digests'
  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, body.html.display_text, body.html.raw, body.links, body.links[].display_text, body.links[].display_url.domain.tld, body.links[].href_url.domain.tld, body.links[].href_url.path, body.links[].mismatched, body.previous_threads, headers.auth_summary.dmarc.pass, headers.references, sender.display_name, sender.email.domain.root_domain, sender.email.domain.tld, subject.subject, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains.

Indicators matched (24)

FieldMatchValue
strings.ilikesubstring*sponsorship management system*
strings.ilikesubstring*Sponsor Management System*
[strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)][]memberHome Office
[strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)][]memberuk home office
[strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)][]memberUK Visas and Immigration
strings.icontainssubstring"https://www.points.homeoffice.gov.uk/gui-sms-jsf/images/
strings.icontainssubstring© Crown Copyright
strings.icontainssubstring© 2025 Home Office
strings.icontainssubstring© UK Visas and Immigration
regex.icontainsregex [||–-—] Home Office
regex.icontainsregex [|–-—] UK Visas and Immigration
strings.icontainssubstringThis is an automated message from UK Visas and Immigration.
12 more
strings.icontainssubstringThis is an automated notification from the Home Office
regex.icontainsregexYou(?: are|'re) receiving this notification as a registered SMS user
regex.icontainsregexIf you are not the designated.{0,50}SMS user
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidencemembermedium
ml.nlu_classifier(body.current_thread.text).intents[].confidencememberhigh
body.links[].display_textmemberAccess SMS
body.links[].display_textmemberLogin to SMS
body.links[].display_textmemberLog in to SMS
body.links[].display_textmemberAccess UKVI Account
body.links[].display_url.domain.tldequalsgov.uk
strings.icontainssubstringgov.uk

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(body.links)
      or
        and
          body.links.display_text in ["Access SMS", "Access UKVI Account", "Log in to SMS", "Login to SMS"]
          body.links.href_url.domain.tld ne "gov.uk"
        and
          body.links.display_url.domain.tld eq "gov.uk"
          body.links.href_url.domain.tld ne "gov.uk"
          body.links.mismatched eq "true"
        and
          body.links.href_url.domain.tld ne "gov.uk"
          body.links.href_url.path contains "gov.uk"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence in ["high", "medium"]
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
    not
       macro "all(body.links)"
  or
    any([strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)])
      or
        [strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)] in ["Home Office", "UK Visas and Immigration", "uk home office"]
        [strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)] match "Sponsor Management System"
        [strings.replace_confusables(sender.display_name), strings.replace_confusables(subject.subject)] match "sponsorship management system"
    body.current_thread.text contains "This is an automated message from UK Visas and Immigration."
    body.current_thread.text contains "This is an automated notification from the Home Office"
    body.current_thread.text contains "© 2025 Home Office"
    body.current_thread.text contains "© Crown Copyright "
    body.current_thread.text contains "© UK Visas and Immigration"
    body.current_thread.text regex_match " [||–-—] Home Office"
    body.current_thread.text regex_match " [|–-—] UK Visas and Immigration"
    body.current_thread.text regex_match "If you are not the designated.{0,50}SMS user"
    body.current_thread.text regex_match "You(?: are|'re) receiving this notification as a registered SMS user"
    body.html.raw contains "\"https://www.points.homeoffice.gov.uk/gui-sms-jsf/images/"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  not
    or
      any(ml.nlu_classifier(body.html.display_text).topics)
        ml.nlu_classifier(body.html.display_text).topics.name eq "Newsletters and Digests"
      body.links length_compare "20"
  not
    or
      body.previous_threads length_compare "0"
      headers.references length_compare "0"
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.tld eq "gov.uk"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
ml.nlu_classifier(body.html.display_text).topicsarray_any(no value, null check)excludes:ml.nlu_classifier(body.html.display_text).topics
body.linkslength_compare20excludes:body.links field:"body.links" value:"20"
body.previous_threadslength_compare0excludes:body.previous_threads field:"body.previous_threads" value:"0"
headers.referenceslength_compare0excludes:headers.references field:"headers.references" value:"0"
headers.auth_summary.dmarc.passeqtrueexcludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true"
sender.email.domain.tldeqgov.ukexcludes:sender.email.domain.tld field:"sender.email.domain.tld" value:"gov.uk"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textcontains
  • This is an automated message from UK Visas and Immigration.
  • This is an automated notification from the Home Office
  • © 2025 Home Office
  • © Crown Copyright
  • © UK Visas and Immigration
field:"body.current_thread.text" kind:contains
body.current_thread.textregex_match
  • [||–-—] Home Office
  • [|–-—] UK Visas and Immigration
  • If you are not the designated.{0,50}SMS user
  • You(?: are|'re) receiving this notification as a registered SMS user
field:"body.current_thread.text" kind:regex_match
body.html.rawcontains
  • "https://www.points.homeoffice.gov.uk/gui-sms-jsf/images/
field:"body.html.raw" kind:contains
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Vanguard

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

Detects inbound messages from senders using Vanguard-like display names or domains, excluding legitimate Vanguard domains and authenticated communications. Additional checks ensure the sender is not from trusted organizational domains or high-trust sender domains with proper authentication.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Callback Phishing, Credential Phishing, Extortion, Malware/Ransomware, Spam
Tactics and techniquesImpersonation: Brand

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and (
  // display name contains Vanguard
  (
    strings.ilike(strings.replace_confusables(sender.display_name),
                  '*vanguard*'
    )
    // levenshtein distance similar to Vanguard
    or strings.ilevenshtein(strings.replace_confusables(sender.display_name),
                            'vanguard'
    ) <= 1
    // sender domain contains Vanguard
    or strings.ilike(strings.replace_confusables(sender.email.domain.domain),
                     '*vanguard*'
    )
  )
)
and (
  (
    any(beta.ml_topic(body.current_thread.text).topics,
        .name in (
          "Security and Authentication",
          "Secure Message",
          "Financial Communications"
        )
        and .confidence == "high"
    )
    or any(beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics,
           .name in (
             "Security and Authentication",
             "Secure Message",
             "Financial Communications"
           )
           and .confidence == "high"
    )
  )
  and (
    any(ml.nlu_classifier(body.current_thread.text).intents,
        .name == "cred_theft" and .confidence == "high"
    )
    or any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents,
           .name == "cred_theft" and .confidence == "high"
    )
  )
)

// and the sender is not in org_domains or from Vanguard domains and passes auth
and not (
  sender.email.domain.root_domain in $org_domains
  or (
    sender.email.domain.root_domain in (
      "vanguard.com",
      "vanguardcharitable.org", // philanthropic giving arm
      "vanguardmexico.com",
      "vanguardcanada.ca",
      "vanguard.co.uk",
      "vanguard.com.au",
      "vanguard.com.hk",
      "vanguardinvestor.co.uk",
      "vanguardretirement-mail.com",
      "e-vanguard.com",
      "e-vanguardcharitable.org",
      "feedback-vanguard.com",
      "m-vanguard.com",
      "investordelivery.com",
      "retsupport.com",
      "vanguardretirement.com"
    )
    and headers.auth_summary.dmarc.pass
  )
  or (
    sender.display_name == "Vanguard Visa Law"
    and sender.email.domain.root_domain == "docketwise.com"
  )
)
// and the sender is not from high trust sender root domains
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().solicited

Detection logic

Scope: inbound message.

Detects inbound messages from senders using Vanguard-like display names or domains, excluding legitimate Vanguard domains and authenticated communications. Additional checks ensure the sender is not from trusted organizational domains or high-trust sender domains with proper authentication.

  1. inbound message
  2. any of:
    • strings.replace_confusables(sender.display_name) matches '*vanguard*'
    • strings.replace_confusables(sender.display_name) is similar to 'vanguard'
    • strings.replace_confusables(sender.email.domain.domain) matches '*vanguard*'
  3. all of:
    • any of:
      • any of beta.ml_topic(body.current_thread.text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Financial Communications')
        • .confidence is 'high'
      • any of beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics where all hold:
        • .name in ('Security and Authentication', 'Secure Message', 'Financial Communications')
        • .confidence is 'high'
    • any 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(beta.ocr(file.message_screenshot()).text).intents where all hold:
        • .name is 'cred_theft'
        • .confidence is 'high'
  4. none of:
    • sender.email.domain.root_domain in $org_domains
    • all of:
      • sender.email.domain.root_domain in ('vanguard.com', 'vanguardcharitable.org', 'vanguardmexico.com', 'vanguardcanada.ca', 'vanguard.co.uk', 'vanguard.com.au', 'vanguard.com.hk', 'vanguardinvestor.co.uk', 'vanguardretirement-mail.com', 'e-vanguard.com', 'e-vanguardcharitable.org', 'feedback-vanguard.com', 'm-vanguard.com', 'investordelivery.com', 'retsupport.com', 'vanguardretirement.com')
      • headers.auth_summary.dmarc.pass
    • all of:
      • sender.display_name is 'Vanguard Visa Law'
      • sender.email.domain.root_domain is 'docketwise.com'
  5. 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
  6. not:
    • profile.by_sender().solicited

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: beta.ml_topic, beta.ocr, file.message_screenshot, ml.nlu_classifier, profile.by_sender, strings.ilevenshtein, strings.ilike, strings.replace_confusables. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (14)

FieldMatchValue
strings.ilikesubstring*vanguard*
strings.ilevenshteinfuzzyvanguard
beta.ml_topic(body.current_thread.text).topics[].namememberSecurity and Authentication
beta.ml_topic(body.current_thread.text).topics[].namememberSecure Message
beta.ml_topic(body.current_thread.text).topics[].namememberFinancial Communications
beta.ml_topic(body.current_thread.text).topics[].confidenceequalshigh
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics[].namememberSecurity and Authentication
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics[].namememberSecure Message
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics[].namememberFinancial Communications
beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics[].confidenceequalshigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
2 more
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].nameequalscred_theft
ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents[].confidenceequalshigh

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics)
      and
        beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics.confidence eq "high"
        beta.ml_topic(beta.ocr(file.message_screenshot()).text).topics.name in ["Financial Communications", "Secure Message", "Security and Authentication"]
    any(beta.ml_topic(body.current_thread.text).topics)
      and
        beta.ml_topic(body.current_thread.text).topics.confidence eq "high"
        beta.ml_topic(body.current_thread.text).topics.name in ["Financial Communications", "Secure Message", "Security and Authentication"]
  not
    or
      and
        headers.auth_summary.dmarc.pass eq "true"
        sender.email.domain.root_domain in ["e-vanguard.com", "e-vanguardcharitable.org", "feedback-vanguard.com", "investordelivery.com", "m-vanguard.com", "retsupport.com", "vanguard.co.uk", "vanguard.com", "vanguard.com.au", "vanguard.com.hk", "vanguardcanada.ca", "vanguardcharitable.org", "vanguardinvestor.co.uk", "vanguardmexico.com", "vanguardretirement-mail.com", "vanguardretirement.com"]
      and
        sender.display_name eq "Vanguard Visa Law"
        sender.email.domain.root_domain eq "docketwise.com"
       macro "sender.email.domain.root_domain in org_domains"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    any(ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents)
      and
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.confidence eq "high"
        ml.nlu_classifier(beta.ocr(file.message_screenshot()).text).intents.name eq "cred_theft"
    any(ml.nlu_classifier(body.current_thread.text).intents)
      and
        ml.nlu_classifier(body.current_thread.text).intents.confidence eq "high"
        ml.nlu_classifier(body.current_thread.text).intents.name eq "cred_theft"
  not
    profile.by_sender func_call "profile.by_sender().solicited"
  or
    strings.ilevenshtein func_call "strings.ilevenshtein(strings.replace_confusables(sender.display_name), \"vanguard\") <= 1"
    strings.replace_confusables(sender.display_name) match "vanguard"
    strings.replace_confusables(sender.email.domain.domain) match "vanguard"
  type.inbound eq "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_domainine-vanguard.com, e-vanguardcharitable.org, feedback-vanguard.com, investordelivery.com, m-vanguard.com, retsupport.com, vanguard.co.uk, vanguard.com, vanguard.com.au, vanguard.com.hk, vanguardcanada.ca, vanguardcharitable.org, vanguardinvestor.co.uk, vanguardmexico.com, vanguardretirement-mail.com, vanguardretirement.comexcludes:sender.email.domain.root_domain
sender.display_nameeqVanguard Visa Lawexcludes:sender.display_name field:"sender.display_name" value:"Vanguard Visa Law"
sender.email.domain.root_domaineqdocketwise.comexcludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"docketwise.com"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: WeTransfer

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

Detects messages claiming to be from WeTransfer that contain suspicious indicators, including misspelled domains, non-standard TLDs, suspicious file reference numbers, and French language variations. Excludes legitimate WeTransfer traffic with valid DMARC authentication.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Callback Phishing, Credential Phishing, Extortion, Malware/Ransomware, Spam
Tactics and techniquesImpersonation: Brand

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.links
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and 2 of (
  (
    strings.ilike(sender.display_name, '*wetransfer*')
    or strings.ilike(sender.display_name, '*we transfer*')
    or strings.ilevenshtein(sender.display_name, "wetransfer") <= 1
  ),

  // Check for misspelled wetransfer domains in sender email
  regex.icontains(sender.email.email, 'nore?pl[a@]y@wetransfer'),

  // Check for non-legitimate TLDs (.fr or others)
  regex.icontains(sender.email.domain.root_domain, 'wetransfer\\.[a-z]{2,4}$'),

  // Suspicious subject patterns
  regex.icontains(subject.subject,
                  '(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer'
  ),

  // Check for file reference numbers which are common in phishing
  regex.icontains(subject.subject,
                  'WeTransfer \[(?:File No\.|)\s*:\s*[0-9-]+\s*\]'
  ),

  // French language patterns
  regex.icontains(subject.subject, 'vous a envoy[ée] .{1,30} par WeTransfer'),
  regex.icontains(subject.subject, "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"),
  regex.icontains(body.current_thread.text, 'transfert expirera'),
  regex.icontains(body.current_thread.text,
                  "fichiers n'aient pas encore été téléchargés"
  ),
  any(body.links,
      strings.ilike(.display_text, '*wetransfer*')
      and .href_url.domain.root_domain not in~ ('wetransfer.com', 'we.tl')
  ),
  any(body.links,
      (
        .href_url.domain.root_domain in $free_file_hosts
        and .href_url.domain.root_domain not in~ ('wetransfer.com', 'we.tl')
      )
      or network.whois(.href_url.domain).days_old < 30
      or .href_url.domain.tld in $suspicious_tlds
  )
)
and not (
  sender.email.domain.root_domain in ("wetransfer.com", "we.tl")
  and headers.auth_summary.dmarc.pass
)
// 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
)
and (
  not profile.by_sender().solicited
  or (
    profile.by_sender().any_messages_malicious_or_spam
    and not profile.by_sender().any_messages_benign
  )
)
and not profile.by_sender().any_messages_benign

Detection logic

Scope: inbound message.

Detects messages claiming to be from WeTransfer that contain suspicious indicators, including misspelled domains, non-standard TLDs, suspicious file reference numbers, and French language variations. Excludes legitimate WeTransfer traffic with valid DMARC authentication.

  1. inbound message
  2. at least 2 of:
    • any of:
      • sender.display_name matches '*wetransfer*'
      • sender.display_name matches '*we transfer*'
      • sender.display_name is similar to 'wetransfer'
    • sender.email.email matches 'nore?pl[a@]y@wetransfer'
    • sender.email.domain.root_domain matches 'wetransfer\\\\.[a-z]{2,4}$'
    • subject.subject matches '(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer'
    • subject.subject matches 'WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]'
    • subject.subject matches 'vous a envoy[ée] .{1,30} par WeTransfer'
    • subject.subject matches 'T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER'
    • body.current_thread.text matches 'transfert expirera'
    • body.current_thread.text matches "fichiers n'aient pas encore été téléchargés"
    • any of body.links where all hold:
      • .display_text matches '*wetransfer*'
      • .href_url.domain.root_domain not in ('wetransfer.com', 'we.tl')
    • any of body.links where any holds:
      • all of:
        • .href_url.domain.root_domain in $free_file_hosts
        • .href_url.domain.root_domain not in ('wetransfer.com', 'we.tl')
      • network.whois(.href_url.domain).days_old < 30
      • .href_url.domain.tld in $suspicious_tlds
  3. not:
    • all of:
      • sender.email.domain.root_domain in ('wetransfer.com', 'we.tl')
      • headers.auth_summary.dmarc.pass
  4. 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
  5. any of:
    • not:
      • profile.by_sender().solicited
    • all of:
      • profile.by_sender().any_messages_malicious_or_spam
      • not:
        • profile.by_sender().any_messages_benign
  6. not:
    • profile.by_sender().any_messages_benign

Inspects: body.current_thread.text, body.links, body.links[].display_text, body.links[].href_url.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.domain.tld, headers.auth_summary.dmarc.pass, sender.display_name, sender.email.domain.root_domain, sender.email.email, subject.subject, type.inbound. Sensors: network.whois, profile.by_sender, regex.icontains, strings.ilevenshtein, strings.ilike. Reference lists: $free_file_hosts, $high_trust_sender_root_domains, $suspicious_tlds.

Indicators matched (11)

FieldMatchValue
strings.ilikesubstring*wetransfer*
strings.ilikesubstring*we transfer*
strings.ilevenshteinfuzzywetransfer
regex.icontainsregexnore?pl[a@]y@wetransfer
regex.icontainsregexwetransfer\\.[a-z]{2,4}$
regex.icontainsregex(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer
regex.icontainsregexWeTransfer \[(?:File No\.|)\s*:\s*[0-9-]+\s*\]
regex.icontainsregexvous a envoy[ée] .{1,30} par WeTransfer
regex.icontainsregexT[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER
regex.icontainsregextransfert expirera
regex.icontainsregexfichiers n'aient pas encore été téléchargés

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(body.links)
      or
        and
          not
            body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
           macro "body.links[].href_url.domain.root_domain in free_file_hosts"
        network.whois func_call "network.whois(body.links[].href_url.domain).days_old < 30"
         macro "body.links[].href_url.domain.tld in suspicious_tlds"
    any(body.links)
      and
        not
          body.links.href_url.domain.root_domain in ["we.tl", "wetransfer.com"]
        body.links.display_text match "wetransfer"
    body.current_thread.text regex_match "fichiers n'aient pas encore été téléchargés"
    body.current_thread.text regex_match "transfert expirera"
    sender.display_name match "we transfer"
    sender.display_name match "wetransfer"
    sender.email.domain.root_domain regex_match "wetransfer\\\\.[a-z]{2,4}$"
    sender.email.email regex_match "nore?pl[a@]y@wetransfer"
    strings.ilevenshtein func_call "strings.ilevenshtein(sender.display_name, \"wetransfer\") <= 1"
    subject.subject regex_match "(?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer"
    subject.subject regex_match "T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER"
    subject.subject regex_match "WeTransfer \\[(?:File No\\.|)\\s*:\\s*[0-9-]+\\s*\\]"
    subject.subject regex_match "vous a envoy[ée] .{1,30} par WeTransfer"
  or
    and
      not
        headers.auth_summary.dmarc.pass eq "true"
       macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
     macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
  or
    and
      not
        profile.by_sender func_call "profile.by_sender().any_messages_benign"
      profile.by_sender func_call "profile.by_sender().any_messages_malicious_or_spam"
    not
      profile.by_sender func_call "profile.by_sender().solicited"
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["we.tl", "wetransfer.com"]
  not
    profile.by_sender func_call "profile.by_sender().any_messages_benign"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textregex_match
  • fichiers n'aient pas encore été téléchargés
  • transfert expirera
field:"body.current_thread.text" kind:regex_match
sender.display_namewildcard
  • *we transfer*
  • *wetransfer*
field:"sender.display_name" kind:wildcard
sender.email.domain.root_domainregex_match
  • wetransfer\.[a-z]{2,4}$
field:"sender.email.domain.root_domain" kind:regex_match value:"wetransfer\.[a-z]{2,4}$"
sender.email.emailregex_match
  • nore?pl[a@]y@wetransfer
field:"sender.email.email" kind:regex_match value:"nore?pl[a@]y@wetransfer"
subject.subjectregex_match
  • (?:Documents?|Files?) (?:Received|Sent) (?:via)? WeTransfer
  • T[ÉE]L[ÉE]CHARGEZ VOTRE FICHIER
  • WeTransfer [(?:File No.|)\s*:\s*[0-9-]+\s*]
  • vous a envoy[ée] .{1,30} par WeTransfer
field:"subject.subject" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Xodo Sign

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

Detects messages impersonating Xodo Sign with 'Processed by Xodo Sign' text from unauthorized senders that fail DMARC authentication.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and strings.icontains(body.current_thread.text, "processed by xodo sign")
and not (
  sender.email.domain.root_domain == "eversign.com"
  and headers.auth_summary.dmarc.pass
)

Detection logic

Scope: inbound message.

Detects messages impersonating Xodo Sign with 'Processed by Xodo Sign' text from unauthorized senders that fail DMARC authentication.

  1. inbound message
  2. body.current_thread.text contains 'processed by xodo sign'
  3. not:
    • all of:
      • sender.email.domain.root_domain is 'eversign.com'
      • headers.auth_summary.dmarc.pass

Inspects: body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: strings.icontains.

Indicators matched (1)

FieldMatchValue
strings.icontainssubstringprocessed by xodo sign

Stages and Predicates

Stage 1: mql_rule

and
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain eq "eversign.com"
  body.current_thread.text contains "processed by xodo sign"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

Indicators

These rows show field, operator, and value matches.

Brand impersonation: Zoom

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

Detects messages impersonating Zoom through social footers, webinar links, and suspicious domain pattern matching. The rule looks for specific combinations of social media links, redirects, and content analysis to identify inauthentic Zoom-branded messages not originating from legitimate Zoom domains.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering, Evasion

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.html
  • body.links
  • headers
  • headers.auth_summary
  • sender.email
  • subject
  • type

Rule body

type.inbound
and (
  // the social links in the footer
  3 of (
    any(body.links, strings.icontains(.href_url.url, "twitter.com/zoom")),
    any(body.links,
        strings.icontains(.href_url.url,
                          "linkedin.com/company/zoom-video-communications"
        )
    ),
    any(body.links, strings.icontains(.href_url.url, "blog.zoom.us")),
    strings.ilike(body.html.raw,
                  '*https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*'
    ),
    strings.ilike(body.html.raw,
                  '*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*'
    ),
    strings.ilike(body.html.raw,
                  '*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*'
    )
  )
  or (
    strings.ilike(body.html.raw,
                  '*https://st1.zoom.us/homepage/publish/_nuxt/social_icons_footer*.png*'
    )
  )
  or (
    length(beta.ml_topic(body.html.display_text).topics) == 1
    and all(beta.ml_topic(body.html.display_text).topics,
            .name in ("Events and Webinars", "Software and App Updates")
            and .confidence != "low"
    )
    and any(ml.logo_detect(file.message_screenshot()).brands,
            .name == "Zoom" and .confidence == "high"
    )
    and any(body.links,
            any(ml.nlu_classifier(.display_text).intents,
                .name == "cred_theft" and .confidence == "high"
            )
    )
  )
  or (
    any(body.links,
        // link claims to go to a Zoom domain, but does not
        (
          .display_url.domain.root_domain in ("zoom.us", "zoom.com")
          or strings.icontains(.display_text, "zoom.us")
          or strings.icontains(.display_text, "zoom.com")
        )
        and .href_url.domain.root_domain not in ("zoom.us", "zoom.com")
        and (
          .href_url.domain.tld in $suspicious_tlds
          // country code second-level domain
          or strings.istarts_with(.href_url.domain.tld, "com.")
          or (
            (
              length(ml.link_analysis(.).files_downloaded) > 0
              // Zoom logo on page
              or ml.link_analysis(.).credphish.brand.name == "Zoom"
              // blocked by a Cloudflare CAPTCHA
              or strings.icontains(ml.link_analysis(.).final_dom.raw,
                                   'https://challenges.cloudflare.com/turnstile/',
              )
            )
            and ml.link_analysis(.).effective_url.domain.root_domain not in (
              "zoom.us",
              "zoom.com"
            )
          )
        )
    )
  )
)
// negate auto-generated meeting summaries
and not (
  strings.icontains(body.current_thread.text, "meeting summary")
  and strings.icontains(body.current_thread.text,
                        "AI-generated content may be inaccurate or misleading."
  )
)
and not (
  (
    strings.istarts_with(subject.subject, "RE:")
    or strings.istarts_with(subject.subject, "R:")
    or strings.istarts_with(subject.subject, "ODG:")
    or strings.istarts_with(subject.subject, "答复:")
    or strings.istarts_with(subject.subject, "AW:")
    or strings.istarts_with(subject.subject, "TR:")
    or strings.istarts_with(subject.subject, "FWD:")
    or regex.imatch(subject.subject, '(\[[^\]]+\]\s?){0,3}(re|fwd?)\s?:')
    or regex.imatch(subject.subject,
                    '^\[?(EXT|EXTERNAL)\]?[: ]\s*(RE|FWD?|FW|AW|TR|ODG|答复):.*'
    )
  )
  and (length(headers.references) > 0 or headers.in_reply_to is not null)
)
// Not from a legitimate Zoom domain
and not (
  sender.email.domain.root_domain in (
    "zoom.us",
    "zuora.com",
    "zoomgov.com",
    "zoom.com",
    "zoom-x.de"
  )
  and headers.auth_summary.dmarc.pass
)

Detection logic

Scope: inbound message.

Detects messages impersonating Zoom through social footers, webinar links, and suspicious domain pattern matching. The rule looks for specific combinations of social media links, redirects, and content analysis to identify inauthentic Zoom-branded messages not originating from legitimate Zoom domains.

  1. inbound message
  2. any of:
    • at least 3 of:
      • any of body.links where:
        • .href_url.url contains 'twitter.com/zoom'
      • any of body.links where:
        • .href_url.url contains 'linkedin.com/company/zoom-video-communications'
      • any of body.links where:
        • .href_url.url contains 'blog.zoom.us'
      • body.html.raw matches '*https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*'
      • body.html.raw matches '*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*'
      • body.html.raw matches '*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*'
    • body.html.raw matches '*https://st1.zoom.us/homepage/publish/_nuxt/social_icons_footer*.png*'
    • all of:
      • length(beta.ml_topic(body.html.display_text).topics) is 1
      • all of beta.ml_topic(body.html.display_text).topics where all hold:
        • .name in ('Events and Webinars', 'Software and App Updates')
        • .confidence is not 'low'
      • any of ml.logo_detect(file.message_screenshot()).brands where all hold:
        • .name is 'Zoom'
        • .confidence is 'high'
      • any of body.links where:
        • any of ml.nlu_classifier(.display_text).intents where all hold:
          • .name is 'cred_theft'
          • .confidence is 'high'
    • any of body.links where all hold:
      • any of:
        • .display_url.domain.root_domain in ('zoom.us', 'zoom.com')
        • .display_text contains 'zoom.us'
        • .display_text contains 'zoom.com'
      • .href_url.domain.root_domain not in ('zoom.us', 'zoom.com')
      • any of:
        • .href_url.domain.tld in $suspicious_tlds
        • .href_url.domain.tld starts with 'com.'
        • all of:
          • any of:
            • length(ml.link_analysis(.).files_downloaded) > 0
            • ml.link_analysis(.).credphish.brand.name is 'Zoom'
            • ml.link_analysis(.).final_dom.raw contains 'https://challenges.cloudflare.com/turnstile/'
          • ml.link_analysis(.).effective_url.domain.root_domain not in ('zoom.us', 'zoom.com')
  3. not:
    • all of:
      • body.current_thread.text contains 'meeting summary'
      • body.current_thread.text contains 'AI-generated content may be inaccurate or misleading.'
  4. not:
    • all of:
      • any of:
        • subject.subject starts with 'RE:'
        • subject.subject starts with 'R:'
        • subject.subject starts with 'ODG:'
        • subject.subject starts with '答复:'
        • subject.subject starts with 'AW:'
        • subject.subject starts with 'TR:'
        • subject.subject starts with 'FWD:'
        • subject.subject matches '(\\[[^\\]]+\\]\\s?){0,3}(re|fwd?)\\s?:'
        • subject.subject matches '^\\[?(EXT|EXTERNAL)\\]?[: ]\\s*(RE|FWD?|FW|AW|TR|ODG|答复):.*'
      • any of:
        • length(headers.references) > 0
        • headers.in_reply_to is set
  5. not:
    • all of:
      • sender.email.domain.root_domain in ('zoom.us', 'zuora.com', 'zoomgov.com', 'zoom.com', 'zoom-x.de')
      • headers.auth_summary.dmarc.pass

Inspects: body.current_thread.text, body.html.display_text, body.html.raw, body.links, body.links[].display_text, body.links[].display_url.domain.root_domain, body.links[].href_url.domain.root_domain, body.links[].href_url.domain.tld, body.links[].href_url.url, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: beta.ml_topic, file.message_screenshot, ml.link_analysis, ml.logo_detect, ml.nlu_classifier, regex.imatch, strings.icontains, strings.ilike, strings.istarts_with. Reference lists: $suspicious_tlds.

Indicators matched (19)

FieldMatchValue
strings.icontainssubstringtwitter.com/zoom
strings.icontainssubstringlinkedin.com/company/zoom-video-communications
strings.icontainssubstringblog.zoom.us
strings.ilikesubstring*https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*
strings.ilikesubstring*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*
strings.ilikesubstring*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*
strings.ilikesubstring*https://st1.zoom.us/homepage/publish/_nuxt/social_icons_footer*.png*
beta.ml_topic(body.html.display_text).topics[].namememberEvents and Webinars
beta.ml_topic(body.html.display_text).topics[].namememberSoftware and App Updates
ml.logo_detect(file.message_screenshot()).brands[].nameequalsZoom
ml.logo_detect(file.message_screenshot()).brands[].confidenceequalshigh
ml.nlu_classifier(body.links[].display_text).intents[].nameequalscred_theft
7 more
ml.nlu_classifier(body.links[].display_text).intents[].confidenceequalshigh
body.links[].display_url.domain.root_domainmemberzoom.us
body.links[].display_url.domain.root_domainmemberzoom.com
strings.icontainssubstringzoom.us
strings.icontainssubstringzoom.com
strings.istarts_withprefixcom.
strings.icontainssubstringhttps://challenges.cloudflare.com/turnstile/

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(body.links)
      and
        or
          and
            or
              ml.link_analysis func_call "ml.link_analysis(body.links[]).credphish.brand.name == Zoom"
              ml.link_analysis(body.links[]).files_downloaded length_compare "0"
              ml.link_analysis(body.links[]).final_dom.raw contains "https://challenges.cloudflare.com/turnstile/"
            ml.link_analysis func_call "ml.link_analysis(body.links[]).effective_url.domain.root_domain not in (zoom.us, zoom.com)"
          body.links.href_url.domain.tld starts_with "com."
           macro "body.links[].href_url.domain.tld in suspicious_tlds"
        or
          body.links.display_text contains "zoom.com"
          body.links.display_text contains "zoom.us"
          body.links.display_url.domain.root_domain in ["zoom.com", "zoom.us"]
        not
          body.links.href_url.domain.root_domain in ["zoom.com", "zoom.us"]
    and
      any(body.links)
        any(ml.nlu_classifier(body.links.display_text).intents)
          and
            ml.nlu_classifier(body.links[].display_text).intents[].confidence eq "high"
            ml.nlu_classifier(body.links[].display_text).intents[].name eq "cred_theft"
      any(ml.logo_detect(file.message_screenshot()).brands)
        and
          ml.logo_detect(file.message_screenshot()).brands.confidence eq "high"
          ml.logo_detect(file.message_screenshot()).brands.name eq "Zoom"
      beta.ml_topic(body.html.display_text).topics length_compare "1"
       macro "all(beta.ml_topic(body.html.display_text).topics)"
    any(body.links)
      body.links.href_url.url contains "blog.zoom.us"
    any(body.links)
      body.links.href_url.url contains "linkedin.com/company/zoom-video-communications"
    any(body.links)
      body.links.href_url.url contains "twitter.com/zoom"
    body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*"
    body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*"
    body.html.raw wildcard "*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*"
    body.html.raw wildcard "*https://st1.zoom.us/homepage/publish/_nuxt/social_icons_footer*.png*"
  not
    and
      or
        headers.in_reply_to is_not_null
        headers.references length_compare "0"
      or
        subject.subject regex_match "(\\[[^\\]]+\\]\\s?){0,3}(re|fwd?)\\s?:"
        subject.subject regex_match "^\\[?(EXT|EXTERNAL)\\]?[: ]\\s*(RE|FWD?|FW|AW|TR|ODG|答复):.*"
        subject.subject starts_with "AW:"
        subject.subject starts_with "FWD:"
        subject.subject starts_with "ODG:"
        subject.subject starts_with "R:"
        subject.subject starts_with "RE:"
        subject.subject starts_with "TR:"
        subject.subject starts_with "答复:"
  not
    and
      body.current_thread.text contains "AI-generated content may be inaccurate or misleading."
      body.current_thread.text contains "meeting summary"
  not
    and
      headers.auth_summary.dmarc.pass eq "true"
      sender.email.domain.root_domain in ["zoom-x.de", "zoom.com", "zoom.us", "zoomgov.com", "zuora.com"]
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.in_reply_tois_not_null(no value, null check)excludes:headers.in_reply_to
headers.referenceslength_compare0excludes:headers.references field:"headers.references" value:"0"
subject.subjectregex_match([[^]]+]\s?){0,3}(re|fwd?)\s?:excludes:subject.subject field:"subject.subject" value:"([[^]]+]\s?){0,3}(re|fwd?)\s?:"
subject.subjectregex_match^[?(EXT|EXTERNAL)]?[: ]\s*(RE|FWD?|FW|AW|TR|ODG|答复):.*excludes:subject.subject field:"subject.subject" value:"^[?(EXT|EXTERNAL)]?[: ]\s*(RE|FWD?|FW|AW|TR|ODG|答复):.*"
subject.subjectstarts_withAW:excludes:subject.subject field:"subject.subject" value:"AW:"
subject.subjectstarts_withFWD:excludes:subject.subject field:"subject.subject" value:"FWD:"
subject.subjectstarts_withODG:excludes:subject.subject field:"subject.subject" value:"ODG:"
subject.subjectstarts_withR:excludes:subject.subject field:"subject.subject" value:"R:"
subject.subjectstarts_withRE:excludes:subject.subject field:"subject.subject" value:"RE:"
subject.subjectstarts_withTR:excludes:subject.subject field:"subject.subject" value:"TR:"
subject.subjectstarts_with答复:excludes:subject.subject field:"subject.subject" value:"答复:"
body.current_thread.textcontainsAI-generated content may be inaccurate or misleading.excludes:body.current_thread.text field:"body.current_thread.text" value:"AI-generated content may be inaccurate or misleading."
body.current_thread.textcontainsmeeting summaryexcludes:body.current_thread.text field:"body.current_thread.text" value:"meeting summary"
headers.auth_summary.dmarc.passeqtrueexcludes:headers.auth_summary.dmarc.pass field:"headers.auth_summary.dmarc.pass" value:"true"
sender.email.domain.root_domaininzoom-x.de, zoom.com, zoom.us, zoomgov.com, zuora.comexcludes:sender.email.domain.root_domain

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.html.rawwildcard
  • *https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*
  • *https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*
  • *https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*
  • *https://st1.zoom.us/homepage/publish/_nuxt/social_icons_footer*.png*
field:"body.html.raw" kind:wildcard
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Zoom via HTML styling

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

Detects messages impersonating Zoom by identifying HTML table cells with specific blue styling (rgb(11,92,255)) containing Zoom branding in header elements.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • type

Rule body

type.inbound
and any(html.xpath(body.html, '//tr/td[contains(@style, "rgb(11,92,255)")]/h1').nodes,
        strings.icontains(.display_text, "zoom")
)

Detection logic

Scope: inbound message.

Detects messages impersonating Zoom by identifying HTML table cells with specific blue styling (rgb(11,92,255)) containing Zoom branding in header elements.

  1. inbound message
  2. any of html.xpath(body.html, '//tr/td[contains(@style, "rgb(11,92,255)")]/h1').nodes where:
    • .display_text contains 'zoom'

Inspects: body.html, type.inbound. Sensors: html.xpath, strings.icontains.

Indicators matched (1)

FieldMatchValue
strings.icontainssubstringzoom

Stages and Predicates

Stage 1: mql_rule

and
  any(html.xpath(body.html, '//tr/td[contains(@style, "rgb(11,92,255)")]/h1').nodes)
    html.xpath(body.html, '//tr/td[contains(@style, "rgb(11,92,255)")]/h1').nodes.display_text contains "zoom"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Zoom via lookalike domain

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

Message contains a single link which attempts to spoof a 'zoom' link, sent from a free email provider to a single recipient.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Free email provider, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • recipients
  • sender.email
  • subject
  • type

Rule body

type.inbound
and any(body.current_thread.links,
        not (
          .href_url.domain.root_domain in (
            "zoom.us",
            "zoom.com",
            "zoominternet.net",
            "profitzoom.net",
            "zoomtown.com"
          )
          or (
            .display_url.domain.root_domain is not null
            and .display_url.domain.root_domain in (
              "zoom.us",
              "zoom.com",
              "zoominternet.net",
              "profitzoom.net",
              "zoomtown.com"
            )
          )
        )

        // zoom in the subdomain or sld
        and (
          strings.contains(.href_url.domain.sld, "zoom")
          or strings.contains(.href_url.domain.subdomain, "zoom")
          or strings.contains(.display_url.domain.sld, "zoom")
          or strings.contains(.display_url.domain.subdomain, "zoom")
        )
)
and length(distinct(body.current_thread.links, .href_url.url)) == 1
and sender.email.domain.root_domain in $free_email_providers
and length(recipients.to) == 1
and not subject.is_forward

Detection logic

Scope: inbound message.

Message contains a single link which attempts to spoof a 'zoom' link, sent from a free email provider to a single recipient.

  1. inbound message
  2. any of body.current_thread.links where all hold:
    • none of:
      • .href_url.domain.root_domain in ('zoom.us', 'zoom.com', 'zoominternet.net', 'profitzoom.net', 'zoomtown.com')
      • all of:
        • .display_url.domain.root_domain is set
        • .display_url.domain.root_domain in ('zoom.us', 'zoom.com', 'zoominternet.net', 'profitzoom.net', 'zoomtown.com')
    • any of:
      • .href_url.domain.sld contains 'zoom'
      • .href_url.domain.subdomain contains 'zoom'
      • .display_url.domain.sld contains 'zoom'
      • .display_url.domain.subdomain contains 'zoom'
  3. length(distinct(body.current_thread.links, .href_url.url)) is 1
  4. sender.email.domain.root_domain in $free_email_providers
  5. length(recipients.to) is 1
  6. not:
    • subject.is_forward

Inspects: body.current_thread.links, body.current_thread.links[].display_url.domain.root_domain, body.current_thread.links[].display_url.domain.sld, body.current_thread.links[].display_url.domain.subdomain, body.current_thread.links[].href_url.domain.root_domain, body.current_thread.links[].href_url.domain.sld, body.current_thread.links[].href_url.domain.subdomain, body.current_thread.links[].href_url.url, recipients.to, sender.email.domain.root_domain, subject.is_forward, type.inbound. Sensors: strings.contains. Reference lists: $free_email_providers.

Indicators matched (1)

FieldMatchValue
strings.containssubstringzoom

Stages and Predicates

Stage 1: mql_rule

and
  any(body.current_thread.links)
    and
      not
        or
          and
            body.current_thread.links.display_url.domain.root_domain in ["profitzoom.net", "zoom.com", "zoom.us", "zoominternet.net", "zoomtown.com"]
            body.current_thread.links.display_url.domain.root_domain is_not_null
          body.current_thread.links.href_url.domain.root_domain in ["profitzoom.net", "zoom.com", "zoom.us", "zoominternet.net", "zoomtown.com"]
      or
        body.current_thread.links.display_url.domain.sld contains "zoom"
        body.current_thread.links.display_url.domain.subdomain contains "zoom"
        body.current_thread.links.href_url.domain.sld contains "zoom"
        body.current_thread.links.href_url.domain.subdomain contains "zoom"
  not
    subject.is_forward eq "true"
  distinct(body.current_thread.links, .href_url.url) length_compare "1"
  recipients.to length_compare "1"
  type.inbound eq "true"
   macro "sender.email.domain.root_domain in free_email_providers"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
subject.is_forwardeqtrueexcludes:subject.is_forward field:"subject.is_forward" value:"true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Brand impersonation: Zoom with deceptive link display

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

Detects messages mentioning Zoom in the subject or body that contain links appearing to go to zoom.us but actually redirect to different domains.

Threat classification

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

CategoryValues
Attack typesCredential Phishing, Malware/Ransomware
Tactics and techniquesImpersonation: Brand

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • sender.email
  • subject
  • type

Rule body

type.inbound
and sender.email.domain.root_domain in $free_email_providers
and any([subject.base, body.current_thread.text], strings.icontains(., "zoom"))
and any(filter(body.current_thread.links,
               strings.icontains(.href_url.url, "zoom.us")
        ),
        .href_url.domain.root_domain not in ("zoom.us", "zoom.com")
        and .display_url.domain.root_domain not in ("zoom.us", "zoom.com")
)

Detection logic

Scope: inbound message.

Detects messages mentioning Zoom in the subject or body that contain links appearing to go to zoom.us but actually redirect to different domains.

  1. inbound message
  2. sender.email.domain.root_domain in $free_email_providers
  3. any of [subject.base, body.current_thread.text] where:
    • . contains 'zoom'
  4. any of filter(body.current_thread.links) where all hold:
    • .href_url.domain.root_domain not in ('zoom.us', 'zoom.com')
    • .display_url.domain.root_domain not in ('zoom.us', 'zoom.com')

Inspects: body.current_thread.links, body.current_thread.links[].href_url.url, body.current_thread.text, sender.email.domain.root_domain, subject.base, type.inbound. Sensors: strings.icontains. Reference lists: $free_email_providers.

Indicators matched (2)

FieldMatchValue
strings.icontainssubstringzoom
strings.icontainssubstringzoom.us

Stages and Predicates

Stage 1: mql_rule

and
  any(filter(body.current_thread.links))
    and
      not
        filter(body.current_thread.links).display_url.domain.root_domain in ["zoom.com", "zoom.us"]
      not
        filter(body.current_thread.links).href_url.domain.root_domain in ["zoom.com", "zoom.us"]
  any([subject.base, body.current_thread.text])
    [subject.base, body.current_thread.text] contains "zoom"
  type.inbound eq "true"
   macro "sender.email.domain.root_domain in free_email_providers"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Callback scam: Impersonation via TimeTrade infrastructure

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

Detects callback scam messages that abuse legitimate TimeTrade sending infrastructure to impersonate well-known brands like McAfee, Norton, Geek Squad, PayPal, eBay, Symantec, Best Buy, or LifeLock. The message contains purchase, payment, or subscription-related terms along with a phone number, soliciting victims to call for fraudulent support.

Threat classification

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

CategoryValues
Attack typesCallback Phishing
Tactics and techniquesImpersonation: Brand, Out of band pivot, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • sender.email
  • subject
  • type

Rule body

type.inbound

// Legitimate TimeTrade sending infratructure
and sender.email.domain.root_domain == 'timetrade.com'

// Callback Phishing
and regex.icontains(body.current_thread.text,
                    (
                      "mcafee|n[o0]rt[o0]n|geek.{0,5}squad|paypal|ebay|symantec|best buy|lifel[o0]ck"
                    )
)
and 3 of (
  strings.ilike(body.current_thread.text, '*purchase*'),
  strings.ilike(body.current_thread.text, '*payment*'),
  strings.ilike(body.current_thread.text, '*transaction*'),
  strings.ilike(body.current_thread.text, '*subscription*'),
  strings.ilike(body.current_thread.text, '*antivirus*'),
  strings.ilike(body.current_thread.text, '*order*'),
  strings.ilike(body.current_thread.text, '*support*'),
  strings.ilike(body.current_thread.text, '*help line*'),
  strings.ilike(body.current_thread.text, '*receipt*'),
  strings.ilike(body.current_thread.text, '*invoice*'),
  strings.ilike(body.current_thread.text, '*call*'),
  strings.ilike(body.current_thread.text, '*cancel*'),
  strings.ilike(body.current_thread.text, '*renew*'),
  strings.ilike(body.current_thread.text, '*refund*')
)
// phone number regex
and any([body.current_thread.text, subject.subject],
        regex.icontains(.,
                        '\+?([ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}',
                        '\+?([ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4}'
        )
)

Detection logic

Scope: inbound message.

Detects callback scam messages that abuse legitimate TimeTrade sending infrastructure to impersonate well-known brands like McAfee, Norton, Geek Squad, PayPal, eBay, Symantec, Best Buy, or LifeLock. The message contains purchase, payment, or subscription-related terms along with a phone number, soliciting victims to call for fraudulent support.

  1. inbound message
  2. sender.email.domain.root_domain is 'timetrade.com'
  3. body.current_thread.text matches 'mcafee|n[o0]rt[o0]n|geek.{0,5}squad|paypal|ebay|symantec|best buy|lifel[o0]ck'
  4. at least 3 of 14: body.current_thread.text matches any of 14 patterns
    • *purchase*
    • *payment*
    • *transaction*
    • *subscription*
    • *antivirus*
    • *order*
    • *support*
    • *help line*
    • *receipt*
    • *invoice*
    • *call*
    • *cancel*
    • *renew*
    • *refund*
  5. any of [body.current_thread.text, subject.subject] where:
    • . matches any of 2 patterns
      • \+?([ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}
      • \+?([ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4}

Inspects: body.current_thread.text, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: regex.icontains, strings.ilike.

Indicators matched (18)

FieldMatchValue
sender.email.domain.root_domainequalstimetrade.com
regex.icontainsregexmcafee|n[o0]rt[o0]n|geek.{0,5}squad|paypal|ebay|symantec|best buy|lifel[o0]ck
strings.ilikesubstring*purchase*
strings.ilikesubstring*payment*
strings.ilikesubstring*transaction*
strings.ilikesubstring*subscription*
strings.ilikesubstring*antivirus*
strings.ilikesubstring*order*
strings.ilikesubstring*support*
strings.ilikesubstring*help line*
strings.ilikesubstring*receipt*
strings.ilikesubstring*invoice*
6 more
strings.ilikesubstring*call*
strings.ilikesubstring*cancel*
strings.ilikesubstring*renew*
strings.ilikesubstring*refund*
regex.icontainsregex\+?([ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}
regex.icontainsregex\+?([ilo0-9]{1,2})?\s?\(?\d{3}\)?[\s\.\-⋅]{0,5}[ilo0-9]{3}[\s\.\-⋅]{0,5}[ilo0-9]{4}

Stages and Predicates

Stage 1: mql_rule

and
  any([body.current_thread.text, subject.subject])
    or
      [body.current_thread.text, subject.subject] regex_match "\\+?([ilo0-9]{1,2})?\\s?\\(?\\d{3}\\)?[\\s\\.\\-⋅]{0,5}[ilo0-9]{3}[\\s\\.\\-⋅]{0,5}[ilo0-9]{4}"
      [body.current_thread.text, subject.subject] regex_match "\\+?([ilo0-9]{1}.)?\\(?[ilo0-9]{3}?\\)?.[ilo0-9]{3}.?[ilo0-9]{4}"
  or
    body.current_thread.text match "antivirus"
    body.current_thread.text match "call"
    body.current_thread.text match "cancel"
    body.current_thread.text match "help line"
    body.current_thread.text match "invoice"
    body.current_thread.text match "order"
    body.current_thread.text match "payment"
    body.current_thread.text match "purchase"
    body.current_thread.text match "receipt"
    body.current_thread.text match "refund"
    body.current_thread.text match "renew"
    body.current_thread.text match "subscription"
    body.current_thread.text match "support"
    body.current_thread.text match "transaction"
  body.current_thread.text regex_match "mcafee|n[o0]rt[o0]n|geek.{0,5}squad|paypal|ebay|symantec|best buy|lifel[o0]ck"
  sender.email.domain.root_domain eq "timetrade.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textregex_match
    • mcafee
    • n[o0]rt[o0]n
    • geek.{0,5}squad
    • paypal
    • ebay
    • symantec
    • best buy
    • lifel[o0]ck
field:"body.current_thread.text" kind:regex_match
body.current_thread.textwildcard
  • *antivirus*
  • *call*
  • *cancel*
  • *help line*
  • *invoice*
  • *order*
  • *payment*
  • *purchase*
  • *receipt*
  • *refund*
  • *renew*
  • *subscription*
  • *support*
  • *transaction*
field:"body.current_thread.text" kind:wildcard
sender.email.domain.root_domaineq
  • timetrade.com
field:"sender.email.domain.root_domain" kind:eq value:"timetrade.com"
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"