Detection rules › Sublime MQL

Sublime MQL rules: abuse

RuleSeverity
Abuse: Cloudflare Workers Hosted EvilTokens Domain Structurehigh
Abuse: Robinhood injected contentmedium
Brand impersonation: QuickBooks notification from Intuit themed company namemedium
Google services using g.co shortlinksmedium
Service abuse: Adobe Sign notification from an unsolicited reply-to addressmedium
Service abuse: Amazon invitation with suspected callback phishingmedium
Service abuse: Behance document sharing with suspicious languagemedium
Service Abuse: Box file sharing with credential phishing intentmedium
Service abuse: Demio notifications with suspicious content patternsmedium
Service abuse: DocSend share from an unsolicited reply-to addresshigh
Service abuse: DocSend share from newly registered domainhigh
Service abuse: DocuSign notification with suspicious sender or document namemedium
Service abuse: DocuSign share from an unsolicited reply-to addressmedium
Service abuse: Domains By Proxy sendermedium
Service abuse: Dropbox share from an unsolicited reply-to addressmedium
Service abuse: Dropbox share from new domainmedium
Service abuse: Dropbox share with suspicious sender or document namemedium
Service abuse: Evernote linklow
Service Abuse: ExactTarget with suspicious sender indicatorshigh
Service abuse: FlipHTML5 with attachment deception and credential theft languagemedium
Service abuse: Formester with suspicious link behaviormedium
Service abuse: Google account notification with links to free file hosthigh
Service abuse: Google classroom solicitationmedium
Service abuse: Google Drive share from an unsolicited reply-to addressmedium
Service abuse: Google Drive share from new reply-to domainmedium
Service abuse: Google Firebase sender address with suspicious contentlow
Service abuse: HelloSign from an unsolicited sender addresslow
Service Abuse: HelloSign share with suspicious sender or document namemedium
Service abuse: Meetup.com redirect with brand impersonationmedium
Service abuse: Microsoft with suspicious indicators in subjectmedium
Service abuse: QuickBooks notification from new domainmedium
Service abuse: QuickBooks notification with suspicious commentsmedium
Service abuse: Substack credential theft with confusable characters and branded button redirectsmedium
Service abuse: SurveyMonkey survey from newly registered domainhigh
Service abuse: Suspicious Zoom Docs linklow
Service abuse: Task management message sent via SendGridmedium
Service abuse: Vimeo with external plain-text links in messagehigh
Service abuse: Wix redirect through bulk mailer domainslow

Abuse: Cloudflare Workers Hosted EvilTokens Domain Structure

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

Detects messages containing links to Cloudflare Workers domains that follow naming patterns designed to impersonate legitimate services such as Adobe, DocuSign, OneDrive, SharePoint, and voicemail systems. These domains use suspicious alphanumeric identifiers and may be used to deceive recipients into believing they are accessing trusted services.

Threat classification

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

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

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.links
  • recipients
  • recipients.to[0]
  • type

Rule body

type.inbound
and length(recipients.to) == 1
and recipients.to[0].email.domain.valid
and any(body.links,
        // eviltokens cloudflare workers domain struct
        (
          strings.iends_with(.href_url.domain.domain, '-account.workers.dev')
          and regex.icontains(.href_url.domain.domain,
                              '^(?:(?:page-)?adobe|calendar_invite|(?:page-)?docusign|fax|quarantine|onedrive|page-password|sharepoint|voicemail|index)-[a-z0-9]{3}\.[a-z0-9-]{3,}'
          )
        )
)

Detection logic

Scope: inbound message.

Detects messages containing links to Cloudflare Workers domains that follow naming patterns designed to impersonate legitimate services such as Adobe, DocuSign, OneDrive, SharePoint, and voicemail systems. These domains use suspicious alphanumeric identifiers and may be used to deceive recipients into believing they are accessing trusted services.

  1. inbound message
  2. length(recipients.to) is 1
  3. recipients.to[0].email.domain.valid
  4. any of body.links where all hold:
    • .href_url.domain.domain ends with '-account.workers.dev'
    • .href_url.domain.domain matches '^(?:(?:page-)?adobe|calendar_invite|(?:page-)?docusign|fax|quarantine|onedrive|page-password|sharepoint|voicemail|index)-[a-z0-9]{3}\\.[a-z0-9-]{3,}'

Inspects: body.links, body.links[].href_url.domain.domain, recipients.to, recipients.to[0].email.domain.valid, type.inbound. Sensors: regex.icontains, strings.iends_with.

Indicators matched (2)

FieldMatchValue
strings.iends_withsuffix-account.workers.dev
regex.icontainsregex^(?:(?:page-)?adobe|calendar_invite|(?:page-)?docusign|fax|quarantine|onedrive|page-password|sharepoint|voicemail|index)-[a-z0-9]{3}\.[a-z0-9-]{3,}

Stages and Predicates

Stage 1: mql_rule

and
  any(body.links)
    and
      body.links.href_url.domain.domain ends_with "-account.workers.dev"
      body.links.href_url.domain.domain regex_match "^(?:(?:page-)?adobe|calendar_invite|(?:page-)?docusign|fax|quarantine|onedrive|page-password|sharepoint|voicemail|index)-[a-z0-9]{3}\\.[a-z0-9-]{3,}"
  recipients.to length_compare "1"
  recipients.to[0].email.domain.valid eq "true"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Abuse: Robinhood injected content

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

Detects messages from Robinhood with injected HTML into one of the list fields, often the 'Device' field.

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
  • sender.email
  • type

Rule body

type.inbound
and sender.email.email == "noreply@robinhood.com"
and any(html.xpath(body.html, '//div/ul[count(li) = 4]/li').nodes,
        length(.raw) > 500 and strings.count(.raw, "</") > 10
)

Detection logic

Scope: inbound message.

Detects messages from Robinhood with injected HTML into one of the list fields, often the 'Device' field.

  1. inbound message
  2. sender.email.email is 'noreply@robinhood.com'
  3. any of html.xpath(body.html, '//div/ul[count(li) = 4]/li').nodes where all hold:
    • length(.raw) > 500
    • strings.count(.raw, '</') > 10

Inspects: body.html, sender.email.email, type.inbound. Sensors: html.xpath, strings.count.

Indicators matched (1)

FieldMatchValue
sender.email.emailequalsnoreply@robinhood.com

Stages and Predicates

Stage 1: mql_rule

and
  any(html.xpath(body.html, '//div/ul[count(li) = 4]/li').nodes)
    and
      html.xpath(body.html, '//div/ul[count(li) = 4]/li').nodes.raw length_compare "500"
      strings.count func_call "strings.count(html.xpath(body.html, '//div/ul[count(li) = 4]/li').nodes[].raw, \"</\") > 10"
  sender.email.email eq "noreply@robinhood.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Brand impersonation: QuickBooks notification from Intuit themed company name

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

This detection rule matches on QuickBooks notifications that feature company names impersonating Intuit and QuickBooks.

Threat classification

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

CategoryValues
Attack typesCallback Phishing, Credential Phishing, BEC/Fraud
Tactics and techniquesEvasion, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.html
  • headers
  • headers.auth_summary
  • headers.reply_to
  • sender.email
  • type

Rule body

type.inbound

// Legitimate Intuit sending infratructure
and sender.email.email == "quickbooks@notification.intuit.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and strings.ends_with(headers.auth_summary.spf.details.designator,
                      '.intuit.com'
)
and (
  // the reply-to contains Inuit Themes
  any(headers.reply_to,
      (
        strings.icontains(.email.email, 'intuit')
        or strings.icontains(.email.domain.domain, 'quickbooks')
      )
      and not (.email.domain.root_domain in ('intuit.com', 'quickbooks.com'))
  )
  // the "company" part of the message
  or regex.icontains(body.html.raw,
                     '<(?:div|p) class="company(?:Name|Details)[^\"]*\"[^\>]*\>[^\<]*(?:Intuit|Quickbooks).*</(?:p|div)>'
  )
)

Detection logic

Scope: inbound message.

This detection rule matches on QuickBooks notifications that feature company names impersonating Intuit and QuickBooks.

  1. inbound message
  2. sender.email.email is 'quickbooks@notification.intuit.com'
  3. headers.auth_summary.spf.pass
  4. headers.auth_summary.dmarc.pass
  5. headers.auth_summary.spf.details.designator ends with '.intuit.com'
  6. any of:
    • any of headers.reply_to where all hold:
      • any of:
        • .email.email contains 'intuit'
        • .email.domain.domain contains 'quickbooks'
      • not:
        • .email.domain.root_domain in ('intuit.com', 'quickbooks.com')
    • body.html.raw matches '<(?:div|p) class="company(?:Name|Details)[^\\"]*\\"[^\\>]*\\>[^\\<]*(?:Intuit|Quickbooks).*</(?:p|div)>'

Inspects: body.html.raw, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.details.designator, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain.domain, headers.reply_to[].email.domain.root_domain, headers.reply_to[].email.email, sender.email.email, type.inbound. Sensors: regex.icontains, strings.ends_with, strings.icontains.

Indicators matched (5)

FieldMatchValue
sender.email.emailequalsquickbooks@notification.intuit.com
strings.ends_withsuffix.intuit.com
strings.icontainssubstringintuit
strings.icontainssubstringquickbooks
regex.icontainsregex<(?:div|p) class="company(?:Name|Details)[^\"]*\"[^\>]*\>[^\<]*(?:Intuit|Quickbooks).*</(?:p|div)>

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(headers.reply_to)
      and
        or
          headers.reply_to.email.domain.domain contains "quickbooks"
          headers.reply_to.email.email contains "intuit"
        not
          headers.reply_to.email.domain.root_domain in ["intuit.com", "quickbooks.com"]
    body.html.raw regex_match "<(?:div|p) class=\"company(?:Name|Details)[^\\\"]*\\\"[^\\>]*\\>[^\\<]*(?:Intuit|Quickbooks).*</(?:p|div)>"
  headers.auth_summary.dmarc.pass eq "true"
  headers.auth_summary.spf.details.designator ends_with ".intuit.com"
  headers.auth_summary.spf.pass eq "true"
  sender.email.email eq "quickbooks@notification.intuit.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Google services using g.co shortlinks

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

Identifies messages from authenticated Google domains containing g.co shortened URLs with a subdomain in either the message body links or thread text.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesEvasion, Free email provider

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
// allow for multiple google TLDs
and sender.email.domain.sld == "google"
and headers.auth_summary.spf.pass
// g.co url shortner in links or the current thread to identify the workspace name
and (
  any(body.links,
      .href_url.domain.root_domain == 'g.co'
      and .href_url.domain.subdomain is not null
  )
  or (
    strings.icontains(body.current_thread.text, '.g.co')
    and regex.icontains(body.current_thread.text, '[^\s]+\.g\.co\b')
  )
)

Detection logic

Scope: inbound message.

Identifies messages from authenticated Google domains containing g.co shortened URLs with a subdomain in either the message body links or thread text.

  1. inbound message
  2. sender.email.domain.sld is 'google'
  3. headers.auth_summary.spf.pass
  4. any of:
    • any of body.links where all hold:
      • .href_url.domain.root_domain is 'g.co'
      • .href_url.domain.subdomain is set
    • all of:
      • body.current_thread.text contains '.g.co'
      • body.current_thread.text matches '[^\\s]+\\.g\\.co\\b'

Inspects: body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, body.links[].href_url.domain.subdomain, headers.auth_summary.spf.pass, sender.email.domain.sld, type.inbound. Sensors: regex.icontains, strings.icontains.

Indicators matched (4)

FieldMatchValue
sender.email.domain.sldequalsgoogle
body.links[].href_url.domain.root_domainequalsg.co
strings.icontainssubstring.g.co
regex.icontainsregex[^\s]+\.g\.co\b

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(body.links)
      and
        body.links.href_url.domain.root_domain eq "g.co"
        body.links.href_url.domain.subdomain is_not_null
    and
      body.current_thread.text contains ".g.co"
      body.current_thread.text regex_match "[^\\s]+\\.g\\.co\\b"
  headers.auth_summary.spf.pass eq "true"
  sender.email.domain.sld eq "google"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: Adobe Sign notification from an unsolicited reply-to address

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

Identifies messages appearing to come from Adobe Sign signature notifications that contain a reply-to address not previously seen in organizational communications. This tactic exploits trust in legitimate Adobe services while attempting to establish unauthorized communication channels.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Callback Phishing, Spam
Tactics and techniquesSocial engineering, Impersonation: Brand

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound

// Legitimate Adobe Sign sending infratructure
and sender.email.email == "adobesign@adobesign.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and strings.icontains(subject.subject, 'signature requested')

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

// reply-to address has never sent an email to the org
and beta.profile.by_reply_to().prevalence == "new"

// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited

// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign

Detection logic

Scope: inbound message.

Identifies messages appearing to come from Adobe Sign signature notifications that contain a reply-to address not previously seen in organizational communications. This tactic exploits trust in legitimate Adobe services while attempting to establish unauthorized communication channels.

  1. inbound message
  2. sender.email.email is 'adobesign@adobesign.com'
  3. headers.auth_summary.spf.pass
  4. headers.auth_summary.dmarc.pass
  5. subject.subject contains 'signature requested'
  6. beta.profile.by_reply_to().prevalence is 'new'
  7. not:
    • beta.profile.by_reply_to().solicited
  8. not:
    • beta.profile.by_reply_to().any_messages_benign

Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, sender.email.email, subject.subject, type.inbound. Sensors: beta.profile.by_reply_to, strings.icontains.

Indicators matched (2)

FieldMatchValue
sender.email.emailequalsadobesign@adobesign.com
strings.icontainssubstringsignature requested

Stages and Predicates

Stage 1: mql_rule

and
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
  beta.profile.by_reply_to func_call "beta.profile.by_reply_to().prevalence == new"
  headers.auth_summary.dmarc.pass eq "true"
  headers.auth_summary.spf.pass eq "true"
  sender.email.email eq "adobesign@adobesign.com"
  subject.subject contains "signature requested"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: Amazon invitation with suspected callback phishing

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

Detects Amazon's no-reply address with a subject about invitation sending, containing phone numbers within HTML header elements. This pattern is commonly used to trick recipients into calling fraudulent customer service numbers.

Threat classification

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

CategoryValues
Attack typesCallback Phishing
Tactics and techniquesOut of band pivot, Social engineering

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@amazon.com'
and subject.base == 'Your invitation has been sent'
and any(html.xpath(body.html, "//h2[contains(@class, 'rio-header')]").nodes,
        // phone number regex
        regex.icontains(strings.replace_confusables(.display_text),
                        '\+?(?:[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 Amazon's no-reply address with a subject about invitation sending, containing phone numbers within HTML header elements. This pattern is commonly used to trick recipients into calling fraudulent customer service numbers.

  1. inbound message
  2. sender.email.email is 'no-reply@amazon.com'
  3. subject.base is 'Your invitation has been sent'
  4. any of html.xpath(body.html, "//h2[contains(@class, 'rio-header')]").nodes where:
    • strings.replace_confusables(.display_text) 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.html, sender.email.email, subject.base, type.inbound. Sensors: html.xpath, regex.icontains, strings.replace_confusables.

Indicators matched (4)

FieldMatchValue
sender.email.emailequalsno-reply@amazon.com
subject.baseequalsYour invitation has been sent
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(html.xpath(body.html, "//h2[contains(@class, 'rio-header')]").nodes)
    or
      strings.replace_confusables(html.xpath(body.html, "//h2[contains(@class, 'rio-header')]").nodes[].display_text) regex_match "\\+?(?:[ilo0-9]{1,2})?\\s?\\(?\\d{3}\\)?[\\s\\.\\-⋅]{0,5}[ilo0-9]{3}[\\s\\.\\-⋅]{0,5}[ilo0-9]{4}"
      strings.replace_confusables(html.xpath(body.html, "//h2[contains(@class, 'rio-header')]").nodes[].display_text) regex_match "\\+?(?:[ilo0-9]{1}.)?\\(?[ilo0-9]{3}?\\)?.[ilo0-9]{3}.?[ilo0-9]{4}"
  sender.email.email eq "no-reply@amazon.com"
  subject.base eq "Your invitation has been sent"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: Behance document sharing with suspicious language

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

Detects messages containing document sharing language with a single Behance gallery link, potentially indicating abuse of the legitimate Adobe Behance platform for malicious purposes.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesFree file host, 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.current_thread.text) < 10000
and strings.ilike(body.current_thread.text,
                  "*proposal*",
                  "*specified link*",
                  "*secure*"
)
and length(filter(body.current_thread.links,
                  .href_url.domain.root_domain == 'behance.net'
                  and strings.icontains(.href_url.path, '/gallery/')
                  and .display_url.domain.root_domain == 'behance.net'
                  and strings.icontains(.display_url.path, '/gallery/')
           )
) == 1
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 containing document sharing language with a single Behance gallery link, potentially indicating abuse of the legitimate Adobe Behance platform for malicious purposes.

  1. inbound message
  2. length(body.current_thread.text) < 10000
  3. body.current_thread.text matches any of 3 patterns
    • *proposal*
    • *specified link*
    • *secure*
  4. length(filter(body.current_thread.links, .href_url.domain.root_domain == 'behance.net' and strings.icontains(.href_url.path, '/gallery/') and .display_url.domain.root_domain == 'behance.net' and strings.icontains(.display_url.path, '/gallery/'))) is 1
  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.links, body.current_thread.links[].display_url.domain.root_domain, body.current_thread.links[].display_url.path, body.current_thread.links[].href_url.domain.root_domain, body.current_thread.links[].href_url.path, body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: strings.icontains, strings.ilike. Reference lists: $high_trust_sender_root_domains.

Indicators matched (6)

FieldMatchValue
strings.ilikesubstring*proposal*
strings.ilikesubstring*specified link*
strings.ilikesubstring*secure*
body.current_thread.links[].href_url.domain.root_domainequalsbehance.net
strings.icontainssubstring/gallery/
body.current_thread.links[].display_url.domain.root_domainequalsbehance.net

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 match "proposal"
    body.current_thread.text match "secure"
    body.current_thread.text match "specified link"
  body.current_thread.text length_compare "10000"
  filter(body.current_thread.links, .href_url.domain.root_domain == 'behance.net' and strings.icontains(.href_url.path, '/gallery/') and .display_url.domain.root_domain == 'behance.net' and strings.icontains(.display_url.path, '/gallery/')) length_compare "1"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textwildcard
  • *proposal*
  • *secure*
  • *specified link*
field:"body.current_thread.text" kind:wildcard
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service Abuse: Box file sharing with credential phishing intent

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

Detects abuse of Box's legitimate infrastructure for credential phishing attacks.

Threat classification

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

CategoryValues
Attack typesCredential Phishing, BEC/Fraud, Callback Phishing
Tactics and techniquesEvasion, Social engineering, Impersonation: Employee, Impersonation: VIP

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound

// Legitimate Box sending infrastructure
and sender.email.domain.root_domain == "box.com"

// ML classification indicates credential theft with high confidence
and (
  any(ml.nlu_classifier(body.current_thread.text).intents,
      .name == "cred_theft" and .confidence == "high"
  )
  // Link analysis for credential phishing detection
  or any(filter(body.links,
                // target the box link
                (
                  .href_url.domain.domain == "app.box.com"
                )
         ),
         ml.link_analysis(., mode="aggressive").credphish.disposition == "phishing"
         and ml.link_analysis(., mode="aggressive").credphish.confidence in (
           "medium",
           "high"
         )
  )
)
// Box file sharing patterns
and (
  strings.icontains(subject.subject, 'invited you to')
  or strings.icontains(subject.subject, 'shared')
  or strings.icontains(subject.subject, 'has sent you')
  or strings.icontains(body.current_thread.text, 'Go to File')
  or any(body.links, strings.icontains(.display_text, 'Go to File'))
)

// Suspicious document patterns or VIP impersonation
and (
  // Financial document patterns
  (
    regex.icontains(subject.subject,
                    '\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\b'
    )
    or regex.icontains(body.current_thread.text,
                       '\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\b'
    )
    or any(body.links,
           regex.icontains(.display_text,
                           '\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\b'
           )
    )
  )
  // Corporate document patterns
  or (
    regex.icontains(subject.subject,
                    '\b(urgent|important|confidential|secure|encrypted|document|file)\b'
    )
    and regex.icontains(subject.subject,
                        '\b(review|approval|signature|verification|validation)\b'
    )
  )
)

Detection logic

Scope: inbound message.

Detects abuse of Box's legitimate infrastructure for credential phishing attacks.

  1. inbound message
  2. sender.email.domain.root_domain is 'box.com'
  3. any of:
    • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence is 'high'
    • any of filter(body.links) where all hold:
      • ml.link_analysis(.).credphish.disposition is 'phishing'
      • ml.link_analysis(.).credphish.confidence in ('medium', 'high')
  4. any of:
    • subject.subject contains 'invited you to'
    • subject.subject contains 'shared'
    • subject.subject contains 'has sent you'
    • body.current_thread.text contains 'Go to File'
    • any of body.links where:
      • .display_text contains 'Go to File'
  5. any of:
    • any of:
      • subject.subject matches '\\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\\b'
      • body.current_thread.text matches '\\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\\b'
      • any of body.links where:
        • .display_text matches '\\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\\b'
    • all of:
      • subject.subject matches '\\b(urgent|important|confidential|secure|encrypted|document|file)\\b'
      • subject.subject matches '\\b(review|approval|signature|verification|validation)\\b'

Inspects: body.current_thread.text, body.links, body.links[].display_text, body.links[].href_url.domain.domain, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: ml.link_analysis, ml.nlu_classifier, regex.icontains, strings.icontains.

Indicators matched (11)

FieldMatchValue
sender.email.domain.root_domainequalsbox.com
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
body.links[].href_url.domain.domainequalsapp.box.com
strings.icontainssubstringinvited you to
strings.icontainssubstringshared
strings.icontainssubstringhas sent you
strings.icontainssubstringGo to File
regex.icontainsregex\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\b
regex.icontainsregex\b(urgent|important|confidential|secure|encrypted|document|file)\b
regex.icontainsregex\b(review|approval|signature|verification|validation)\b

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(filter(body.links))
      and
        ml.link_analysis func_call "ml.link_analysis(filter(body.links)[]).credphish.confidence in (medium, high)"
        ml.link_analysis func_call "ml.link_analysis(filter(body.links)[]).credphish.disposition == phishing"
    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
    any(body.links)
      body.links.display_text contains "Go to File"
    body.current_thread.text contains "Go to File"
    subject.subject contains "has sent you"
    subject.subject contains "invited you to"
    subject.subject contains "shared"
  or
    any(body.links)
      body.links.display_text regex_match "\\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\\b"
    and
      subject.subject regex_match "\\b(review|approval|signature|verification|validation)\\b"
      subject.subject regex_match "\\b(urgent|important|confidential|secure|encrypted|document|file)\\b"
    body.current_thread.text regex_match "\\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\\b"
    subject.subject regex_match "\\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\\b"
  sender.email.domain.root_domain eq "box.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textcontains
  • Go to File
field:"body.current_thread.text" kind:contains value:"Go to File"
body.current_thread.textregex_match
  • \b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\b
field:"body.current_thread.text" kind:regex_match value:"\b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\b"
sender.email.domain.root_domaineq
  • box.com
field:"sender.email.domain.root_domain" kind:eq value:"box.com"
subject.subjectcontains
  • has sent you
  • invited you to
  • shared
field:"subject.subject" kind:contains
subject.subjectregex_match
  • \b(fund|portfolio|agreement|contract|proposal|invoice|payment|wire|settlement|billing|timesheet|hr)\b
  • \b(review|approval|signature|verification|validation)\b
  • \b(urgent|important|confidential|secure|encrypted|document|file)\b
field:"subject.subject" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service abuse: Demio notifications with suspicious content patterns

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

Detects messages from Demio notifications service containing suspicious patterns including phone numbers, monetary amounts, suspicious domain references, explicit content lures, or lengthy action-oriented subjects designed to manipulate recipients.

Threat classification

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

CategoryValues
Attack typesSpam
Tactics and techniquesSocial engineering, Impersonation: Brand

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • sender.email
  • subject
  • type

Rule body

type.inbound
//
//  Warning: This rule contains sexually explicit keywords
//
and sender.email.email == 'notifications@demio.com'
and (
  // phone number regex
  regex.icontains(subject.base,
                  '\+?(?:[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}'
  )
  // dollar amounts
  or regex.icontains(subject.base, '(?:USD|\$)\s?\d')
  or regex.icontains(subject.base, '\d+\.\d{2}\s?(?:USD|usd)')
  // suspicious TLDs
  or regex.icontains(subject.base,
                     '\.(?:ac\.th|biz\.id|co\.(?:cl|id|za)|com\.(?:ge|py)|my\.id|ne\.jp|net\.ms|nom\.za|web\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\b'
  )
  // dating/spam/explicit content lures
  or regex.icontains(strings.replace_confusables(subject.base),
                     '(?:\bs\s?e\s?x\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)'
  )
  // action verbs + length
  or (
    strings.count(subject.base, " ") > 8
    and regex.icontains(strings.replace_confusables(subject.base),
                        '(?:call|dial|speak to|contact \d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))'
    )
  )
)

Detection logic

Scope: inbound message.

Detects messages from Demio notifications service containing suspicious patterns including phone numbers, monetary amounts, suspicious domain references, explicit content lures, or lengthy action-oriented subjects designed to manipulate recipients.

  1. inbound message
  2. sender.email.email is 'notifications@demio.com'
  3. any of:
    • subject.base 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}
    • subject.base matches '(?:USD|\\$)\\s?\\d'
    • subject.base matches '\\d+\\.\\d{2}\\s?(?:USD|usd)'
    • subject.base matches '\\.(?:ac\\.th|biz\\.id|co\\.(?:cl|id|za)|com\\.(?:ge|py)|my\\.id|ne\\.jp|net\\.ms|nom\\.za|web\\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\\b'
    • strings.replace_confusables(subject.base) matches '(?:\\bs\\s?e\\s?x\\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)'
    • all of:
      • strings.count(subject.base, ' ') > 8
      • strings.replace_confusables(subject.base) matches '(?:call|dial|speak to|contact \\d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))'

Inspects: sender.email.email, subject.base, type.inbound. Sensors: regex.icontains, strings.count, strings.replace_confusables.

Indicators matched (8)

FieldMatchValue
sender.email.emailequalsnotifications@demio.com
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}
regex.icontainsregex(?:USD|\$)\s?\d
regex.icontainsregex\d+\.\d{2}\s?(?:USD|usd)
regex.icontainsregex\.(?:ac\.th|biz\.id|co\.(?:cl|id|za)|com\.(?:ge|py)|my\.id|ne\.jp|net\.ms|nom\.za|web\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\b
regex.icontainsregex(?:\bs\s?e\s?x\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)
regex.icontainsregex(?:call|dial|speak to|contact \d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      strings.count func_call "strings.count(subject.base, \" \") > 8"
      strings.replace_confusables(subject.base) regex_match "(?:call|dial|speak to|contact \\d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))"
    strings.replace_confusables(subject.base) regex_match "(?:\\bs\\s?e\\s?x\\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)"
    subject.base regex_match "(?:USD|\\$)\\s?\\d"
    subject.base regex_match "\\+?(?:[ilo0-9]{1,2})?\\s?\\(?\\d{3}\\)?[\\s\\.\\-⋅]{0,5}[ilo0-9]{3}[\\s\\.\\-⋅]{0,5}[ilo0-9]{4}"
    subject.base regex_match "\\+?(?:[ilo0-9]{1}.)?\\(?[ilo0-9]{3}?\\)?.[ilo0-9]{3}.?[ilo0-9]{4}"
    subject.base regex_match "\\.(?:ac\\.th|biz\\.id|co\\.(?:cl|id|za)|com\\.(?:ge|py)|my\\.id|ne\\.jp|net\\.ms|nom\\.za|web\\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\\b"
    subject.base regex_match "\\d+\\.\\d{2}\\s?(?:USD|usd)"
  sender.email.email eq "notifications@demio.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
sender.email.emaileq
  • notifications@demio.com
field:"sender.email.email" kind:eq value:"notifications@demio.com"
strings.replace_confusables(subject.base)regex_match
  • (?:\bs\s?e\s?x\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)
  • (?:call|dial|speak to|contact \d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))
field:"strings.replace_confusables(subject.base)" kind:regex_match
subject.baseregex_match
  • (?:USD|$)\s?\d
  • +?(?:[ilo0-9]{1,2})?\s?(?\d{3})?[\s.\-⋅]{0,5}[ilo0-9]{3}[\s.\-⋅]{0,5}[ilo0-9]{4}
  • +?(?:[ilo0-9]{1}.)?(?[ilo0-9]{3}?)?.[ilo0-9]{3}.?[ilo0-9]{4}
  • .(?:ac.th|biz.id|co.(?:cl|id|za)|com.(?:ge|py)|my.id|ne.jp|net.ms|nom.za|web.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\b
  • \d+.\d{2}\s?(?:USD|usd)
field:"subject.base" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service abuse: DocSend share from an unsolicited reply-to address

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

DocSend shares which contain a reply-to address or domain that has not been previously observed by the recipient organization.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesEvasion, Free file host, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • sender.email
  • type

Rule body

type.inbound

// Legitimate DocSend sending infratructure
and sender.email.email == "no-reply@docsend.com"

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

// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited

// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign

Detection logic

Scope: inbound message.

DocSend shares which contain a reply-to address or domain that has not been previously observed by the recipient organization.

  1. inbound message
  2. sender.email.email is 'no-reply@docsend.com'
  3. not:
    • beta.profile.by_reply_to().solicited
  4. not:
    • beta.profile.by_reply_to().any_messages_benign

Inspects: sender.email.email, type.inbound. Sensors: beta.profile.by_reply_to.

Indicators matched (1)

FieldMatchValue
sender.email.emailequalsno-reply@docsend.com

Stages and Predicates

Stage 1: mql_rule

and
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
  sender.email.email eq "no-reply@docsend.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: DocSend share from newly registered domain

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

This Attack Surface Reduction (ASR) rule matches on DocSend notifications with recently registered reply-to domains.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Credential Phishing
Tactics and techniquesEvasion, Free file host, Impersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound

// Legitimate DocSend sending infratructure
and sender.email.email == "no-reply@docsend.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass

// the message needs to have a reply-to address
and length(headers.reply_to) > 0

// reply-to email address has never received an email from your org
and not any(headers.reply_to, .email.email in $recipient_emails)

// new reply-to
and any(headers.reply_to, network.whois(.email.domain).days_old < 30)

Detection logic

Scope: inbound message.

This Attack Surface Reduction (ASR) rule matches on DocSend notifications with recently registered reply-to domains.

  1. inbound message
  2. sender.email.email is 'no-reply@docsend.com'
  3. headers.auth_summary.spf.pass
  4. headers.auth_summary.dmarc.pass
  5. length(headers.reply_to) > 0
  6. not:
    • any of headers.reply_to where:
      • .email.email in $recipient_emails
  7. any of headers.reply_to where:
    • network.whois(.email.domain).days_old < 30

Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain, headers.reply_to[].email.email, sender.email.email, type.inbound. Sensors: network.whois. Reference lists: $recipient_emails.

Indicators matched (1)

FieldMatchValue
sender.email.emailequalsno-reply@docsend.com

Stages and Predicates

Stage 1: mql_rule

and
  not
    any(headers.reply_to)
       macro "headers.reply_to[].email.email in recipient_emails"
  any(headers.reply_to)
    network.whois func_call "network.whois(headers.reply_to[].email.domain).days_old < 30"
  headers.auth_summary.dmarc.pass eq "true"
  headers.auth_summary.spf.pass eq "true"
  headers.reply_to length_compare "0"
  sender.email.email eq "no-reply@docsend.com"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.reply_toarray_any(no value, null check)excludes:headers.reply_to

Indicators

These rows show field, operator, and value matches.

Service abuse: DocuSign notification with suspicious sender or document name

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

The detection rule is intended to match on messages sent from Docusign from a newly observed reply-to address which contains suspicious content within the document or sender display name.

Threat classification

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

CategoryValues
Attack typesCallback Phishing, BEC/Fraud
Tactics and techniquesEvasion, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • headers.auth_summary
  • headers.reply_to
  • sender.email
  • subject
  • type

Rule body

type.inbound
and length(attachments) == 0

// Legitimate Docusign sending infratructure
and sender.email.domain.root_domain == 'docusign.net'
and (headers.auth_summary.spf.pass or headers.auth_summary.dmarc.pass)
and length(headers.reply_to) > 0
and not any(headers.reply_to,
            .email.domain.domain in $org_domains
            or .email.domain.root_domain in $high_trust_sender_root_domains
            or .email.domain.root_domain in ("docusign.net", "docusign.com")
)
// 
// 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
// 

// reply-to address has never sent an email to the org
and beta.profile.by_reply_to().prevalence == "new"

// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited

// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign

// not a completed DocuSign
// reminders are sent automatically and can be just as malicious as the initial
// users often decline malicious ones
and not strings.istarts_with(subject.subject, "Completed: ")
and not strings.istarts_with(subject.subject, "Here is your signed document: ")
and not strings.istarts_with(subject.subject, "Voided: ")
and (
  // contains the word docusign before the `via Docusign` part
  regex.icontains(sender.display_name, 'Docusign.*via Docusign$')
  or strings.icontains(subject.subject, 'sharefile')
  or strings.icontains(subject.subject, 'helloshare')

  // sender names part of the subject
  or (
    // Billing Accounting
    regex.icontains(sender.display_name,
                    'Accounts? (?:Payable|Receivable).*via Docusign$',
                    'Billing Support.*via Docusign$'
    )

    // HR/Payroll/Legal/etc
    or regex.icontains(sender.display_name, 'Compliance HR.*via Docusign$')
    or regex.icontains(sender.display_name,
                       '(?:Compliance|Executive|Finance|\bHR\b|Human Resources|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*(?:Department|Team)?.*via Docusign$'
    )
    or regex.icontains(sender.display_name,
                       'Corporate Communications.*via Docusign$'
    )
    or regex.icontains(sender.display_name, 'Employee Relations.*via Docusign$')
    or regex.icontains(sender.display_name, 'Office Manager.*via Docusign$')
    or regex.icontains(sender.display_name, 'Risk Management.*via Docusign$')
    or regex.icontains(sender.display_name,
                       'Payroll Admin(?:istrator).*via Docusign$'
    )

    // IT related
    or regex.icontains(sender.display_name,
                       'IT Support.*via Docusign$',
                       'Information Technology.*via Docusign$',
                       '(?:Network|System)? Admin(?:istrator).*via Docusign$',
                       'Help Desk.*via Docusign$',
                       'Tech(?:nical) Support.*via Docusign$'
    )
  )
  // filename analysis
  // the filename is also contained in the subject line
  or (
    // scanner themed
    regex.icontains(subject.subject, 'scanne[rd]')
    // image theme
    or regex.icontains(subject.subject, '_IMG_')
    or regex.icontains(subject.subject, 'IMG[_-](?:\d|\W)+')

    // Invoice Themes
    or regex.icontains(subject.subject, 'Invoice')
    or regex.icontains(subject.subject, 'INV\b')
    or regex.icontains(subject.subject, 'Payment')
    or regex.icontains(subject.subject, '\bACH\b')
    or regex.icontains(subject.subject, 'Wire Confirmation')
    or regex.icontains(subject.subject, 'P[O0]\W+?\d+\"')
    or regex.icontains(subject.subject, 'P[O0](?:\W+?|\d+)')
    or regex.icontains(subject.subject, 'receipt')
    or regex.icontains(subject.subject, 'Billing')
    or regex.icontains(subject.subject, 'statement')
    or regex.icontains(subject.subject, 'Past Due')
    or regex.icontains(subject.subject, 'Remit(?:tance)?')
    or regex.icontains(subject.subject, 'Purchase Order')
    or regex.icontains(subject.subject, 'Settlementt')

    // contract language
    or regex.icontains(subject.subject, 'Pr[0o]p[0o]sal')
    or regex.icontains(subject.subject, 'Claim Doc')

    // Payroll/HR
    or regex.icontains(subject.subject, 'Payroll')
    or regex.icontains(subject.subject, 'Employee Pay\b')
    or regex.icontains(subject.subject, 'Salary')
    or regex.icontains(subject.subject, 'Benefit Enrollment')
    or regex.icontains(subject.subject, 'Employee Handbook')
    or regex.icontains(subject.subject, 'Reimbursement Approved')

    // 
    // shared files/extenstion/urgency/CTA
    or regex.icontains(subject.subject, 'Urgent')
    or regex.icontains(subject.subject, 'Important')
    or regex.icontains(subject.subject, 'Secure')
    or regex.icontains(subject.subject, 'Encrypt')
    or regex.icontains(subject.subject, 'shared')
    or regex.icontains(subject.subject, 'protected')
    or regex.icontains(subject.subject, 'Validate')
    or regex.icontains(subject.subject, 'Action Required')
    or regex.icontains(subject.subject, 'Final Notice')
    or regex.icontains(subject.subject, 'Review(?: and| & |\s+)?Sign')
    or regex.icontains(subject.subject, 'Download PDF')

    // MFA theme
    or regex.icontains(subject.subject, 'Verification Code')
    or regex.icontains(subject.subject, '\bMFA\b')
  )
)

Detection logic

Scope: inbound message.

The detection rule is intended to match on messages sent from Docusign from a newly observed reply-to address which contains suspicious content within the document or sender display name.

  1. inbound message
  2. length(attachments) is 0
  3. sender.email.domain.root_domain is 'docusign.net'
  4. any of:
    • headers.auth_summary.spf.pass
    • headers.auth_summary.dmarc.pass
  5. length(headers.reply_to) > 0
  6. not:
    • any of headers.reply_to where any holds:
      • .email.domain.domain in $org_domains
      • .email.domain.root_domain in $high_trust_sender_root_domains
      • .email.domain.root_domain in ('docusign.net', 'docusign.com')
  7. beta.profile.by_reply_to().prevalence is 'new'
  8. not:
    • beta.profile.by_reply_to().solicited
  9. not:
    • beta.profile.by_reply_to().any_messages_benign
  10. not:
    • subject.subject starts with 'Completed: '
  11. not:
    • subject.subject starts with 'Here is your signed document: '
  12. not:
    • subject.subject starts with 'Voided: '
  13. any of:
    • sender.display_name matches 'Docusign.*via Docusign$'
    • subject.subject contains 'sharefile'
    • subject.subject contains 'helloshare'
    • sender.display_name matches any of 14 patterns
      • Accounts? (?:Payable|Receivable).*via Docusign$
      • Billing Support.*via Docusign$
      • Compliance HR.*via Docusign$
      • (?:Compliance|Executive|Finance|\bHR\b|Human Resources|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*(?:Department|Team)?.*via Docusign$
      • Corporate Communications.*via Docusign$
      • Employee Relations.*via Docusign$
      • Office Manager.*via Docusign$
      • Risk Management.*via Docusign$
      • Payroll Admin(?:istrator).*via Docusign$
      • IT Support.*via Docusign$
      • Information Technology.*via Docusign$
      • (?:Network|System)? Admin(?:istrator).*via Docusign$
      • Help Desk.*via Docusign$
      • Tech(?:nical) Support.*via Docusign$
    • subject.subject matches any of 38 patterns
      • scanne[rd]
      • _IMG_
      • IMG[_-](?:\d|\W)+
      • Invoice
      • INV\b
      • Payment
      • \bACH\b
      • Wire Confirmation
      • P[O0]\W+?\d+\"
      • P[O0](?:\W+?|\d+)
      • receipt
      • Billing
      • statement
      • Past Due
      • Remit(?:tance)?
      • Purchase Order
      • Settlementt
      • Pr[0o]p[0o]sal
      • Claim Doc
      • Payroll
      • Employee Pay\b
      • Salary
      • Benefit Enrollment
      • Employee Handbook
      • Reimbursement Approved
      • Urgent
      • Important
      • Secure
      • Encrypt
      • shared
      • protected
      • Validate
      • Action Required
      • Final Notice
      • Review(?: and| & |\s+)?Sign
      • Download PDF
      • Verification Code
      • \bMFA\b

Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain.domain, headers.reply_to[].email.domain.root_domain, sender.display_name, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: beta.profile.by_reply_to, regex.icontains, strings.icontains, strings.istarts_with. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (56)

FieldMatchValue
sender.email.domain.root_domainequalsdocusign.net
regex.icontainsregexDocusign.*via Docusign$
strings.icontainssubstringsharefile
strings.icontainssubstringhelloshare
regex.icontainsregexAccounts? (?:Payable|Receivable).*via Docusign$
regex.icontainsregexBilling Support.*via Docusign$
regex.icontainsregexCompliance HR.*via Docusign$
regex.icontainsregex(?:Compliance|Executive|Finance|\bHR\b|Human Resources|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*(?:Department|Team)?.*via Docusign$
regex.icontainsregexCorporate Communications.*via Docusign$
regex.icontainsregexEmployee Relations.*via Docusign$
regex.icontainsregexOffice Manager.*via Docusign$
regex.icontainsregexRisk Management.*via Docusign$
44 more
regex.icontainsregexPayroll Admin(?:istrator).*via Docusign$
regex.icontainsregexIT Support.*via Docusign$
regex.icontainsregexInformation Technology.*via Docusign$
regex.icontainsregex(?:Network|System)? Admin(?:istrator).*via Docusign$
regex.icontainsregexHelp Desk.*via Docusign$
regex.icontainsregexTech(?:nical) Support.*via Docusign$
regex.icontainsregexscanne[rd]
regex.icontainsregex_IMG_
regex.icontainsregexIMG[_-](?:\d|\W)+
regex.icontainsregexInvoice
regex.icontainsregexINV\b
regex.icontainsregexPayment
regex.icontainsregex\bACH\b
regex.icontainsregexWire Confirmation
regex.icontainsregexP[O0]\W+?\d+\"
regex.icontainsregexP[O0](?:\W+?|\d+)
regex.icontainsregexreceipt
regex.icontainsregexBilling
regex.icontainsregexstatement
regex.icontainsregexPast Due
regex.icontainsregexRemit(?:tance)?
regex.icontainsregexPurchase Order
regex.icontainsregexSettlementt
regex.icontainsregexPr[0o]p[0o]sal
regex.icontainsregexClaim Doc
regex.icontainsregexPayroll
regex.icontainsregexEmployee Pay\b
regex.icontainsregexSalary
regex.icontainsregexBenefit Enrollment
regex.icontainsregexEmployee Handbook
regex.icontainsregexReimbursement Approved
regex.icontainsregexUrgent
regex.icontainsregexImportant
regex.icontainsregexSecure
regex.icontainsregexEncrypt
regex.icontainsregexshared
regex.icontainsregexprotected
regex.icontainsregexValidate
regex.icontainsregexAction Required
regex.icontainsregexFinal Notice
regex.icontainsregexReview(?: and| & |\s+)?Sign
regex.icontainsregexDownload PDF
regex.icontainsregexVerification Code
regex.icontainsregex\bMFA\b

Stages and Predicates

Stage 1: mql_rule

and
  not
    any(headers.reply_to)
      or
        headers.reply_to.email.domain.root_domain in ["docusign.com", "docusign.net"]
         macro "headers.reply_to[].email.domain.domain in org_domains"
         macro "headers.reply_to[].email.domain.root_domain in high_trust_sender_root_domains"
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
  or
    headers.auth_summary.dmarc.pass eq "true"
    headers.auth_summary.spf.pass eq "true"
  or
    sender.display_name regex_match "(?:Compliance|Executive|Finance|\\bHR\\b|Human Resources|\\bIT\\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*(?:Department|Team)?.*via Docusign$"
    sender.display_name regex_match "(?:Network|System)? Admin(?:istrator).*via Docusign$"
    sender.display_name regex_match "Accounts? (?:Payable|Receivable).*via Docusign$"
    sender.display_name regex_match "Billing Support.*via Docusign$"
    sender.display_name regex_match "Compliance HR.*via Docusign$"
    sender.display_name regex_match "Corporate Communications.*via Docusign$"
    sender.display_name regex_match "Docusign.*via Docusign$"
    sender.display_name regex_match "Employee Relations.*via Docusign$"
    sender.display_name regex_match "Help Desk.*via Docusign$"
    sender.display_name regex_match "IT Support.*via Docusign$"
    sender.display_name regex_match "Information Technology.*via Docusign$"
    sender.display_name regex_match "Office Manager.*via Docusign$"
    sender.display_name regex_match "Payroll Admin(?:istrator).*via Docusign$"
    sender.display_name regex_match "Risk Management.*via Docusign$"
    sender.display_name regex_match "Tech(?:nical) Support.*via Docusign$"
    subject.subject contains "helloshare"
    subject.subject contains "sharefile"
    subject.subject regex_match "Action Required"
    subject.subject regex_match "Benefit Enrollment"
    subject.subject regex_match "Billing"
    subject.subject regex_match "Claim Doc"
    subject.subject regex_match "Download PDF"
    subject.subject regex_match "Employee Handbook"
    subject.subject regex_match "Employee Pay\\b"
    subject.subject regex_match "Encrypt"
    subject.subject regex_match "Final Notice"
    subject.subject regex_match "IMG[_-](?:\\d|\\W)+"
    subject.subject regex_match "INV\\b"
    subject.subject regex_match "Important"
    subject.subject regex_match "Invoice"
    subject.subject regex_match "P[O0](?:\\W+?|\\d+)"
    subject.subject regex_match "P[O0]\\W+?\\d+\\\""
    subject.subject regex_match "Past Due"
    subject.subject regex_match "Payment"
    subject.subject regex_match "Payroll"
    subject.subject regex_match "Pr[0o]p[0o]sal"
    subject.subject regex_match "Purchase Order"
    subject.subject regex_match "Reimbursement Approved"
    subject.subject regex_match "Remit(?:tance)?"
    subject.subject regex_match "Review(?: and| & |\\s+)?Sign"
    subject.subject regex_match "Salary"
    subject.subject regex_match "Secure"
    subject.subject regex_match "Settlementt"
    subject.subject regex_match "Urgent"
    subject.subject regex_match "Validate"
    subject.subject regex_match "Verification Code"
    subject.subject regex_match "Wire Confirmation"
    subject.subject regex_match "\\bACH\\b"
    subject.subject regex_match "\\bMFA\\b"
    subject.subject regex_match "_IMG_"
    subject.subject regex_match "protected"
    subject.subject regex_match "receipt"
    subject.subject regex_match "scanne[rd]"
    subject.subject regex_match "shared"
    subject.subject regex_match "statement"
  not
    subject.subject starts_with "Completed: "
  not
    subject.subject starts_with "Here is your signed document: "
  not
    subject.subject starts_with "Voided: "
  attachments length_compare "0"
  beta.profile.by_reply_to func_call "beta.profile.by_reply_to().prevalence == new"
  headers.reply_to length_compare "0"
  sender.email.domain.root_domain eq "docusign.net"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.reply_toarray_any(no value, null check)excludes:headers.reply_to
subject.subjectstarts_withCompleted: excludes:subject.subject field:"subject.subject" value:"Completed: "
subject.subjectstarts_withHere is your signed document: excludes:subject.subject field:"subject.subject" value:"Here is your signed document: "
subject.subjectstarts_withVoided: excludes:subject.subject field:"subject.subject" value:"Voided: "

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
headers.auth_summary.dmarc.passeq
  • true transforms: boolean
field:"headers.auth_summary.dmarc.pass" kind:eq value:"true"
headers.auth_summary.spf.passeq
  • true transforms: boolean
field:"headers.auth_summary.spf.pass" kind:eq value:"true"
sender.display_nameregex_match
  • (?:Compliance|Executive|Finance|\bHR\b|Human Resources|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*(?:Department|Team)?.*via Docusign$
  • (?:Network|System)? Admin(?:istrator).*via Docusign$
  • Accounts? (?:Payable|Receivable).*via Docusign$
  • Billing Support.*via Docusign$
  • Compliance HR.*via Docusign$
  • Corporate Communications.*via Docusign$
  • Docusign.*via Docusign$
  • Employee Relations.*via Docusign$
  • Help Desk.*via Docusign$
  • IT Support.*via Docusign$
  • Information Technology.*via Docusign$
  • Office Manager.*via Docusign$
  • Payroll Admin(?:istrator).*via Docusign$
  • Risk Management.*via Docusign$
  • Tech(?:nical) Support.*via Docusign$
field:"sender.display_name" kind:regex_match
sender.email.domain.root_domaineq
  • docusign.net
field:"sender.email.domain.root_domain" kind:eq value:"docusign.net"
subject.subjectcontains
  • helloshare
  • sharefile
field:"subject.subject" kind:contains
subject.subjectregex_match
  • Action Required
  • Benefit Enrollment
  • Billing
  • Claim Doc
  • Download PDF
  • Employee Handbook
  • Employee Pay\b
  • Encrypt
  • Final Notice
  • IMG[_-](?:\d|\W)+
  • INV\b
  • Important
  • Invoice
  • P[O0](?:\W+?|\d+)
  • P[O0]\W+?\d+\"
  • Past Due
  • Payment
  • Payroll
  • Pr[0o]p[0o]sal
  • Purchase Order
  • Reimbursement Approved
  • Remit(?:tance)?
  • Review(?: and| & |\s+)?Sign
  • Salary
  • Secure
  • Settlementt
  • Urgent
  • Validate
  • Verification Code
  • Wire Confirmation
  • \bACH\b
  • \bMFA\b
  • _IMG_
  • protected
  • receipt
  • scanne[rd]
  • shared
  • statement
field:"subject.subject" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service abuse: DocuSign share from an unsolicited reply-to address

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

DocuSign shares which contain a reply-to address or domain that has not been previously observed by the recipient organization.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesEvasion, Free file host, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • headers.auth_summary
  • headers.reply_to
  • sender.email
  • subject
  • type

Rule body

type.inbound

// message is from docusign actual
and sender.email.domain.root_domain == 'docusign.net'
and not any(headers.reply_to, .email.domain.domain == 'docusign.com')
and (headers.auth_summary.spf.pass or headers.auth_summary.dmarc.pass)

// not a completed DocuSign
// reminders are sent automatically and can be just as malicious as the initial
// users often decline malicious ones
and not strings.istarts_with(subject.subject, "Completed: ")
and not strings.istarts_with(subject.subject, "Here is your signed document: ")
and not strings.istarts_with(subject.subject, "Voided: ")

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

// reply-to address rarely seen in org
and beta.profile.by_reply_to().prevalence in~ ("new", "rare")

// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited

// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign

Detection logic

Scope: inbound message.

DocuSign shares which contain a reply-to address or domain that has not been previously observed by the recipient organization.

  1. inbound message
  2. sender.email.domain.root_domain is 'docusign.net'
  3. not:
    • any of headers.reply_to where:
      • .email.domain.domain is 'docusign.com'
  4. any of:
    • headers.auth_summary.spf.pass
    • headers.auth_summary.dmarc.pass
  5. not:
    • subject.subject starts with 'Completed: '
  6. not:
    • subject.subject starts with 'Here is your signed document: '
  7. not:
    • subject.subject starts with 'Voided: '
  8. beta.profile.by_reply_to().prevalence in ('new', 'rare')
  9. not:
    • beta.profile.by_reply_to().solicited
  10. not:
    • beta.profile.by_reply_to().any_messages_benign

Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain.domain, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: beta.profile.by_reply_to, strings.istarts_with.

Indicators matched (1)

FieldMatchValue
sender.email.domain.root_domainequalsdocusign.net

Stages and Predicates

Stage 1: mql_rule

and
  not
    any(headers.reply_to)
      headers.reply_to.email.domain.domain eq "docusign.com"
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
  or
    headers.auth_summary.dmarc.pass eq "true"
    headers.auth_summary.spf.pass eq "true"
  not
    subject.subject starts_with "Completed: "
  not
    subject.subject starts_with "Here is your signed document: "
  not
    subject.subject starts_with "Voided: "
  beta.profile.by_reply_to func_call "beta.profile.by_reply_to().prevalence in~ (new, rare)"
  sender.email.domain.root_domain eq "docusign.net"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.reply_toarray_any(no value, null check)excludes:headers.reply_to
subject.subjectstarts_withCompleted: excludes:subject.subject field:"subject.subject" value:"Completed: "
subject.subjectstarts_withHere is your signed document: excludes:subject.subject field:"subject.subject" value:"Here is your signed document: "
subject.subjectstarts_withVoided: excludes:subject.subject field:"subject.subject" value:"Voided: "

Indicators

These rows show field, operator, and value matches.

Service abuse: Domains By Proxy sender

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

Message originates from a sender using Domains By Proxy's domain privacy service, commonly used to hide domain ownership information.

Threat classification

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

CategoryValues
Attack typesSpam, Credential Phishing, BEC/Fraud
Tactics and techniquesEvasion, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • sender.email
  • type

Rule body

type.inbound
and sender.email.domain.root_domain == 'domainsbyproxy.com'

Detection logic

Scope: inbound message.

Message originates from a sender using Domains By Proxy's domain privacy service, commonly used to hide domain ownership information.

  1. inbound message
  2. sender.email.domain.root_domain is 'domainsbyproxy.com'

Inspects: sender.email.domain.root_domain, type.inbound.

Indicators matched (1)

FieldMatchValue
sender.email.domain.root_domainequalsdomainsbyproxy.com

Stages and Predicates

Stage 1: mql_rule

and
  sender.email.domain.root_domain eq "domainsbyproxy.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: Dropbox share from an unsolicited reply-to address

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

This rule detects Dropbox share notifications which contain a reply-to address or domain that has not been previously observed sending messages to or receiving messages from the recipient organization.

Threat classification

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

CategoryValues
Attack typesCallback Phishing, BEC/Fraud
Tactics and techniquesEvasion, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound

// Legitimate Dropbox sending infratructure
and sender.email.email == "no-reply@dropbox.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and strings.ends_with(headers.auth_summary.spf.details.designator,
                      '.dropbox.com'
)
and strings.icontains(subject.subject, 'shared')
and strings.icontains(subject.subject, 'with you')

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

// reply-to address has never sent an email to the org
and beta.profile.by_reply_to().prevalence == "new"

// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited

// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign

Detection logic

Scope: inbound message.

This rule detects Dropbox share notifications which contain a reply-to address or domain that has not been previously observed sending messages to or receiving messages from the recipient organization.

  1. inbound message
  2. sender.email.email is 'no-reply@dropbox.com'
  3. headers.auth_summary.spf.pass
  4. headers.auth_summary.dmarc.pass
  5. headers.auth_summary.spf.details.designator ends with '.dropbox.com'
  6. subject.subject contains 'shared'
  7. subject.subject contains 'with you'
  8. beta.profile.by_reply_to().prevalence is 'new'
  9. not:
    • beta.profile.by_reply_to().solicited
  10. not:
    • beta.profile.by_reply_to().any_messages_benign

Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.details.designator, headers.auth_summary.spf.pass, sender.email.email, subject.subject, type.inbound. Sensors: beta.profile.by_reply_to, strings.ends_with, strings.icontains.

Indicators matched (4)

FieldMatchValue
sender.email.emailequalsno-reply@dropbox.com
strings.ends_withsuffix.dropbox.com
strings.icontainssubstringshared
strings.icontainssubstringwith you

Stages and Predicates

Stage 1: mql_rule

and
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
  beta.profile.by_reply_to func_call "beta.profile.by_reply_to().prevalence == new"
  headers.auth_summary.dmarc.pass eq "true"
  headers.auth_summary.spf.details.designator ends_with ".dropbox.com"
  headers.auth_summary.spf.pass eq "true"
  sender.email.email eq "no-reply@dropbox.com"
  subject.subject contains "shared"
  subject.subject contains "with you"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: Dropbox share from new domain

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

This Attack Surface Reduction (ASR) rule matches on Dropbox notifications with recently registered reply-to domains.

Threat classification

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

CategoryValues
Attack typesCallback Phishing, Credential Phishing, BEC/Fraud
Tactics and techniquesEvasion, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound

//  Dropbox actual sending infrastructure
and sender.email.email == "no-reply@dropbox.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and strings.ends_with(headers.auth_summary.spf.details.designator,
                      '.dropbox.com'
)

// the message needs to have a reply-to address
and length(headers.reply_to) > 0

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

// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited

// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign

// new reply-to domain
and any(headers.reply_to, network.whois(.email.domain).days_old < 30)

Detection logic

Scope: inbound message.

This Attack Surface Reduction (ASR) rule matches on Dropbox notifications with recently registered reply-to domains.

  1. inbound message
  2. sender.email.email is 'no-reply@dropbox.com'
  3. headers.auth_summary.spf.pass
  4. headers.auth_summary.dmarc.pass
  5. headers.auth_summary.spf.details.designator ends with '.dropbox.com'
  6. length(headers.reply_to) > 0
  7. not:
    • beta.profile.by_reply_to().solicited
  8. not:
    • beta.profile.by_reply_to().any_messages_benign
  9. any of headers.reply_to where:
    • network.whois(.email.domain).days_old < 30

Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.details.designator, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain, sender.email.email, type.inbound. Sensors: beta.profile.by_reply_to, network.whois, strings.ends_with.

Indicators matched (2)

FieldMatchValue
sender.email.emailequalsno-reply@dropbox.com
strings.ends_withsuffix.dropbox.com

Stages and Predicates

Stage 1: mql_rule

and
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
  any(headers.reply_to)
    network.whois func_call "network.whois(headers.reply_to[].email.domain).days_old < 30"
  headers.auth_summary.dmarc.pass eq "true"
  headers.auth_summary.spf.details.designator ends_with ".dropbox.com"
  headers.auth_summary.spf.pass eq "true"
  headers.reply_to length_compare "0"
  sender.email.email eq "no-reply@dropbox.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: Dropbox share with suspicious sender or document name

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

The detection rule is intended to match on messages sent from DropBox indicating a shared file to the recipient which contains suspicious content within the document or sender display name.

Threat classification

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

CategoryValues
Attack typesCallback Phishing, BEC/Fraud
Tactics and techniquesEvasion, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • headers.auth_summary
  • headers.reply_to
  • sender.email
  • subject
  • type

Rule body

type.inbound

// Legitimate Dropbox sending infratructure
and sender.email.email == "no-reply@dropbox.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and strings.ends_with(headers.auth_summary.spf.details.designator,
                      '.dropbox.com'
)
and strings.icontains(subject.subject, 'shared')
and strings.icontains(subject.subject, 'with you')
and (
  // contains the word dropbox
  // everything not "shared" and "with you" is actor controlled
  strings.icontains(subject.subject, 'dropbox')
  or strings.icontains(subject.subject, 'sharefile')

  // sender names part of the subject
  or (
    // Billing Accounting
    regex.icontains(subject.subject,
                    'Accounts? (?:Payable|Receivable).*shared',
                    'Billing Support.*shared'
    )

    // HR/Payroll/Legal/etc
    or regex.icontains(subject.subject, 'Compliance HR.*shared')
    or regex.icontains(subject.subject,
                       '(?:Compliance|Executive|Finance|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*shared'
    )
    or regex.icontains(subject.subject, '(?:Department|Team).*shared')
    or regex.icontains(subject.subject, 'Corporate Communications.*shared')
    or regex.icontains(subject.subject, 'Employee Relations.*shared')
    or regex.icontains(subject.subject, 'Office Manager.*shared')
    or regex.icontains(subject.subject, 'Risk Management.*shared')
    or regex.icontains(subject.subject, 'Payroll Admin(?:istrator).*shared')
    or regex.icontains(subject.subject, 'Human Resources.*shared')
    or regex.icontains(subject.subject, 'HR.*shared')

    // IT related
    or regex.icontains(subject.subject,
                       'IT Support.*shared',
                       'Information Technology.*shared',
                       '(?:Network|System)? Admin(?:istrator).*shared',
                       'Help Desk.*shared',
                       'Tech(?:nical) Support.*shared'
    )

    // an email address in the subject is also interesting
    or regex.icontains(subject.subject, '\w+@\w+\.\w+.*shared')
  )
  // filename analysis
  // the filename is also contianed in the subject line
  or (
    // untitled.paper
    regex.icontains(subject.subject, 'shared.*\"Untitled.paper')
    // scanner themed
    or regex.icontains(subject.subject, 'shared.*\".*scanne[rd]')
    // image theme
    or regex.icontains(subject.subject, 'shared.*\".*_IMG_')
    or regex.icontains(subject.subject, 'shared.*\".*IMG[_-](?:\d|\W)+\"')
    // ondrive theme
    or regex.icontains(subject.subject, 'shared.*\".*one_docx')
    or regex.icontains(subject.subject, 'shared.*\".*One.?Drive')
    or regex.icontains(subject.subject, 'shared.*\".*click here')
    or regex.icontains(subject.subject, 'shared.*\".*Download PDF')
    or regex.icontains(subject.subject, 'shared.*\".*Validate')

    // Invoice Themes
    or regex.icontains(subject.subject, 'shared.*\".*Invoice')
    or regex.icontains(subject.subject, 'shared.*\".*INV\b')
    or regex.icontains(subject.subject, 'shared.*\".*Payment')
    or regex.icontains(subject.subject, 'shared.*\".*ACH')
    or regex.icontains(subject.subject, 'shared.*\".*Wire Confirmation')
    or regex.icontains(subject.subject, 'shared.*\".*P[O0]\W+?\d+\"')
    or regex.icontains(subject.subject, 'shared.*\"P[O0](?:\W+?|\d+)')
    or regex.icontains(subject.subject, 'shared.*\".*receipt')
    or regex.icontains(subject.subject, 'shared.*\".*Billing')
    or regex.icontains(subject.subject, 'shared.*\".*statement')
    or regex.icontains(subject.subject, 'shared.*\".*Past Due')
    or regex.icontains(subject.subject, 'shared.*\".*Remit(?:tance)?')
    or regex.icontains(subject.subject, 'shared.*\".*Purchase Order')
    or regex.icontains(subject.subject, 'shared.*\".*Settlement')

    // contract language
    or regex.icontains(subject.subject, 'shared.*\".*Contract Agreement')
    or regex.icontains(subject.subject, 'shared.*\".*Pr[0o]p[0o]sal')
    or regex.icontains(subject.subject, 'shared.*\".*Contract Doc')
    or regex.icontains(subject.subject, 'shared.*\".*Claim Doc')

    // Payroll/HR
    // section also used in link_sharepoint_sus_name.yml with modified input
    or regex.icontains(subject.subject, 'shared.*\".*Payroll')
    or regex.icontains(subject.subject, 'shared.*\".*Employee Pay\b')
    or regex.icontains(subject.subject, 'shared.*\".*Salary')
    or regex.icontains(subject.subject, 'shared.*\".*Benefit Enrollment')
    or regex.icontains(subject.subject, 'shared.*\".*Employee Handbook')
    or regex.icontains(subject.subject, 'shared.*\".*Reimbursement Approved')
    or regex.icontains(subject.subject,
                       'shared.*\".*(?:Faculty|Staff)\s*(?:\w+\s+){0,3}\s*Eval(?:uation)?'
    )

    // shared files/extenstion
    or regex.icontains(subject.subject, 'shared.*\".*Shared.?File')
    or regex.icontains(subject.subject, 'shared.*\".*Urgent')
    or regex.icontains(subject.subject, 'shared.*\".*Important')
    or regex.icontains(subject.subject, 'shared.*\".*Secure')
    or regex.icontains(subject.subject, 'shared.*\".*Encrypt')
    or regex.icontains(subject.subject, 'shared.*\".*shared')
    or regex.icontains(subject.subject, 'shared.*\".*protected')
    or regex.icontains(subject.subject, 'shared.*\".*\.docx?\.pdf')
    or regex.icontains(subject.subject, 'shared.*\".*\.docx?\.paper')
    // all caps filename allowing for numbers, punct and spaces, and an optional file extenstion
    or regex.contains(subject.subject,
                      'shared \"[A-Z0-9[:punct:]\s]+(?:\.[a-zA-Z]{3,5})\"'
    )
    or regex.icontains(subject.subject,
                       'shared \".*(?:shared|sent).*\" with you'
    )

    // MFA theme
    or regex.icontains(subject.subject, 'shared.*\".*Verification Code')
    or regex.icontains(subject.subject, 'shared.*\".*\bMFA\b')

    // the reply-to address is within the subject
    or any(headers.reply_to,
           strings.icontains(subject.subject, .email.domain.domain)
    )
  )
)

Detection logic

Scope: inbound message.

The detection rule is intended to match on messages sent from DropBox indicating a shared file to the recipient which contains suspicious content within the document or sender display name.

  1. inbound message
  2. sender.email.email is 'no-reply@dropbox.com'
  3. headers.auth_summary.spf.pass
  4. headers.auth_summary.dmarc.pass
  5. headers.auth_summary.spf.details.designator ends with '.dropbox.com'
  6. subject.subject contains 'shared'
  7. subject.subject contains 'with you'
  8. any of:
    • subject.subject contains 'dropbox'
    • subject.subject contains 'sharefile'
    • subject.subject matches any of 18 patterns
      • Accounts? (?:Payable|Receivable).*shared
      • Billing Support.*shared
      • Compliance HR.*shared
      • (?:Compliance|Executive|Finance|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*shared
      • (?:Department|Team).*shared
      • Corporate Communications.*shared
      • Employee Relations.*shared
      • Office Manager.*shared
      • Risk Management.*shared
      • Payroll Admin(?:istrator).*shared
      • Human Resources.*shared
      • HR.*shared
      • IT Support.*shared
      • Information Technology.*shared
      • (?:Network|System)? Admin(?:istrator).*shared
      • Help Desk.*shared
      • Tech(?:nical) Support.*shared
      • \w+@\w+\.\w+.*shared
    • any of:
      • subject.subject matches 'shared.*\\"Untitled.paper'
      • subject.subject matches 'shared.*\\".*scanne[rd]'
      • subject.subject matches 'shared.*\\".*_IMG_'
      • subject.subject matches 'shared.*\\".*IMG[_-](?:\\d|\\W)+\\"'
      • subject.subject matches 'shared.*\\".*one_docx'
      • subject.subject matches 'shared.*\\".*One.?Drive'
      • subject.subject matches 'shared.*\\".*click here'
      • subject.subject matches 'shared.*\\".*Download PDF'
      • subject.subject matches 'shared.*\\".*Validate'
      • subject.subject matches 'shared.*\\".*Invoice'
      • subject.subject matches 'shared.*\\".*INV\\b'
      • subject.subject matches 'shared.*\\".*Payment'
      • subject.subject matches 'shared.*\\".*ACH'
      • subject.subject matches 'shared.*\\".*Wire Confirmation'
      • subject.subject matches 'shared.*\\".*P[O0]\\W+?\\d+\\"'
      • subject.subject matches 'shared.*\\"P[O0](?:\\W+?|\\d+)'
      • subject.subject matches 'shared.*\\".*receipt'
      • subject.subject matches 'shared.*\\".*Billing'
      • subject.subject matches 'shared.*\\".*statement'
      • subject.subject matches 'shared.*\\".*Past Due'
      • subject.subject matches 'shared.*\\".*Remit(?:tance)?'
      • subject.subject matches 'shared.*\\".*Purchase Order'
      • subject.subject matches 'shared.*\\".*Settlement'
      • subject.subject matches 'shared.*\\".*Contract Agreement'
      • subject.subject matches 'shared.*\\".*Pr[0o]p[0o]sal'
      • subject.subject matches 'shared.*\\".*Contract Doc'
      • subject.subject matches 'shared.*\\".*Claim Doc'
      • subject.subject matches 'shared.*\\".*Payroll'
      • subject.subject matches 'shared.*\\".*Employee Pay\\b'
      • subject.subject matches 'shared.*\\".*Salary'
      • subject.subject matches 'shared.*\\".*Benefit Enrollment'
      • subject.subject matches 'shared.*\\".*Employee Handbook'
      • subject.subject matches 'shared.*\\".*Reimbursement Approved'
      • subject.subject matches 'shared.*\\".*(?:Faculty|Staff)\\s*(?:\\w+\\s+){0,3}\\s*Eval(?:uation)?'
      • subject.subject matches 'shared.*\\".*Shared.?File'
      • subject.subject matches 'shared.*\\".*Urgent'
      • subject.subject matches 'shared.*\\".*Important'
      • subject.subject matches 'shared.*\\".*Secure'
      • subject.subject matches 'shared.*\\".*Encrypt'
      • subject.subject matches 'shared.*\\".*shared'
      • subject.subject matches 'shared.*\\".*protected'
      • subject.subject matches 'shared.*\\".*\\.docx?\\.pdf'
      • subject.subject matches 'shared.*\\".*\\.docx?\\.paper'
      • subject.subject matches 'shared \\"[A-Z0-9[:punct:]\\s]+(?:\\.[a-zA-Z]{3,5})\\"'
      • subject.subject matches 'shared \\".*(?:shared|sent).*\\" with you'
      • subject.subject matches 'shared.*\\".*Verification Code'
      • subject.subject matches 'shared.*\\".*\\bMFA\\b'
      • any of headers.reply_to where:
        • strings.icontains(subject.subject)

Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.details.designator, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain.domain, sender.email.email, subject.subject, type.inbound. Sensors: regex.contains, regex.icontains, strings.ends_with, strings.icontains.

Indicators matched (71)

FieldMatchValue
sender.email.emailequalsno-reply@dropbox.com
strings.ends_withsuffix.dropbox.com
strings.icontainssubstringshared
strings.icontainssubstringwith you
strings.icontainssubstringdropbox
strings.icontainssubstringsharefile
regex.icontainsregexAccounts? (?:Payable|Receivable).*shared
regex.icontainsregexBilling Support.*shared
regex.icontainsregexCompliance HR.*shared
regex.icontainsregex(?:Compliance|Executive|Finance|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*shared
regex.icontainsregex(?:Department|Team).*shared
regex.icontainsregexCorporate Communications.*shared
59 more
regex.icontainsregexEmployee Relations.*shared
regex.icontainsregexOffice Manager.*shared
regex.icontainsregexRisk Management.*shared
regex.icontainsregexPayroll Admin(?:istrator).*shared
regex.icontainsregexHuman Resources.*shared
regex.icontainsregexHR.*shared
regex.icontainsregexIT Support.*shared
regex.icontainsregexInformation Technology.*shared
regex.icontainsregex(?:Network|System)? Admin(?:istrator).*shared
regex.icontainsregexHelp Desk.*shared
regex.icontainsregexTech(?:nical) Support.*shared
regex.icontainsregex\w+@\w+\.\w+.*shared
regex.icontainsregexshared.*\"Untitled.paper
regex.icontainsregexshared.*\".*scanne[rd]
regex.icontainsregexshared.*\".*_IMG_
regex.icontainsregexshared.*\".*IMG[_-](?:\d|\W)+\"
regex.icontainsregexshared.*\".*one_docx
regex.icontainsregexshared.*\".*One.?Drive
regex.icontainsregexshared.*\".*click here
regex.icontainsregexshared.*\".*Download PDF
regex.icontainsregexshared.*\".*Validate
regex.icontainsregexshared.*\".*Invoice
regex.icontainsregexshared.*\".*INV\b
regex.icontainsregexshared.*\".*Payment
regex.icontainsregexshared.*\".*ACH
regex.icontainsregexshared.*\".*Wire Confirmation
regex.icontainsregexshared.*\".*P[O0]\W+?\d+\"
regex.icontainsregexshared.*\"P[O0](?:\W+?|\d+)
regex.icontainsregexshared.*\".*receipt
regex.icontainsregexshared.*\".*Billing
regex.icontainsregexshared.*\".*statement
regex.icontainsregexshared.*\".*Past Due
regex.icontainsregexshared.*\".*Remit(?:tance)?
regex.icontainsregexshared.*\".*Purchase Order
regex.icontainsregexshared.*\".*Settlement
regex.icontainsregexshared.*\".*Contract Agreement
regex.icontainsregexshared.*\".*Pr[0o]p[0o]sal
regex.icontainsregexshared.*\".*Contract Doc
regex.icontainsregexshared.*\".*Claim Doc
regex.icontainsregexshared.*\".*Payroll
regex.icontainsregexshared.*\".*Employee Pay\b
regex.icontainsregexshared.*\".*Salary
regex.icontainsregexshared.*\".*Benefit Enrollment
regex.icontainsregexshared.*\".*Employee Handbook
regex.icontainsregexshared.*\".*Reimbursement Approved
regex.icontainsregexshared.*\".*(?:Faculty|Staff)\s*(?:\w+\s+){0,3}\s*Eval(?:uation)?
regex.icontainsregexshared.*\".*Shared.?File
regex.icontainsregexshared.*\".*Urgent
regex.icontainsregexshared.*\".*Important
regex.icontainsregexshared.*\".*Secure
regex.icontainsregexshared.*\".*Encrypt
regex.icontainsregexshared.*\".*shared
regex.icontainsregexshared.*\".*protected
regex.icontainsregexshared.*\".*\.docx?\.pdf
regex.icontainsregexshared.*\".*\.docx?\.paper
regex.containsregexshared \"[A-Z0-9[:punct:]\s]+(?:\.[a-zA-Z]{3,5})\"
regex.icontainsregexshared \".*(?:shared|sent).*\" with you
regex.icontainsregexshared.*\".*Verification Code
regex.icontainsregexshared.*\".*\bMFA\b

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(headers.reply_to)
      strings.icontains func_call "strings.icontains(subject.subject)"
    subject.subject contains "dropbox"
    subject.subject contains "sharefile"
    subject.subject regex_match "(?:Compliance|Executive|Finance|\\bHR\\b|\\bIT\\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*shared"
    subject.subject regex_match "(?:Department|Team).*shared"
    subject.subject regex_match "(?:Network|System)? Admin(?:istrator).*shared"
    subject.subject regex_match "Accounts? (?:Payable|Receivable).*shared"
    subject.subject regex_match "Billing Support.*shared"
    subject.subject regex_match "Compliance HR.*shared"
    subject.subject regex_match "Corporate Communications.*shared"
    subject.subject regex_match "Employee Relations.*shared"
    subject.subject regex_match "HR.*shared"
    subject.subject regex_match "Help Desk.*shared"
    subject.subject regex_match "Human Resources.*shared"
    subject.subject regex_match "IT Support.*shared"
    subject.subject regex_match "Information Technology.*shared"
    subject.subject regex_match "Office Manager.*shared"
    subject.subject regex_match "Payroll Admin(?:istrator).*shared"
    subject.subject regex_match "Risk Management.*shared"
    subject.subject regex_match "Tech(?:nical) Support.*shared"
    subject.subject regex_match "\\w+@\\w+\\.\\w+.*shared"
    subject.subject regex_match "shared \\\".*(?:shared|sent).*\\\" with you"
    subject.subject regex_match "shared \\\"[A-Z0-9[:punct:]\\s]+(?:\\.[a-zA-Z]{3,5})\\\""
    subject.subject regex_match "shared.*\\\".*(?:Faculty|Staff)\\s*(?:\\w+\\s+){0,3}\\s*Eval(?:uation)?"
    subject.subject regex_match "shared.*\\\".*ACH"
    subject.subject regex_match "shared.*\\\".*Benefit Enrollment"
    subject.subject regex_match "shared.*\\\".*Billing"
    subject.subject regex_match "shared.*\\\".*Claim Doc"
    subject.subject regex_match "shared.*\\\".*Contract Agreement"
    subject.subject regex_match "shared.*\\\".*Contract Doc"
    subject.subject regex_match "shared.*\\\".*Download PDF"
    subject.subject regex_match "shared.*\\\".*Employee Handbook"
    subject.subject regex_match "shared.*\\\".*Employee Pay\\b"
    subject.subject regex_match "shared.*\\\".*Encrypt"
    subject.subject regex_match "shared.*\\\".*IMG[_-](?:\\d|\\W)+\\\""
    subject.subject regex_match "shared.*\\\".*INV\\b"
    subject.subject regex_match "shared.*\\\".*Important"
    subject.subject regex_match "shared.*\\\".*Invoice"
    subject.subject regex_match "shared.*\\\".*One.?Drive"
    subject.subject regex_match "shared.*\\\".*P[O0]\\W+?\\d+\\\""
    subject.subject regex_match "shared.*\\\".*Past Due"
    subject.subject regex_match "shared.*\\\".*Payment"
    subject.subject regex_match "shared.*\\\".*Payroll"
    subject.subject regex_match "shared.*\\\".*Pr[0o]p[0o]sal"
    subject.subject regex_match "shared.*\\\".*Purchase Order"
    subject.subject regex_match "shared.*\\\".*Reimbursement Approved"
    subject.subject regex_match "shared.*\\\".*Remit(?:tance)?"
    subject.subject regex_match "shared.*\\\".*Salary"
    subject.subject regex_match "shared.*\\\".*Secure"
    subject.subject regex_match "shared.*\\\".*Settlement"
    subject.subject regex_match "shared.*\\\".*Shared.?File"
    subject.subject regex_match "shared.*\\\".*Urgent"
    subject.subject regex_match "shared.*\\\".*Validate"
    subject.subject regex_match "shared.*\\\".*Verification Code"
    subject.subject regex_match "shared.*\\\".*Wire Confirmation"
    subject.subject regex_match "shared.*\\\".*\\.docx?\\.paper"
    subject.subject regex_match "shared.*\\\".*\\.docx?\\.pdf"
    subject.subject regex_match "shared.*\\\".*\\bMFA\\b"
    subject.subject regex_match "shared.*\\\".*_IMG_"
    subject.subject regex_match "shared.*\\\".*click here"
    subject.subject regex_match "shared.*\\\".*one_docx"
    subject.subject regex_match "shared.*\\\".*protected"
    subject.subject regex_match "shared.*\\\".*receipt"
    subject.subject regex_match "shared.*\\\".*scanne[rd]"
    subject.subject regex_match "shared.*\\\".*shared"
    subject.subject regex_match "shared.*\\\".*statement"
    subject.subject regex_match "shared.*\\\"P[O0](?:\\W+?|\\d+)"
    subject.subject regex_match "shared.*\\\"Untitled.paper"
  headers.auth_summary.dmarc.pass eq "true"
  headers.auth_summary.spf.details.designator ends_with ".dropbox.com"
  headers.auth_summary.spf.pass eq "true"
  sender.email.email eq "no-reply@dropbox.com"
  subject.subject contains "shared"
  subject.subject contains "with you"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
headers.auth_summary.dmarc.passeq
  • true transforms: boolean
field:"headers.auth_summary.dmarc.pass" kind:eq value:"true"
headers.auth_summary.spf.details.designatorends_with
  • .dropbox.com
field:"headers.auth_summary.spf.details.designator" kind:ends_with value:".dropbox.com"
headers.auth_summary.spf.passeq
  • true transforms: boolean
field:"headers.auth_summary.spf.pass" kind:eq value:"true"
sender.email.emaileq
  • no-reply@dropbox.com
field:"sender.email.email" kind:eq value:"no-reply@dropbox.com"
subject.subjectcontains
  • dropbox
  • shared
  • sharefile
  • with you
field:"subject.subject" kind:contains
subject.subjectregex_match
  • (?:Compliance|Executive|Finance|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Training|Support).*shared
  • (?:Department|Team).*shared
  • (?:Network|System)? Admin(?:istrator).*shared
  • Accounts? (?:Payable|Receivable).*shared
  • Billing Support.*shared
  • Compliance HR.*shared
  • Corporate Communications.*shared
  • Employee Relations.*shared
  • HR.*shared
  • Help Desk.*shared
  • Human Resources.*shared
  • IT Support.*shared
  • Information Technology.*shared
  • Office Manager.*shared
  • Payroll Admin(?:istrator).*shared
  • Risk Management.*shared
  • Tech(?:nical) Support.*shared
  • \w+@\w+.\w+.*shared
  • shared \".*(?:shared|sent).*\" with you
  • shared \"[A-Z0-9[:punct:]\s]+(?:.[a-zA-Z]{3,5})\"
  • shared.*\".*(?:Faculty|Staff)\s*(?:\w+\s+){0,3}\s*Eval(?:uation)?
  • shared.*\".*ACH
  • shared.*\".*Benefit Enrollment
  • shared.*\".*Billing
  • shared.*\".*Claim Doc
  • shared.*\".*Contract Agreement
  • shared.*\".*Contract Doc
  • shared.*\".*Download PDF
  • shared.*\".*Employee Handbook
  • shared.*\".*Employee Pay\b
  • shared.*\".*Encrypt
  • shared.*\".*IMG[_-](?:\d|\W)+\"
  • shared.*\".*INV\b
  • shared.*\".*Important
  • shared.*\".*Invoice
  • shared.*\".*One.?Drive
  • shared.*\".*P[O0]\W+?\d+\"
  • shared.*\".*Past Due
  • shared.*\".*Payment
  • shared.*\".*Payroll
  • +25 more values (see full rule source)
field:"subject.subject" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service abuse: Evernote link

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

Detects inbound messages containing a link whose effective destination resolves to evernote.com, where the link text uses document-sharing or e-signature language (e.g., view, open, download, review) and the sender is not from evernote.com. The message body is also classified by an NLU model as exhibiting credential theft or business email compromise intent, indicating abuse of Evernote's legitimate hosting infrastructure to deliver malicious content.

Threat classification

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

CategoryValues
Attack typesCredential Phishing, BEC/Fraud
Tactics and techniquesSocial 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
// a link whose effective destination is evernote
and any(body.current_thread.links,
        (
          .href_url.domain.root_domain == "evernote.com"
          or .display_url.domain.root_domain == "evernote.com"
          or any(.href_url.query_params_decoded["domain"],
                 strings.iends_with(., "evernote.com")
          )
        )
        and (
          any(ml.nlu_classifier(.display_text).topics, .name == 'E-Signature')
          or regex.icontains(.display_text,
                             '\b(?:view|open|review|access|download|see|shared?)\b[^\n]{0,30}\b(?:document|doc|file|contract|invoice|statement|agreement|draft|attachment|folder)\b'
          )
        )
)
and any(ml.nlu_classifier(body.current_thread.text).intents,
        .name in ('cred_theft', 'bec') and .confidence != 'low'
)
and not (
  sender.email.domain.root_domain == 'evernote.com'
  and coalesce(headers.auth_summary.dmarc.pass, false)
)

Detection logic

Scope: inbound message.

Detects inbound messages containing a link whose effective destination resolves to evernote.com, where the link text uses document-sharing or e-signature language (e.g., view, open, download, review) and the sender is not from evernote.com. The message body is also classified by an NLU model as exhibiting credential theft or business email compromise intent, indicating abuse of Evernote's legitimate hosting infrastructure to deliver malicious content.

  1. inbound message
  2. any of body.current_thread.links where all hold:
    • any of:
      • .href_url.domain.root_domain is 'evernote.com'
      • .display_url.domain.root_domain is 'evernote.com'
      • any of .href_url.query_params_decoded['domain'] where:
        • . ends with 'evernote.com'
    • any of:
      • any of ml.nlu_classifier(.display_text).topics where:
        • .name is 'E-Signature'
      • .display_text matches '\\b(?:view|open|review|access|download|see|shared?)\\b[^\\n]{0,30}\\b(?:document|doc|file|contract|invoice|statement|agreement|draft|attachment|folder)\\b'
  3. any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
    • .name in ('cred_theft', 'bec')
    • .confidence is not 'low'
  4. not:
    • all of:
      • sender.email.domain.root_domain is 'evernote.com'
      • coalesce(headers.auth_summary.dmarc.pass)

Inspects: body.current_thread.links, body.current_thread.links[].display_text, body.current_thread.links[].display_url.domain.root_domain, body.current_thread.links[].href_url.domain.root_domain, body.current_thread.links[].href_url.query_params_decoded['domain'], body.current_thread.text, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.iends_with.

Indicators matched (7)

FieldMatchValue
body.current_thread.links[].href_url.domain.root_domainequalsevernote.com
body.current_thread.links[].display_url.domain.root_domainequalsevernote.com
strings.iends_withsuffixevernote.com
ml.nlu_classifier(body.current_thread.links[].display_text).topics[].nameequalsE-Signature
regex.icontainsregex\b(?:view|open|review|access|download|see|shared?)\b[^\n]{0,30}\b(?:document|doc|file|contract|invoice|statement|agreement|draft|attachment|folder)\b
ml.nlu_classifier(body.current_thread.text).intents[].namemembercred_theft
ml.nlu_classifier(body.current_thread.text).intents[].namememberbec

Stages and Predicates

Stage 1: mql_rule

and
  any(body.current_thread.links)
    and
      or
        any(body.current_thread.links.href_url.query_params_decoded['domain'])
          body.current_thread.links.href_url.query_params_decoded['domain'] ends_with "evernote.com"
        body.current_thread.links.display_url.domain.root_domain eq "evernote.com"
        body.current_thread.links.href_url.domain.root_domain eq "evernote.com"
      or
        any(ml.nlu_classifier(body.current_thread.links.display_text).topics)
          ml.nlu_classifier(body.current_thread.links.display_text).topics.name eq "E-Signature"
        body.current_thread.links.display_text regex_match "\\b(?:view|open|review|access|download|see|shared?)\\b[^\\n]{0,30}\\b(?:document|doc|file|contract|invoice|statement|agreement|draft|attachment|folder)\\b"
  not
    and
      coalesce func_call "coalesce(headers.auth_summary.dmarc.pass)"
      sender.email.domain.root_domain eq "evernote.com"
  any(ml.nlu_classifier(body.current_thread.text).intents)
    and
      ml.nlu_classifier(body.current_thread.text).intents.confidence ne "low"
      ml.nlu_classifier(body.current_thread.text).intents.name in ["bec", "cred_theft"]
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
sender.email.domain.root_domaineqevernote.comexcludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"evernote.com"

Indicators

These rows show field, operator, and value matches.

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

Service Abuse: ExactTarget with suspicious sender indicators

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

Message originates from ExactTarget infrastructure but uses a suspicious sender domain, including overly long salesforce.com domains, awsapps.com domains, domains containing UTF-8 encoding characters, or a suspicious sender display name.

Threat classification

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

CategoryValues
Attack typesCredential Phishing, BEC/Fraud
Tactics and techniquesEvasion, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • headers.domains
  • sender.email
  • type

Rule body

type.inbound
and any(headers.domains, .root_domain == 'exacttarget.com')
and (
  (
    length(sender.email.email) >= 50
    and sender.email.domain.root_domain == "salesforce.com"
  )
  or sender.email.domain.root_domain == "awsapps.com"
  or strings.icontains(sender.email.domain.domain, '?utf-8')
  or regex.icontains(sender.display_name,
                     '.*\|.*(Manager|Careers|Recruitment|Specialist|Global)'
  )
)

Detection logic

Scope: inbound message.

Message originates from ExactTarget infrastructure but uses a suspicious sender domain, including overly long salesforce.com domains, awsapps.com domains, domains containing UTF-8 encoding characters, or a suspicious sender display name.

  1. inbound message
  2. any of headers.domains where:
    • .root_domain is 'exacttarget.com'
  3. any of:
    • all of:
      • length(sender.email.email) ≥ 50
      • sender.email.domain.root_domain is 'salesforce.com'
    • sender.email.domain.root_domain is 'awsapps.com'
    • sender.email.domain.domain contains '?utf-8'
    • sender.display_name matches '.*\\|.*(Manager|Careers|Recruitment|Specialist|Global)'

Inspects: headers.domains, headers.domains[].root_domain, sender.display_name, sender.email.domain.domain, sender.email.domain.root_domain, sender.email.email, type.inbound. Sensors: regex.icontains, strings.icontains.

Indicators matched (5)

FieldMatchValue
headers.domains[].root_domainequalsexacttarget.com
sender.email.domain.root_domainequalssalesforce.com
sender.email.domain.root_domainequalsawsapps.com
strings.icontainssubstring?utf-8
regex.icontainsregex.*\|.*(Manager|Careers|Recruitment|Specialist|Global)

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      sender.email.domain.root_domain eq "salesforce.com"
      sender.email.email length_compare "50"
    sender.display_name regex_match ".*\\|.*(Manager|Careers|Recruitment|Specialist|Global)"
    sender.email.domain.domain contains "?utf-8"
    sender.email.domain.root_domain eq "awsapps.com"
  any(headers.domains)
    headers.domains.root_domain eq "exacttarget.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: FlipHTML5 with attachment deception and credential theft language

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

Detects messages that reference attachments without including any, contain links to FlipHTML5 services, and exhibit high-confidence credential theft language patterns.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesSocial engineering, Free file host, Evasion

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.links
  • type

Rule body

type.inbound
// messages contain wording to "see attached" but contains no attachments
and (
  regex.icontains(body.current_thread.text,
                  "attached|see.*attached|find.*attached|please{0,10}attached"
  )
  and length(attachments) == 0
)
// and the link goes to fliphtml5 and contains suspect "click me" language
and any(body.links, .href_url.domain.root_domain == "fliphtml5.com")
// and we have confidence its cred theft
and any(ml.nlu_classifier(body.current_thread.text).intents,
        .name == "cred_theft" and .confidence != "low"
)

Detection logic

Scope: inbound message.

Detects messages that reference attachments without including any, contain links to FlipHTML5 services, and exhibit high-confidence credential theft language patterns.

  1. inbound message
  2. all of:
    • body.current_thread.text matches 'attached|see.*attached|find.*attached|please{0,10}attached'
    • length(attachments) is 0
  3. any of body.links where:
    • .href_url.domain.root_domain is 'fliphtml5.com'
  4. any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
    • .name is 'cred_theft'
    • .confidence is not 'low'

Inspects: body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains.

Indicators matched (3)

FieldMatchValue
regex.icontainsregexattached|see.*attached|find.*attached|please{0,10}attached
body.links[].href_url.domain.root_domainequalsfliphtml5.com
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft

Stages and Predicates

Stage 1: mql_rule

and
  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 "cred_theft"
  any(body.links)
    body.links.href_url.domain.root_domain eq "fliphtml5.com"
  attachments length_compare "0"
  body.current_thread.text regex_match "attached|see.*attached|find.*attached|please{0,10}attached"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textregex_match
    • attached
    • see.*attached
    • find.*attached
    • please{0,10}attached
field:"body.current_thread.text" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service abuse: Formester with suspicious link behavior

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

Detects abuse of the Formester form service where links either redirect to credential phishing pages, contain suspicious top-level domains in the final DOM and/or redirect history, or display 'secure message' text indicating potential credential theft.

Threat classification

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

CategoryValues
Attack typesCredential Phishing, BEC/Fraud
Tactics and techniquesOpen redirect, Social engineering, Free file host

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.links
  • type

Rule body

type.inbound
// LA invokes page first before scanning additional links.
and (
  any(filter(body.links, .href_url.domain.root_domain == 'formester.com'),
      (
        ml.link_analysis(., mode="aggressive").credphish.disposition == "phishing"
      )
      // any links in the final dom lead to a suspicious tld.
      or any(ml.link_analysis(.).final_dom.links,
             .href_url.domain.tld in $suspicious_tlds
             or ml.link_analysis(.href_url).effective_url.domain.tld in $suspicious_tlds
      )

      // link redirects to a suspicious TLD.
      or any(ml.link_analysis(., mode="aggressive").redirect_history,
             .domain.tld in $suspicious_tlds
      )
      // suspicious landing verbiage. Keywords can be expanded.
      or strings.icontains(ml.link_analysis(., mode="aggressive").final_dom.display_text,
                           "secure message"
      )
      // suspicious link verbiage.
      or regex.icontains(.display_text,
                         "(view|show|download).{0,20}(Doc(ument)?(s)?|files(s)?|attached)"
      )
  )
  // suspicious keywords/phrasing in body.
  or (
    any(body.links, .href_url.domain.root_domain == 'formester.com')
    and strings.icontains(body.current_thread.text,
                          "use of Microsoft 365 and may contain content"
    )
  )
)

Detection logic

Scope: inbound message.

Detects abuse of the Formester form service where links either redirect to credential phishing pages, contain suspicious top-level domains in the final DOM and/or redirect history, or display 'secure message' text indicating potential credential theft.

  1. inbound message
  2. any of:
    • any of filter(body.links) where any holds:
      • ml.link_analysis(.).credphish.disposition is 'phishing'
      • any of ml.link_analysis(.).final_dom.links where any holds:
        • .href_url.domain.tld in $suspicious_tlds
        • ml.link_analysis(.href_url).effective_url.domain.tld in $suspicious_tlds
      • any of ml.link_analysis(., mode='aggressive').redirect_history where:
        • .domain.tld in $suspicious_tlds
      • ml.link_analysis(., mode='aggressive').final_dom.display_text contains 'secure message'
      • .display_text matches '(view|show|download).{0,20}(Doc(ument)?(s)?|files(s)?|attached)'
    • all of:
      • any of body.links where:
        • .href_url.domain.root_domain is 'formester.com'
      • body.current_thread.text contains 'use of Microsoft 365 and may contain content'

Inspects: body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, type.inbound. Sensors: ml.link_analysis, regex.icontains, strings.icontains. Reference lists: $suspicious_tlds.

Indicators matched (4)

FieldMatchValue
body.links[].href_url.domain.root_domainequalsformester.com
strings.icontainssubstringsecure message
regex.icontainsregex(view|show|download).{0,20}(Doc(ument)?(s)?|files(s)?|attached)
strings.icontainssubstringuse of Microsoft 365 and may contain content

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(filter(body.links))
      or
        any(ml.link_analysis(filter(body.links)).final_dom.links)
          or
            ml.link_analysis func_call "ml.link_analysis(ml.link_analysis(filter(body.links)[]).final_dom.links[].href_url).effective_url.domain.tld in suspicious_tlds"
             macro "ml.link_analysis(filter(body.links)[]).final_dom.links[].href_url.domain.tld in suspicious_tlds"
        any(ml.link_analysis(filter(body.links), mode='aggressive').redirect_history)
           macro "ml.link_analysis(filter(body.links)[], mode='aggressive').redirect_history[].domain.tld in suspicious_tlds"
        filter(body.links).display_text regex_match "(view|show|download).{0,20}(Doc(ument)?(s)?|files(s)?|attached)"
        ml.link_analysis func_call "ml.link_analysis(filter(body.links)[]).credphish.disposition == phishing"
        ml.link_analysis(filter(body.links)[], mode='aggressive').final_dom.display_text contains "secure message"
    and
      any(body.links)
        body.links.href_url.domain.root_domain eq "formester.com"
      body.current_thread.text contains "use of Microsoft 365 and may contain content"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: Google account notification with links to free file host

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

Detects messages impersonating Google Accounts that contain links redirecting to known file hosting services

Threat classification

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

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

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.links
  • sender.email
  • type

Rule body

type.inbound
and sender.email.email == "no-reply@accounts.google.com"
and any(body.links, .href_url.domain.domain in $free_file_hosts)

Detection logic

Scope: inbound message.

Detects messages impersonating Google Accounts that contain links redirecting to known file hosting services

  1. inbound message
  2. sender.email.email is 'no-reply@accounts.google.com'
  3. any of body.links where:
    • .href_url.domain.domain in $free_file_hosts

Inspects: body.links, body.links[].href_url.domain.domain, sender.email.email, type.inbound. Reference lists: $free_file_hosts.

Indicators matched (1)

FieldMatchValue
sender.email.emailequalsno-reply@accounts.google.com

Stages and Predicates

Stage 1: mql_rule

and
  any(body.links)
     macro "body.links[].href_url.domain.domain in free_file_hosts"
  sender.email.email eq "no-reply@accounts.google.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: Google classroom solicitation

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

Detects messages spoofing Google Classroom notifications that contain WhatsApp contact information, phone numbers, or sexually explicit content. The rule identifies emails from no-reply@classroom.google.com that include WhatsApp invitations, emojis in the subject line, or explicit sexual language, as well as phone numbers and WhatsApp references in message screenshots from first-time senders.

Threat classification

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

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

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
// 
//  Warning: This rule contains sexually explicit keywords
// 
and sender.email.email == "no-reply@classroom.google.com"
and any(regex.iextract(body.html.display_text,
                       '(?P<sender_email>(?P<sender_name>[a-zA-Z0-9._%+-]+)@(?P<sender_domain>[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}))'
        ),
        .named_groups["sender_email"] not in $sender_emails
        and .named_groups["sender_email"] not in $recipient_emails
)
and (
  // check for a WhatsApp invitation in the currend_thread
  (
    regex.icontains(body.current_thread.text, '\bWhatsapp:?.[:0-9+ ]{7,20}\b')
    or (
      strings.icontains(body.current_thread.text, "WhatsApp")
      and strings.icontains(body.current_thread.text, "invited")
    )
    // look for an emoji in the subject
    or (
      regex.icontains(subject.subject,
                      '[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]'
      )
    )
    // look for sexually explicit subject titles
    or regex.icontains(subject.subject,
                       '(?:give me|your satisfaction|sex|horny|cock|fuck|\bass\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\blust\b|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner)'
    )
  )
  // check for WhatsApp invitation within the OCR of an attachment. 
  or (
    //
    // 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
    //
    regex.icontains(beta.ocr(file.message_screenshot()).text,
                    // International format with OCR-friendly character classes
                    '\+?[ilo0-9]{1,3}[\s\.\-⋅]?\(?[ilo0-9]{3}\)?[\s\.\-⋅]{0,3}[ilo0-9]{3}[\s\.\-⋅]{0,3}[ilo0-9]{3,4}',
                    // US format
                    '\(?[ilo0-9]{3}\)?[\s\.\-⋅]{0,3}[ilo0-9]{3}[\s\.\-⋅]{0,3}[ilo0-9]{4}',
    )
    // and mentions of WhatsApp in the screenshot
    and (
      regex.icontains(beta.ocr(file.message_screenshot()).text,
                      '[Ww]hats[Aa]pp|[Ww]hatsapp'
      )
      or regex.icontains(beta.ocr(file.message_screenshot()).text, // WhatsApp-specific format
                         '[Ww]hats[Aa]pp:?[\s]*[+]?[ilo0-9\s\.\-⋅\(\)]{10,18}'
      )
    )
  )
)

Detection logic

Scope: inbound message.

Detects messages spoofing Google Classroom notifications that contain WhatsApp contact information, phone numbers, or sexually explicit content. The rule identifies emails from no-reply@classroom.google.com that include WhatsApp invitations, emojis in the subject line, or explicit sexual language, as well as phone numbers and WhatsApp references in message screenshots from first-time senders.

  1. inbound message
  2. sender.email.email is 'no-reply@classroom.google.com'
  3. any of regex.iextract(body.html.display_text) where all hold:
    • .named_groups['sender_email'] not in $sender_emails
    • .named_groups['sender_email'] not in $recipient_emails
  4. any of:
    • any of:
      • body.current_thread.text matches '\\bWhatsapp:?.[:0-9+ ]{7,20}\\b'
      • all of:
        • body.current_thread.text contains 'WhatsApp'
        • body.current_thread.text contains 'invited'
      • subject.subject matches '[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]'
      • subject.subject matches '(?:give me|your satisfaction|sex|horny|cock|fuck|\\bass\\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\\blust\\b|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner)'
    • all of:
      • beta.ocr(file.message_screenshot()).text matches any of 2 patterns
        • \+?[ilo0-9]{1,3}[\s\.\-⋅]?\(?[ilo0-9]{3}\)?[\s\.\-⋅]{0,3}[ilo0-9]{3}[\s\.\-⋅]{0,3}[ilo0-9]{3,4}
        • \(?[ilo0-9]{3}\)?[\s\.\-⋅]{0,3}[ilo0-9]{3}[\s\.\-⋅]{0,3}[ilo0-9]{4}
      • any of:
        • beta.ocr(file.message_screenshot()).text matches '[Ww]hats[Aa]pp|[Ww]hatsapp'
        • beta.ocr(file.message_screenshot()).text matches '[Ww]hats[Aa]pp:?[\\s]*[+]?[ilo0-9\\s\\.\\-⋅\\(\\)]{10,18}'

Inspects: body.current_thread.text, body.html.display_text, sender.email.email, subject.subject, type.inbound. Sensors: beta.ocr, file.message_screenshot, regex.icontains, regex.iextract, strings.icontains. Reference lists: $recipient_emails, $sender_emails.

Indicators matched (11)

FieldMatchValue
sender.email.emailequalsno-reply@classroom.google.com
regex.iextractregex(?P<sender_email>(?P<sender_name>[a-zA-Z0-9._%+-]+)@(?P<sender_domain>[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}))
regex.icontainsregex\bWhatsapp:?.[:0-9+ ]{7,20}\b
strings.icontainssubstringWhatsApp
strings.icontainssubstringinvited
regex.icontainsregex[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]
regex.icontainsregex(?:give me|your satisfaction|sex|horny|cock|fuck|\bass\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\blust\b|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner)
regex.icontainsregex\+?[ilo0-9]{1,3}[\s\.\-⋅]?\(?[ilo0-9]{3}\)?[\s\.\-⋅]{0,3}[ilo0-9]{3}[\s\.\-⋅]{0,3}[ilo0-9]{3,4}
regex.icontainsregex\(?[ilo0-9]{3}\)?[\s\.\-⋅]{0,3}[ilo0-9]{3}[\s\.\-⋅]{0,3}[ilo0-9]{4}
regex.icontainsregex[Ww]hats[Aa]pp|[Ww]hatsapp
regex.icontainsregex[Ww]hats[Aa]pp:?[\s]*[+]?[ilo0-9\s\.\-⋅\(\)]{10,18}

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      or
        beta.ocr(file.message_screenshot()).text regex_match "[Ww]hats[Aa]pp:?[\\s]*[+]?[ilo0-9\\s\\.\\-⋅\\(\\)]{10,18}"
        beta.ocr(file.message_screenshot()).text regex_match "[Ww]hats[Aa]pp|[Ww]hatsapp"
      or
        beta.ocr(file.message_screenshot()).text regex_match "\\(?[ilo0-9]{3}\\)?[\\s\\.\\-⋅]{0,3}[ilo0-9]{3}[\\s\\.\\-⋅]{0,3}[ilo0-9]{4}"
        beta.ocr(file.message_screenshot()).text regex_match "\\+?[ilo0-9]{1,3}[\\s\\.\\-⋅]?\\(?[ilo0-9]{3}\\)?[\\s\\.\\-⋅]{0,3}[ilo0-9]{3}[\\s\\.\\-⋅]{0,3}[ilo0-9]{3,4}"
    and
      body.current_thread.text contains "WhatsApp"
      body.current_thread.text contains "invited"
    body.current_thread.text regex_match "\\bWhatsapp:?.[:0-9+ ]{7,20}\\b"
    subject.subject regex_match "(?:give me|your satisfaction|sex|horny|cock|fuck|\\bass\\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\\blust\\b|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner)"
    subject.subject regex_match "[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]"
  any(regex.iextract(body.html.display_text))
    and
       macro "regex.iextract(body.html.display_text)[].named_groups['sender_email'] not in recipient_emails"
       macro "regex.iextract(body.html.display_text)[].named_groups['sender_email'] not in sender_emails"
  sender.email.email eq "no-reply@classroom.google.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
beta.ocr(file.message_screenshot()).textregex_match
  • [Ww]hats[Aa]pp:?[\s]*[+]?[ilo0-9\s.\-⋅()]{10,18}
    • [Ww]hats[Aa]pp
    • [Ww]hatsapp
  • (?[ilo0-9]{3})?[\s.\-⋅]{0,3}[ilo0-9]{3}[\s.\-⋅]{0,3}[ilo0-9]{4}
  • +?[ilo0-9]{1,3}[\s.\-⋅]?(?[ilo0-9]{3})?[\s.\-⋅]{0,3}[ilo0-9]{3}[\s.\-⋅]{0,3}[ilo0-9]{3,4}
field:"beta.ocr(file.message_screenshot()).text" kind:regex_match
body.current_thread.textcontains
  • WhatsApp
  • invited
field:"body.current_thread.text" kind:contains
body.current_thread.textregex_match
  • \bWhatsapp:?.[:0-9+ ]{7,20}\b
field:"body.current_thread.text" kind:regex_match value:"\bWhatsapp:?.[:0-9+ ]{7,20}\b"
sender.email.emaileq
  • no-reply@classroom.google.com
field:"sender.email.email" kind:eq value:"no-reply@classroom.google.com"
subject.subjectregex_match
  • (?:give me|your satisfaction|sex|horny|cock|fuck|\bass\b|pussy|dick|tits|cum|girlfriend|boyfriend|naked|porn|video|webcam|masturbate|orgasm|breasts|penis|vagina|strip|suck|blowjob|hardcore|xxx|nudes?|sexting|cheating|affair|erotic|\blust\b|desire|intimate|explicit|fetish|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|hook.?up|bed partner)
  • [\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]
field:"subject.subject" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service abuse: Google Drive share from an unsolicited reply-to address

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

Identifies messages appearing to come from Google Drive sharing notifications that contain a reply-to address not previously seen in organizational communications. This tactic exploits trust in legitimate Google services while attempting to establish unauthorized communication channels.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Callback Phishing, Credential Phishing
Tactics and techniquesFree email provider, Social engineering, Free file host

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • headers.reply_to
  • sender.email
  • type

Rule body

type.inbound
and sender.email.email in (
  'drive-shares-dm-noreply@google.com',
  'drive-shares-noreply@google.com',
)
and not any(headers.reply_to, .email.domain.domain in $org_domains)

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

// reply-to address has never sent an email to the org
and beta.profile.by_reply_to().prevalence == "new"

// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited

// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign

Detection logic

Scope: inbound message.

Identifies messages appearing to come from Google Drive sharing notifications that contain a reply-to address not previously seen in organizational communications. This tactic exploits trust in legitimate Google services while attempting to establish unauthorized communication channels.

  1. inbound message
  2. sender.email.email in ('drive-shares-dm-noreply@google.com', 'drive-shares-noreply@google.com')
  3. not:
    • any of headers.reply_to where:
      • .email.domain.domain in $org_domains
  4. beta.profile.by_reply_to().prevalence is 'new'
  5. not:
    • beta.profile.by_reply_to().solicited
  6. not:
    • beta.profile.by_reply_to().any_messages_benign

Inspects: headers.reply_to, headers.reply_to[].email.domain.domain, sender.email.email, type.inbound. Sensors: beta.profile.by_reply_to. Reference lists: $org_domains.

Indicators matched (2)

FieldMatchValue
sender.email.emailmemberdrive-shares-dm-noreply@google.com
sender.email.emailmemberdrive-shares-noreply@google.com

Stages and Predicates

Stage 1: mql_rule

and
  not
    any(headers.reply_to)
       macro "headers.reply_to[].email.domain.domain in org_domains"
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
  beta.profile.by_reply_to func_call "beta.profile.by_reply_to().prevalence == new"
  sender.email.email in ["drive-shares-dm-noreply@google.com", "drive-shares-noreply@google.com"]
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.reply_toarray_any(no value, null check)excludes:headers.reply_to

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
sender.email.emailin
  • drive-shares-dm-noreply@google.com
  • drive-shares-noreply@google.com
field:"sender.email.email" kind:in
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service abuse: Google Drive share from new reply-to domain

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

A Google Drive sharing notification containing a reply-to address from a recently registered domain (less than 30 days old). The reply-to domain does not match any organizational domains.

Threat classification

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

CategoryValues
Attack typesBEC/Fraud, Callback Phishing, Credential Phishing
Tactics and techniquesFree email provider, Social engineering, Free file host

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • headers.reply_to
  • sender.email
  • type

Rule body

type.inbound
and sender.email.email in (
  'drive-shares-dm-noreply@google.com',
  'drive-shares-noreply@google.com',
)
and not any(headers.reply_to, .email.domain.domain in $org_domains)

// the message needs to have a reply-to address
and length(headers.reply_to) > 0

// new reply-to
and any(headers.reply_to, network.whois(.email.domain).days_old < 30)

Detection logic

Scope: inbound message.

A Google Drive sharing notification containing a reply-to address from a recently registered domain (less than 30 days old). The reply-to domain does not match any organizational domains.

  1. inbound message
  2. sender.email.email in ('drive-shares-dm-noreply@google.com', 'drive-shares-noreply@google.com')
  3. not:
    • any of headers.reply_to where:
      • .email.domain.domain in $org_domains
  4. length(headers.reply_to) > 0
  5. any of headers.reply_to where:
    • network.whois(.email.domain).days_old < 30

Inspects: headers.reply_to, headers.reply_to[].email.domain, headers.reply_to[].email.domain.domain, sender.email.email, type.inbound. Sensors: network.whois. Reference lists: $org_domains.

Indicators matched (2)

FieldMatchValue
sender.email.emailmemberdrive-shares-dm-noreply@google.com
sender.email.emailmemberdrive-shares-noreply@google.com

Stages and Predicates

Stage 1: mql_rule

and
  not
    any(headers.reply_to)
       macro "headers.reply_to[].email.domain.domain in org_domains"
  any(headers.reply_to)
    network.whois func_call "network.whois(headers.reply_to[].email.domain).days_old < 30"
  headers.reply_to length_compare "0"
  sender.email.email in ["drive-shares-dm-noreply@google.com", "drive-shares-noreply@google.com"]
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.reply_toarray_any(no value, null check)excludes:headers.reply_to

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
sender.email.emailin
  • drive-shares-dm-noreply@google.com
  • drive-shares-noreply@google.com
field:"sender.email.email" kind:in
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service abuse: Google Firebase sender address with suspicious content

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

Detects messages from Firebase hosted domains that contain suspicious indicators such as emojis, spam keywords, unusual link patterns, or freemail registrant information.

Threat classification

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

CategoryValues
Attack typesSpam, Credential Phishing
Tactics and techniquesFree subdomain host, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.html
  • body.links
  • body.plain
  • headers
  • headers.reply_to
  • sender.email
  • subject
  • type

Rule body

type.inbound
and sender.email.domain.root_domain == "firebaseapp.com"
and length(body.links) != 0
and 1 of (
  // has an emoji in the subject or body
  regex.contains(body.plain.raw,
                 '[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]'
  ),
  regex.contains(subject.subject,
                 '[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]'
  ),
  // spammy keywords
  strings.ilike(body.current_thread.text,
                "*congrat*",
                "*win*",
                "*expired*",
                "*subscription*",
                "*won*",
                "*gift*",
                "*CARTE CADEAU*",
                "*Votre chance*",
                "*survey*",
                "*livraison*",
                "*delivery*",
                "*package*",
                "*claim*",
                "*reward*",
  ),
  // entire body is an image with a link
  length(body.current_thread.text) == 0
  and length(body.links) == 1,
  // HTML body starts with a link
  strings.istarts_with(body.html.raw, '<a href='),
  // known spammy HTML elements
  any(html.xpath(body.html, '//*/@class').nodes,
      strings.icontains(.raw, 'eb-drag-and-drop-builder')
  ),
  // multiple links that are identical
  length(body.links) > 1
  and length(distinct(body.links, .href_url.url)) == 1,
  // body link whois email is a freemail
  any(body.links,
      strings.parse_email(network.whois(.href_url.domain).registrant_email).domain.root_domain in $free_email_providers
      or strings.parse_email(network.whois(.href_url.domain).administrative_email
      ).domain.root_domain in $free_email_providers
      or strings.parse_email(network.whois(.href_url.domain).technical_email).domain.root_domain in $free_email_providers
  ),
  // all links utilize a url shortener
  all(body.links, .href_url.domain.root_domain in $url_shorteners),
  // freemail reply-to
  any(headers.reply_to, .email.domain.root_domain in $free_email_providers),
  // link with display text, but no tracking info (unusual for legitimate marketing)
  any(body.links, .display_text is not null and .href_url.path is null),
  // presence of Javascript inside of the message
  regex.contains(body.html.raw, '<script[\s>]')
)

Detection logic

Scope: inbound message.

Detects messages from Firebase hosted domains that contain suspicious indicators such as emojis, spam keywords, unusual link patterns, or freemail registrant information.

  1. inbound message
  2. sender.email.domain.root_domain is 'firebaseapp.com'
  3. length(body.links) is not 0
  4. at least 1 of:
    • body.plain.raw matches '[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]'
    • subject.subject matches '[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]'
    • body.current_thread.text matches any of 14 patterns
      • *congrat*
      • *win*
      • *expired*
      • *subscription*
      • *won*
      • *gift*
      • *CARTE CADEAU*
      • *Votre chance*
      • *survey*
      • *livraison*
      • *delivery*
      • *package*
      • *claim*
      • *reward*
    • all of:
      • length(body.current_thread.text) is 0
      • length(body.links) is 1
    • body.html.raw starts with '<a href='
    • any of html.xpath(body.html, '//*/@class').nodes where:
      • .raw contains 'eb-drag-and-drop-builder'
    • all of:
      • length(body.links) > 1
      • length(distinct(body.links, .href_url.url)) is 1
    • any of body.links where any holds:
      • strings.parse_email(network.whois(.href_url.domain).registrant_email).domain.root_domain in $free_email_providers
      • strings.parse_email(network.whois(.href_url.domain).administrative_email).domain.root_domain in $free_email_providers
      • strings.parse_email(network.whois(.href_url.domain).technical_email).domain.root_domain in $free_email_providers
    • all of body.links where:
      • .href_url.domain.root_domain in $url_shorteners
    • any of headers.reply_to where:
      • .email.domain.root_domain in $free_email_providers
    • any of body.links where all hold:
      • .display_text is set
      • .href_url.path is missing
    • body.html.raw matches '<script[\\s>]'

Inspects: body.current_thread.text, body.html, body.html.raw, body.links, body.links[].display_text, body.links[].href_url.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.links[].href_url.url, body.plain.raw, headers.reply_to, headers.reply_to[].email.domain.root_domain, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: html.xpath, network.whois, regex.contains, strings.icontains, strings.ilike, strings.istarts_with, strings.parse_email. Reference lists: $free_email_providers, $url_shorteners.

Indicators matched (19)

FieldMatchValue
sender.email.domain.root_domainequalsfirebaseapp.com
regex.containsregex[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]
strings.ilikesubstring*congrat*
strings.ilikesubstring*win*
strings.ilikesubstring*expired*
strings.ilikesubstring*subscription*
strings.ilikesubstring*won*
strings.ilikesubstring*gift*
strings.ilikesubstring*CARTE CADEAU*
strings.ilikesubstring*Votre chance*
strings.ilikesubstring*survey*
strings.ilikesubstring*livraison*
7 more
strings.ilikesubstring*delivery*
strings.ilikesubstring*package*
strings.ilikesubstring*claim*
strings.ilikesubstring*reward*
strings.istarts_withprefix<a href=
strings.icontainssubstringeb-drag-and-drop-builder
regex.containsregex<script[\s>]

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(body.links)
      and
        body.links.display_text is_not_null
        body.links.href_url.path is_null
    any(body.links)
      or
        strings.parse_email func_call "strings.parse_email(network.whois(body.links[].href_url.domain).administrative_email).domain.root_domain in free_email_providers"
        strings.parse_email func_call "strings.parse_email(network.whois(body.links[].href_url.domain).registrant_email).domain.root_domain in free_email_providers"
        strings.parse_email func_call "strings.parse_email(network.whois(body.links[].href_url.domain).technical_email).domain.root_domain in free_email_providers"
    and
      body.current_thread.text length_compare "0"
      body.links length_compare "1"
    and
      body.links length_compare "1"
      distinct(body.links, .href_url.url) length_compare "1"
    any(html.xpath(body.html, '//*/@class').nodes)
      html.xpath(body.html, '//*/@class').nodes.raw contains "eb-drag-and-drop-builder"
    any(headers.reply_to)
       macro "headers.reply_to[].email.domain.root_domain in free_email_providers"
    body.current_thread.text match "CARTE CADEAU"
    body.current_thread.text match "Votre chance"
    body.current_thread.text match "claim"
    body.current_thread.text match "congrat"
    body.current_thread.text match "delivery"
    body.current_thread.text match "expired"
    body.current_thread.text match "gift"
    body.current_thread.text match "livraison"
    body.current_thread.text match "package"
    body.current_thread.text match "reward"
    body.current_thread.text match "subscription"
    body.current_thread.text match "survey"
    body.current_thread.text match "win"
    body.current_thread.text match "won"
    body.html.raw regex_match "<script[\\s>]"
    body.html.raw starts_with "<a href="
    body.plain.raw regex_match "[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]"
    subject.subject regex_match "[\\x{1F300}-\\x{1F5FF}\\x{1F600}-\\x{1F64F}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F900}-\\x{1F9FF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}\\x{2300}-\\x{23FF}]"
     macro "all(body.links)"
  body.links length_compare "0"
  sender.email.domain.root_domain eq "firebaseapp.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textwildcard
  • *CARTE CADEAU*
  • *Votre chance*
  • *claim*
  • *congrat*
  • *delivery*
  • *expired*
  • *gift*
  • *livraison*
  • *package*
  • *reward*
  • *subscription*
  • *survey*
  • *win*
  • *won*
field:"body.current_thread.text" kind:wildcard
body.html.rawregex_match
  • <script[\s>]
field:"body.html.raw" kind:regex_match value:"<script[\s>]"
body.html.rawstarts_with
  • <a href=
field:"body.html.raw" kind:starts_with value:"<a href="
body.plain.rawregex_match
  • [\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]
field:"body.plain.raw" kind:regex_match value:"[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]"
sender.email.domain.root_domaineq
  • firebaseapp.com
field:"sender.email.domain.root_domain" kind:eq value:"firebaseapp.com"
subject.subjectregex_match
  • [\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]
field:"subject.subject" kind:regex_match value:"[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F900}-\x{1F9FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{2300}-\x{23FF}]"
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service abuse: HelloSign from an unsolicited sender address

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

Detects messages from HelloSign in which the document originates from a newly observed email address. The email address is extracted from across multiple message components, including HTML body templates and email header fields.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesSocial engineering, Free file host, Evasion

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and sender.email.domain.domain == "mail.hellosign.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and (
  // extract the sender out of the body html template
  (
    // if the sender_email is available in the body
    regex.icontains(body.html.raw,
                    '<th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\)]+)\).*?</th>'
    )
    // check that the sender email has not been observed previously
    and all(regex.iextract(body.html.raw,
                           '<th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\).*?</th>'
            ),
            .named_groups["sender_domain"] not in $org_domains
            and .named_groups["sender_email"] not in $recipient_emails
            and .named_groups["sender_email"] not in $sender_emails
            and not (
              .named_groups["sender_domain"] not in $free_email_providers
              and .named_groups["sender_domain"] in $recipient_domains
              and .named_groups["sender_domain"] in $sender_domains
            )
    )
  )

  // extract the sender out of header hops if it's there
  or any(headers.hops,
         any(.fields,
             .name == "X-Mailgun-Variables"
             and strings.icontains(.value, 'on_behalf_of_email')
             and all(regex.iextract(.value,
                                    '\"on_behalf_of_email": \"(?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\",'
                     ),
                     .named_groups["sender_domain"] not in $org_domains
                     and .named_groups["sender_email"] not in $recipient_emails
                     and .named_groups["sender_email"] not in $sender_emails
                     and not (
                       .named_groups["sender_domain"] not in $free_email_providers
                       and .named_groups["sender_domain"] in $recipient_domains
                       and .named_groups["sender_domain"] in $sender_domains
                     )
             )
         )
  )

  // extract the sender from the "reply to sender" element withn the body.html.raw
  or (
    regex.icontains(body.html.raw,
                    '<a href="mailto:[^\?]+\?[^\"]+\"[^\>]+\>(?:<img[^\>]+\>)?\s*Reply to sender<\/a>'
    )
    and all(regex.iextract(body.html.raw,
                           '<a href="mailto:(?P<sender_email>[^\?]+@(?P<sender_domain>[^\?]+))\?[^\"]+\"[^\>]+\>(?:<img[^\>]+\>)?\s*Reply to sender<\/a>'
            ),
            .named_groups["sender_domain"] not in $org_domains
            and .named_groups["sender_email"] not in $recipient_emails
            and .named_groups["sender_email"] not in $sender_emails
            and not (
              .named_groups["sender_domain"] not in $free_email_providers
              and .named_groups["sender_domain"] in $recipient_domains
              and .named_groups["sender_domain"] in $sender_domains
            )
    )
  )
)

Detection logic

Scope: inbound message.

Detects messages from HelloSign in which the document originates from a newly observed email address. The email address is extracted from across multiple message components, including HTML body templates and email header fields.

  1. inbound message
  2. sender.email.domain.domain is 'mail.hellosign.com'
  3. headers.auth_summary.spf.pass
  4. headers.auth_summary.dmarc.pass
  5. any of:
    • all of:
      • body.html.raw matches '<th class="action-item--action[^\\>]+\\>\\s*[^\\<]*\\((?P<sender_email>[^\\)]+)\\).*?</th>'
      • all of regex.iextract(body.html.raw) where all hold:
        • .named_groups['sender_domain'] not in $org_domains
        • .named_groups['sender_email'] not in $recipient_emails
        • .named_groups['sender_email'] not in $sender_emails
        • not:
          • all of:
            • .named_groups['sender_domain'] not in $free_email_providers
            • .named_groups['sender_domain'] in $recipient_domains
            • .named_groups['sender_domain'] in $sender_domains
    • any of headers.hops where:
      • any of .fields where all hold:
        • .name is 'X-Mailgun-Variables'
        • .value contains 'on_behalf_of_email'
        • all of regex.iextract(.value) where all hold:
          • .named_groups['sender_domain'] not in $org_domains
          • .named_groups['sender_email'] not in $recipient_emails
          • .named_groups['sender_email'] not in $sender_emails
          • not:
            • all of:
              • .named_groups['sender_domain'] not in $free_email_providers
              • .named_groups['sender_domain'] in $recipient_domains
              • .named_groups['sender_domain'] in $sender_domains
    • all of:
      • body.html.raw matches '<a href="mailto:[^\\?]+\\?[^\\"]+\\"[^\\>]+\\>(?:<img[^\\>]+\\>)?\\s*Reply to sender<\\/a>'
      • all of regex.iextract(body.html.raw) where all hold:
        • .named_groups['sender_domain'] not in $org_domains
        • .named_groups['sender_email'] not in $recipient_emails
        • .named_groups['sender_email'] not in $sender_emails
        • not:
          • all of:
            • .named_groups['sender_domain'] not in $free_email_providers
            • .named_groups['sender_domain'] in $recipient_domains
            • .named_groups['sender_domain'] in $sender_domains

Inspects: body.html.raw, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, sender.email.domain.domain, type.inbound. Sensors: regex.icontains, regex.iextract, strings.icontains. Reference lists: $free_email_providers, $org_domains, $recipient_domains, $recipient_emails, $sender_domains, $sender_emails.

Indicators matched (8)

FieldMatchValue
sender.email.domain.domainequalsmail.hellosign.com
regex.icontainsregex<th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\)]+)\).*?</th>
regex.iextractregex<th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\).*?</th>
headers.hops[].fields[].nameequalsX-Mailgun-Variables
strings.icontainssubstringon_behalf_of_email
regex.iextractregex\"on_behalf_of_email": \"(?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\",
regex.icontainsregex<a href="mailto:[^\?]+\?[^\"]+\"[^\>]+\>(?:<img[^\>]+\>)?\s*Reply to sender<\/a>
regex.iextractregex<a href="mailto:(?P<sender_email>[^\?]+@(?P<sender_domain>[^\?]+))\?[^\"]+\"[^\>]+\>(?:<img[^\>]+\>)?\s*Reply to sender<\/a>

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(headers.hops)
      any(headers.hops.fields)
        and
          headers.hops.fields[].name eq "X-Mailgun-Variables"
          headers.hops.fields[].value contains "on_behalf_of_email"
           macro "all(regex.iextract(headers.hops[].fields[].value))"
    and
      body.html.raw regex_match "<a href=\"mailto:[^\\?]+\\?[^\\\"]+\\\"[^\\>]+\\>(?:<img[^\\>]+\\>)?\\s*Reply to sender<\\/a>"
       macro "all(regex.iextract(body.html.raw))"
    and
      body.html.raw regex_match "<th class=\"action-item--action[^\\>]+\\>\\s*[^\\<]*\\((?P<sender_email>[^\\)]+)\\).*?</th>"
       macro "all(regex.iextract(body.html.raw))"
  headers.auth_summary.dmarc.pass eq "true"
  headers.auth_summary.spf.pass eq "true"
  sender.email.domain.domain eq "mail.hellosign.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.html.rawregex_match
  • <a href="mailto:[^?]+?[^\"]+\"[^\>]+\>(?:<img[^\>]+\>)?\s*Reply to sender<\/a>
  • <th class="action-item--action[^\>]+\>\s*[^\<]*((?P<sender_email>[^)]+)).*?</th>
field:"body.html.raw" kind:regex_match
headers.auth_summary.dmarc.passeq
  • true transforms: boolean
field:"headers.auth_summary.dmarc.pass" kind:eq value:"true"
headers.auth_summary.spf.passeq
  • true transforms: boolean
field:"headers.auth_summary.spf.pass" kind:eq value:"true"
sender.email.domain.domaineq
  • mail.hellosign.com
field:"sender.email.domain.domain" kind:eq value:"mail.hellosign.com"
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service Abuse: HelloSign share with suspicious sender or document name

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

The detection rule is designed to identify messages sent from HelloSign that notify recipients about a shared file and contain suspicious content either in the document or the sender's display name.

Threat classification

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

CategoryValues
Attack typesCallback Phishing, BEC/Fraud
Tactics and techniquesEvasion, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound

// Legitimate Dropbox sending infrastructure
and sender.email.email == "noreply@mail.hellosign.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and (
  strings.icontains(subject.subject, ' - Signature Requested')
  or (
    strings.icontains(subject.subject, 'Reminder: ')
    and strings.icontains(subject.subject, 'awaiting your signature')
  )
)
and not strings.icontains(subject.subject, 'You just signed')
// negate CDP Esign which reuses hellosign
and not strings.contains(body.current_thread.text, '@cdpesign.com')
// negate messages where the "on_behalf_of_email" is within the org_domains
and not any(headers.hops,
            any(.fields,
                .name == "X-Mailgun-Variables"
                and strings.icontains(.value, 'on_behalf_of_email')
                and all(regex.iextract(.value,
                                       '\"on_behalf_of_email": \"(?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\",'
                        ),
                        .named_groups["sender_domain"] in $org_domains
                )
            )
)
// sometimes there isn't an on_behalf_of_email, so in those cases we can use the body to extract the sender
and not (
  regex.icontains(body.html.raw,
                  '<th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\)]+)\).*?</th>'
  )
  // check that the sender email has not been observed previously
  and all(regex.iextract(body.html.raw,
                         '<th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\).*?</th>'
          ),
          .named_groups["sender_domain"] in $org_domains
  )
)
and (
  // contains the word dropbox
  // the subject is in the format of "<actor controlled title>(?: - Signature Requested by| is awaiting your signature) <actor controlled name>"
  (
    strings.icontains(subject.subject, 'dropbox')
    // negate where the sender is dropbox
    and not any(headers.hops,
                any(.fields,
                    .name == "X-Mailgun-Variables"
                    and regex.contains(.value,
                                       '\"on_behalf_of_email": \"[^\"]+@dropbox.com\"'
                    )
                )
    )
  )
  or strings.icontains(subject.subject, 'sharefile')
  or strings.icontains(subject.subject, 'helloshare')

  // sender names part of the subject
  or (
    // Signature Terms in the Sender Display Name
    strings.icontains(sender.display_name, 'Signature Requ')
    // Billing Accounting
    or regex.icontains(sender.display_name,
                       'Accounts? (?:Payable|Receivable)',
    )
    or strings.icontains(sender.display_name, 'Billing Support')

    // HR/Payroll/Legal/etc
    or strings.icontains(sender.display_name, 'Compliance HR')
    or regex.icontains(sender.display_name,
                       '(?:Compliance|Executive|\bHR\b|Human Resources|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Support).*(?:Department|Dept|Team|Desk)?'
    )
    or strings.icontains(sender.display_name, 'Corporate Communications')
    or strings.icontains(sender.display_name, 'Employee Relations')
    or strings.icontains(sender.display_name, 'Office Manager')
    or strings.icontains(sender.display_name, 'Risk Management')
    or regex.icontains(sender.display_name, 'Payroll Admin(?:istrator)?')

    // IT related
    or regex.icontains(sender.display_name,
                       'IT Support',
                       'Information Technology',
                       '(?:Network|System) Admin(?:istrator)?',
                       'Help Desk',
                       'Tech(?:nical) Support'
    )
  )

  // NLU/Logo Detection on message from the sender/message body 
  or any(html.xpath(body.html,
                    '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th'
         ).nodes,
         any(ml.nlu_classifier(.display_text).intents,
             .name == "callback_scam" and .confidence == "high"
         )
  )
  // callback logos
  or any(ml.logo_detect(file.message_screenshot()).brands,
         .name in ("PayPal", "Norton", "GeekSquad", "Ebay", "McAfee", "AT&T")
  )

  // filename analysis
  // the filename is also contianed in the subject line
  or (
    // scanner themed
    regex.icontains(subject.subject,
                    'scanne[rd].*(?: - Signature Requested by| is awaiting your signature)'
    )
    // image theme
    or regex.icontains(subject.subject,
                       '_IMG_.*(?: - Signature Requested by| is awaiting your signature)',
                       'IMG[_-](?:\d|\W)+.*(?: - Signature Requested by| is awaiting your signature)'
    )
    // Invoice Themes
    or regex.icontains(subject.subject,
                       '(?:INV\b|\bACH\b|Wire Confirmation|\bP[O0]\W+?\d+\"|\bP[O0](?:\W+?|\d+)|Purchase Order|Past Due|Remit(?:tance)?).*(?: - Signature Requested by| is awaiting your signature)'
    )
    // Payment Themes
    or regex.icontains(subject.subject,
                       '(?:payment.*(?:complete|confirmation|approved|recent|processing)|(complete|confirmation|approved|recent|processing).*payment).*(?: - Signature Requested by| is awaiting your signature)'
    )

    // Payroll/HR
    or regex.icontains(subject.subject,
                       '(?:Payroll|Employee Pay\b|Salary|Benefit Enrollment|Payment.*Benefit|Benefit.*Update|Employee Handbook|Reimbursement Approved).*(?: - Signature Requested by| is awaiting your signature)'
    )

    // shared files/extenstion/urgency/CTA
    or regex.icontains(subject.subject,
                       '(?:Urgent|Important|Immediate|Secure|Encrypt|shared|\bsent\b|protected|Validate|Final Notice|Review(?:and |& )?Sign|Download PDF).*(?: - Signature Requested by| is awaiting your signature)'
    )

    // MFA theme
    or regex.icontains(subject.subject,
                       '(?:Verification Code|\bMFA\b).*(?: - Signature Requested by| is awaiting your signature)'
    )
  )
)

Detection logic

Scope: inbound message.

The detection rule is designed to identify messages sent from HelloSign that notify recipients about a shared file and contain suspicious content either in the document or the sender's display name.

  1. inbound message
  2. sender.email.email is 'noreply@mail.hellosign.com'
  3. headers.auth_summary.spf.pass
  4. headers.auth_summary.dmarc.pass
  5. any of:
    • subject.subject contains ' - Signature Requested'
    • all of:
      • subject.subject contains 'Reminder: '
      • subject.subject contains 'awaiting your signature'
  6. not:
    • subject.subject contains 'You just signed'
  7. not:
    • body.current_thread.text contains '@cdpesign.com'
  8. not:
    • any of headers.hops where:
      • any of .fields where all hold:
        • .name is 'X-Mailgun-Variables'
        • .value contains 'on_behalf_of_email'
        • all of regex.iextract(.value) where:
          • .named_groups['sender_domain'] in $org_domains
  9. not:
    • all of:
      • body.html.raw matches '<th class="action-item--action[^\\>]+\\>\\s*[^\\<]*\\((?P<sender_email>[^\\)]+)\\).*?</th>'
      • all of regex.iextract(body.html.raw) where:
        • .named_groups['sender_domain'] in $org_domains
  10. any of:
    • all of:
      • subject.subject contains 'dropbox'
      • not:
        • any of headers.hops where:
          • any of .fields where all hold:
            • .name is 'X-Mailgun-Variables'
            • .value matches '\\"on_behalf_of_email": \\"[^\\"]+@dropbox.com\\"'
    • subject.subject contains 'sharefile'
    • subject.subject contains 'helloshare'
    • any of:
      • sender.display_name contains 'Signature Requ'
      • sender.display_name matches 'Accounts? (?:Payable|Receivable)'
      • sender.display_name contains 'Billing Support'
      • sender.display_name contains 'Compliance HR'
      • sender.display_name matches '(?:Compliance|Executive|\\bHR\\b|Human Resources|\\bHR\\b|\\bIT\\b|Legal|Payroll|Purchasing|Operations|Security|Support).*(?:Department|Dept|Team|Desk)?'
      • sender.display_name contains 'Corporate Communications'
      • sender.display_name contains 'Employee Relations'
      • sender.display_name contains 'Office Manager'
      • sender.display_name contains 'Risk Management'
      • sender.display_name matches 'Payroll Admin(?:istrator)?'
      • sender.display_name matches any of 5 patterns
        • IT Support
        • Information Technology
        • (?:Network|System) Admin(?:istrator)?
        • Help Desk
        • Tech(?:nical) Support
    • any of html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes where:
      • any of ml.nlu_classifier(.display_text).intents where all hold:
        • .name is 'callback_scam'
        • .confidence is 'high'
    • any of ml.logo_detect(file.message_screenshot()).brands where:
      • .name in ('PayPal', 'Norton', 'GeekSquad', 'Ebay', 'McAfee', 'AT&T')
    • subject.subject matches any of 8 patterns
      • scanne[rd].*(?: - Signature Requested by| is awaiting your signature)
      • _IMG_.*(?: - Signature Requested by| is awaiting your signature)
      • IMG[_-](?:\d|\W)+.*(?: - Signature Requested by| is awaiting your signature)
      • (?:INV\b|\bACH\b|Wire Confirmation|\bP[O0]\W+?\d+\"|\bP[O0](?:\W+?|\d+)|Purchase Order|Past Due|Remit(?:tance)?).*(?: - Signature Requested by| is awaiting your signature)
      • (?:payment.*(?:complete|confirmation|approved|recent|processing)|(complete|confirmation|approved|recent|processing).*payment).*(?: - Signature Requested by| is awaiting your signature)
      • (?:Payroll|Employee Pay\b|Salary|Benefit Enrollment|Payment.*Benefit|Benefit.*Update|Employee Handbook|Reimbursement Approved).*(?: - Signature Requested by| is awaiting your signature)
      • (?:Urgent|Important|Immediate|Secure|Encrypt|shared|\bsent\b|protected|Validate|Final Notice|Review(?:and |& )?Sign|Download PDF).*(?: - Signature Requested by| is awaiting your signature)
      • (?:Verification Code|\bMFA\b).*(?: - Signature Requested by| is awaiting your signature)

Inspects: body.current_thread.text, body.html, body.html.raw, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, sender.display_name, sender.email.email, subject.subject, type.inbound. Sensors: file.message_screenshot, html.xpath, ml.logo_detect, ml.nlu_classifier, regex.contains, regex.icontains, regex.iextract, strings.contains, strings.icontains. Reference lists: $org_domains.

Indicators matched (38)

FieldMatchValue
sender.email.emailequalsnoreply@mail.hellosign.com
strings.icontainssubstring - Signature Requested
strings.icontainssubstringReminder:
strings.icontainssubstringawaiting your signature
strings.icontainssubstringdropbox
strings.icontainssubstringsharefile
strings.icontainssubstringhelloshare
strings.icontainssubstringSignature Requ
regex.icontainsregexAccounts? (?:Payable|Receivable)
strings.icontainssubstringBilling Support
strings.icontainssubstringCompliance HR
regex.icontainsregex(?:Compliance|Executive|\bHR\b|Human Resources|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Support).*(?:Department|Dept|Team|Desk)?
26 more
strings.icontainssubstringCorporate Communications
strings.icontainssubstringEmployee Relations
strings.icontainssubstringOffice Manager
strings.icontainssubstringRisk Management
regex.icontainsregexPayroll Admin(?:istrator)?
regex.icontainsregexIT Support
regex.icontainsregexInformation Technology
regex.icontainsregex(?:Network|System) Admin(?:istrator)?
regex.icontainsregexHelp Desk
regex.icontainsregexTech(?:nical) Support
ml.nlu_classifier(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes[].display_text).intents[].nameequalscallback_scam
ml.nlu_classifier(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes[].display_text).intents[].confidenceequalshigh
ml.logo_detect(file.message_screenshot()).brands[].namememberPayPal
ml.logo_detect(file.message_screenshot()).brands[].namememberNorton
ml.logo_detect(file.message_screenshot()).brands[].namememberGeekSquad
ml.logo_detect(file.message_screenshot()).brands[].namememberEbay
ml.logo_detect(file.message_screenshot()).brands[].namememberMcAfee
ml.logo_detect(file.message_screenshot()).brands[].namememberAT&T
regex.icontainsregexscanne[rd].*(?: - Signature Requested by| is awaiting your signature)
regex.icontainsregex_IMG_.*(?: - Signature Requested by| is awaiting your signature)
regex.icontainsregexIMG[_-](?:\d|\W)+.*(?: - Signature Requested by| is awaiting your signature)
regex.icontainsregex(?:INV\b|\bACH\b|Wire Confirmation|\bP[O0]\W+?\d+\"|\bP[O0](?:\W+?|\d+)|Purchase Order|Past Due|Remit(?:tance)?).*(?: - Signature Requested by| is awaiting your signature)
regex.icontainsregex(?:payment.*(?:complete|confirmation|approved|recent|processing)|(complete|confirmation|approved|recent|processing).*payment).*(?: - Signature Requested by| is awaiting your signature)
regex.icontainsregex(?:Payroll|Employee Pay\b|Salary|Benefit Enrollment|Payment.*Benefit|Benefit.*Update|Employee Handbook|Reimbursement Approved).*(?: - Signature Requested by| is awaiting your signature)
regex.icontainsregex(?:Urgent|Important|Immediate|Secure|Encrypt|shared|\bsent\b|protected|Validate|Final Notice|Review(?:and |& )?Sign|Download PDF).*(?: - Signature Requested by| is awaiting your signature)
regex.icontainsregex(?:Verification Code|\bMFA\b).*(?: - Signature Requested by| is awaiting your signature)

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      not
        any(headers.hops)
          any(headers.hops.fields)
            and
              headers.hops.fields[].name eq "X-Mailgun-Variables"
              headers.hops.fields[].value regex_match "\\\"on_behalf_of_email\": \\\"[^\\\"]+@dropbox.com\\\""
      subject.subject contains "dropbox"
    any(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes)
      any(ml.nlu_classifier(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes.display_text).intents)
        and
          ml.nlu_classifier(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes[].display_text).intents[].confidence eq "high"
          ml.nlu_classifier(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes[].display_text).intents[].name eq "callback_scam"
    any(ml.logo_detect(file.message_screenshot()).brands)
      ml.logo_detect(file.message_screenshot()).brands.name in ["AT&T", "Ebay", "GeekSquad", "McAfee", "Norton", "PayPal"]
    sender.display_name contains "Billing Support"
    sender.display_name contains "Compliance HR"
    sender.display_name contains "Corporate Communications"
    sender.display_name contains "Employee Relations"
    sender.display_name contains "Office Manager"
    sender.display_name contains "Risk Management"
    sender.display_name contains "Signature Requ"
    sender.display_name regex_match "(?:Compliance|Executive|\\bHR\\b|Human Resources|\\bHR\\b|\\bIT\\b|Legal|Payroll|Purchasing|Operations|Security|Support).*(?:Department|Dept|Team|Desk)?"
    sender.display_name regex_match "(?:Network|System) Admin(?:istrator)?"
    sender.display_name regex_match "Accounts? (?:Payable|Receivable)"
    sender.display_name regex_match "Help Desk"
    sender.display_name regex_match "IT Support"
    sender.display_name regex_match "Information Technology"
    sender.display_name regex_match "Payroll Admin(?:istrator)?"
    sender.display_name regex_match "Tech(?:nical) Support"
    subject.subject contains "helloshare"
    subject.subject contains "sharefile"
    subject.subject regex_match "(?:INV\\b|\\bACH\\b|Wire Confirmation|\\bP[O0]\\W+?\\d+\\\"|\\bP[O0](?:\\W+?|\\d+)|Purchase Order|Past Due|Remit(?:tance)?).*(?: - Signature Requested by| is awaiting your signature)"
    subject.subject regex_match "(?:Payroll|Employee Pay\\b|Salary|Benefit Enrollment|Payment.*Benefit|Benefit.*Update|Employee Handbook|Reimbursement Approved).*(?: - Signature Requested by| is awaiting your signature)"
    subject.subject regex_match "(?:Urgent|Important|Immediate|Secure|Encrypt|shared|\\bsent\\b|protected|Validate|Final Notice|Review(?:and |& )?Sign|Download PDF).*(?: - Signature Requested by| is awaiting your signature)"
    subject.subject regex_match "(?:Verification Code|\\bMFA\\b).*(?: - Signature Requested by| is awaiting your signature)"
    subject.subject regex_match "(?:payment.*(?:complete|confirmation|approved|recent|processing)|(complete|confirmation|approved|recent|processing).*payment).*(?: - Signature Requested by| is awaiting your signature)"
    subject.subject regex_match "IMG[_-](?:\\d|\\W)+.*(?: - Signature Requested by| is awaiting your signature)"
    subject.subject regex_match "_IMG_.*(?: - Signature Requested by| is awaiting your signature)"
    subject.subject regex_match "scanne[rd].*(?: - Signature Requested by| is awaiting your signature)"
  not
    any(headers.hops)
      any(headers.hops.fields)
        and
          headers.hops.fields[].name eq "X-Mailgun-Variables"
          headers.hops.fields[].value contains "on_behalf_of_email"
           macro "all(regex.iextract(headers.hops[].fields[].value))"
  not
    and
      body.html.raw regex_match "<th class=\"action-item--action[^\\>]+\\>\\s*[^\\<]*\\((?P<sender_email>[^\\)]+)\\).*?</th>"
       macro "all(regex.iextract(body.html.raw))"
  or
    and
      subject.subject contains "Reminder: "
      subject.subject contains "awaiting your signature"
    subject.subject contains " - Signature Requested"
  not
    body.current_thread.text contains "@cdpesign.com"
  not
    subject.subject contains "You just signed"
  headers.auth_summary.dmarc.pass eq "true"
  headers.auth_summary.spf.pass eq "true"
  sender.email.email eq "noreply@mail.hellosign.com"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
headers.hopsarray_any(no value, null check)excludes:headers.hops
body.html.rawregex_match<th class="action-item--action[^\>]+\>\s*[^\<]*((?P<sender_email>[^)]+)).*?</th>excludes:body.html.raw
body.current_thread.textcontains@cdpesign.comexcludes:body.current_thread.text field:"body.current_thread.text" value:"@cdpesign.com"
subject.subjectcontainsYou just signedexcludes:subject.subject field:"subject.subject" value:"You just signed"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
headers.auth_summary.dmarc.passeq
  • true transforms: boolean
field:"headers.auth_summary.dmarc.pass" kind:eq value:"true"
headers.auth_summary.spf.passeq
  • true transforms: boolean
field:"headers.auth_summary.spf.pass" kind:eq value:"true"
sender.display_namecontains
  • Billing Support
  • Compliance HR
  • Corporate Communications
  • Employee Relations
  • Office Manager
  • Risk Management
  • Signature Requ
field:"sender.display_name" kind:contains
sender.display_nameregex_match
  • (?:Compliance|Executive|\bHR\b|Human Resources|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Support).*(?:Department|Dept|Team|Desk)?
  • (?:Network|System) Admin(?:istrator)?
  • Accounts? (?:Payable|Receivable)
  • Help Desk
  • IT Support
  • Information Technology
  • Payroll Admin(?:istrator)?
  • Tech(?:nical) Support
field:"sender.display_name" kind:regex_match
sender.email.emaileq
  • noreply@mail.hellosign.com
field:"sender.email.email" kind:eq value:"noreply@mail.hellosign.com"
subject.subjectcontains
  • - Signature Requested
  • Reminder:
  • awaiting your signature
  • dropbox
  • helloshare
  • sharefile
field:"subject.subject" kind:contains
subject.subjectregex_match
  • (?:INV\b|\bACH\b|Wire Confirmation|\bP[O0]\W+?\d+\"|\bP[O0](?:\W+?|\d+)|Purchase Order|Past Due|Remit(?:tance)?).*(?: - Signature Requested by| is awaiting your signature)
  • (?:Payroll|Employee Pay\b|Salary|Benefit Enrollment|Payment.*Benefit|Benefit.*Update|Employee Handbook|Reimbursement Approved).*(?: - Signature Requested by| is awaiting your signature)
  • (?:Urgent|Important|Immediate|Secure|Encrypt|shared|\bsent\b|protected|Validate|Final Notice|Review(?:and |& )?Sign|Download PDF).*(?: - Signature Requested by| is awaiting your signature)
  • (?:Verification Code|\bMFA\b).*(?: - Signature Requested by| is awaiting your signature)
  • (?:payment.*(?:complete|confirmation|approved|recent|processing)|(complete|confirmation|approved|recent|processing).*payment).*(?: - Signature Requested by| is awaiting your signature)
  • IMG[_-](?:\d|\W)+.*(?: - Signature Requested by| is awaiting your signature)
  • _IMG_.*(?: - Signature Requested by| is awaiting your signature)
  • scanne[rd].*(?: - Signature Requested by| is awaiting your signature)
field:"subject.subject" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service abuse: Meetup.com redirect with brand impersonation

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

Detects messages abusing Meetup.com's click tracking service with lengthy redirect URLs while impersonating legitimate Meetup communications. The rule identifies suspicious links to clicks.meetup.com with URLs exceeding 300 characters, excludes legitimate Meetup emails by checking for their branding elements, and filters out high-trust authenticated senders.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesOpen redirect, Impersonation: Brand, Evasion

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
// we check 'body links' as this campaign has been observed abusing fake threads
and any(body.links,
        .href_url.domain.domain == "clicks.meetup.com"
        // lengthy url hints at redirect the circus that occurs
        and length(.href_url.url) > 300
)
// negate legit meetup.com by checking for their logo
and not any(html.xpath(body.html, '//img/@src').nodes,
            strings.icontains(.raw, 'meetupstatic')
)
// negate high trust senders that pass auth
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 abusing Meetup.com's click tracking service with lengthy redirect URLs while impersonating legitimate Meetup communications. The rule identifies suspicious links to clicks.meetup.com with URLs exceeding 300 characters, excludes legitimate Meetup emails by checking for their branding elements, and filters out high-trust authenticated senders.

  1. inbound message
  2. any of body.links where all hold:
    • .href_url.domain.domain is 'clicks.meetup.com'
    • length(.href_url.url) > 300
  3. not:
    • any of html.xpath(body.html, '//img/@src').nodes where:
      • .raw contains 'meetupstatic'
  4. not:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • coalesce(headers.auth_summary.dmarc.pass)

Inspects: body.html, body.links, body.links[].href_url.domain.domain, body.links[].href_url.url, headers.auth_summary.dmarc.pass, sender.email.domain.root_domain, type.inbound. Sensors: html.xpath, strings.icontains. Reference lists: $high_trust_sender_root_domains.

Indicators matched (1)

FieldMatchValue
body.links[].href_url.domain.domainequalsclicks.meetup.com

Stages and Predicates

Stage 1: mql_rule

and
  any(body.links)
    and
      body.links.href_url.domain.domain eq "clicks.meetup.com"
      body.links.href_url.url length_compare "300"
  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(html.xpath(body.html, '//img/@src').nodes)
      html.xpath(body.html, '//img/@src').nodes.raw contains "meetupstatic"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
html.xpath(body.html, '//img/@src').nodesarray_any(no value, null check)excludes:html.xpath(body.html, '//img/@src').nodes

Indicators

These rows show field, operator, and value matches.

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

Service abuse: Microsoft with suspicious indicators in subject

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

Detects messages impersonating Microsoft account verification that contain suspicious indicators in the subject line, including phone numbers, monetary amounts, suspicious domains, explicit content, or lengthy action-oriented phrases.

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

  • sender.email
  • subject
  • type

Rule body

type.inbound
//
//  Warning: This rule contains sexually explicit keywords
//
and sender.email.domain.root_domain == "microsoftonline.com"
and strings.icontains(subject.subject, 'account email verification code')
and (
  // phone number regex
  regex.icontains(strings.replace_confusables(subject.base),
                  '\+?(?:[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}',
                  '\(?[ilo0-9]{3}\)?[^ilo0-9]{0,3}\(?[ilo0-9]{3}\)?.?[ilo0-9]{4}'
  )
  // dollar amounts
  or regex.icontains(subject.base, '(?:USD|\$)\s?\d')
  or regex.icontains(subject.base, '\d+\.\d{2}\s?(?:USD|usd)')
  // suspicious TLDs
  or regex.icontains(subject.base,
                     '\.(?:ac\.th|biz\.id|co\.(?:cl|id|za)|com\.(?:ge|py)|my\.id|ne\.jp|net\.ms|nom\.za|web\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\b'
  )
  // dating/spam/explicit content lures
  or regex.icontains(strings.replace_confusables(subject.base),
                     '(?:\bs\s?e\s?x\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)'
  )
  // action verbs + length
  or (
    strings.count(subject.base, " ") > 8
    and regex.icontains(strings.replace_confusables(subject.base),
                        '(?:call|dial|speak to|contact \d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))'
    )
  )
)

Detection logic

Scope: inbound message.

Detects messages impersonating Microsoft account verification that contain suspicious indicators in the subject line, including phone numbers, monetary amounts, suspicious domains, explicit content, or lengthy action-oriented phrases.

  1. inbound message
  2. sender.email.domain.root_domain is 'microsoftonline.com'
  3. subject.subject contains 'account email verification code'
  4. any of:
    • strings.replace_confusables(subject.base) matches any of 3 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}
      • \(?[ilo0-9]{3}\)?[^ilo0-9]{0,3}\(?[ilo0-9]{3}\)?.?[ilo0-9]{4}
    • subject.base matches '(?:USD|\\$)\\s?\\d'
    • subject.base matches '\\d+\\.\\d{2}\\s?(?:USD|usd)'
    • subject.base matches '\\.(?:ac\\.th|biz\\.id|co\\.(?:cl|id|za)|com\\.(?:ge|py)|my\\.id|ne\\.jp|net\\.ms|nom\\.za|web\\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\\b'
    • strings.replace_confusables(subject.base) matches '(?:\\bs\\s?e\\s?x\\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)'
    • all of:
      • strings.count(subject.base, ' ') > 8
      • strings.replace_confusables(subject.base) matches '(?:call|dial|speak to|contact \\d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))'

Inspects: sender.email.domain.root_domain, subject.base, subject.subject, type.inbound. Sensors: regex.icontains, strings.count, strings.icontains, strings.replace_confusables.

Indicators matched (10)

FieldMatchValue
sender.email.domain.root_domainequalsmicrosoftonline.com
strings.icontainssubstringaccount email verification code
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}
regex.icontainsregex\(?[ilo0-9]{3}\)?[^ilo0-9]{0,3}\(?[ilo0-9]{3}\)?.?[ilo0-9]{4}
regex.icontainsregex(?:USD|\$)\s?\d
regex.icontainsregex\d+\.\d{2}\s?(?:USD|usd)
regex.icontainsregex\.(?:ac\.th|biz\.id|co\.(?:cl|id|za)|com\.(?:ge|py)|my\.id|ne\.jp|net\.ms|nom\.za|web\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\b
regex.icontainsregex(?:\bs\s?e\s?x\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)
regex.icontainsregex(?:call|dial|speak to|contact \d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      strings.count func_call "strings.count(subject.base, \" \") > 8"
      strings.replace_confusables(subject.base) regex_match "(?:call|dial|speak to|contact \\d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))"
    strings.replace_confusables(subject.base) regex_match "(?:\\bs\\s?e\\s?x\\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)"
    strings.replace_confusables(subject.base) regex_match "\\(?[ilo0-9]{3}\\)?[^ilo0-9]{0,3}\\(?[ilo0-9]{3}\\)?.?[ilo0-9]{4}"
    strings.replace_confusables(subject.base) regex_match "\\+?(?:[ilo0-9]{1,2})?\\s?\\(?\\d{3}\\)?[\\s\\.\\-⋅]{0,5}[ilo0-9]{3}[\\s\\.\\-⋅]{0,5}[ilo0-9]{4}"
    strings.replace_confusables(subject.base) regex_match "\\+?(?:[ilo0-9]{1}.)?\\(?[ilo0-9]{3}?\\)?.[ilo0-9]{3}.?[ilo0-9]{4}"
    subject.base regex_match "(?:USD|\\$)\\s?\\d"
    subject.base regex_match "\\.(?:ac\\.th|biz\\.id|co\\.(?:cl|id|za)|com\\.(?:ge|py)|my\\.id|ne\\.jp|net\\.ms|nom\\.za|web\\.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\\b"
    subject.base regex_match "\\d+\\.\\d{2}\\s?(?:USD|usd)"
  sender.email.domain.root_domain eq "microsoftonline.com"
  subject.subject contains "account email verification code"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
sender.email.domain.root_domaineq
  • microsoftonline.com
field:"sender.email.domain.root_domain" kind:eq value:"microsoftonline.com"
strings.replace_confusables(subject.base)regex_match
  • (?:\bs\s?e\s?x\b|horny|hook.?up|private room|wanna meet|wants to meet|naked|porn|webcam|nudes?|sexting|erotic|kinky|seduce|adult community|cam shows|local (?:girls?|women|single)|bed partner)
  • (?:call|dial|speak to|contact \d|to (?:stop|void|reverse|confirm|secure|verify|unfreeze))
  • (?[ilo0-9]{3})?[^ilo0-9]{0,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}
  • +?(?:[ilo0-9]{1}.)?(?[ilo0-9]{3}?)?.[ilo0-9]{3}.?[ilo0-9]{4}
field:"strings.replace_confusables(subject.base)" kind:regex_match
subject.baseregex_match
  • (?:USD|$)\s?\d
  • .(?:ac.th|biz.id|co.(?:cl|id|za)|com.(?:ge|py)|my.id|ne.jp|net.ms|nom.za|web.id|accountants|am|app|ar|army|beauty|best|bet|bio|biz|bond|cam|cc|cf|cfd|chat|cl|click|cloud|club|cm|company|consulting|country|cricket|cyou|date|dev|digital|directory|domains|download|enterprises|es|expert|fashion|finance|fit|foo|free|fun|ga|gdn|gf|gq|gu|help|i2p|icu|il|ing|ink|ir|jetzt|kim|kz|lat|life|limited|link|live|loan|lol|ltd|ly|me|meme|men|ml|mom|monster|mov|mq|one|online|ooo|party|photos|pictures|pizza|press|pro|pub|pw|racing|re|ren|rest|review|ro|rsvp|ru|run|sale|sbs|science|shop|site|so|social|solutions|space|store|stream|su|sx|tech|tk|today|tokyo|top|trade|tt|ua|uno|us|vip|vu|wang|website|win|work|works|world|ws|xin|xyz|zip|zone)\b
  • \d+.\d{2}\s?(?:USD|usd)
field:"subject.base" kind:regex_match
subject.subjectcontains
  • account email verification code
field:"subject.subject" kind:contains value:"account email verification code"
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Service abuse: QuickBooks notification from new domain

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

This Attack Surface Reduction (ASR) rule matches on QuickBooks notifications with recently registered reply-to domains.

Threat classification

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

CategoryValues
Attack typesCallback Phishing, Credential Phishing, BEC/Fraud
Tactics and techniquesEvasion, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • headers.auth_summary
  • headers.reply_to
  • sender.email
  • subject
  • type

Rule body

type.inbound

// Legitimate Intuit sending infratructure
and sender.email.email == "quickbooks@notification.intuit.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and strings.ends_with(headers.auth_summary.spf.details.designator,
                      '.intuit.com'
)

// remove payment confirmation messages
and not strings.starts_with(subject.subject, 'Payment confirmation:')

// the message needs to have a reply-to address
and length(headers.reply_to) > 0

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

// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited

// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign

// new reply-to
and any(headers.reply_to, network.whois(.email.domain).days_old < 30)

Detection logic

Scope: inbound message.

This Attack Surface Reduction (ASR) rule matches on QuickBooks notifications with recently registered reply-to domains.

  1. inbound message
  2. sender.email.email is 'quickbooks@notification.intuit.com'
  3. headers.auth_summary.spf.pass
  4. headers.auth_summary.dmarc.pass
  5. headers.auth_summary.spf.details.designator ends with '.intuit.com'
  6. not:
    • subject.subject starts with 'Payment confirmation:'
  7. length(headers.reply_to) > 0
  8. not:
    • beta.profile.by_reply_to().solicited
  9. not:
    • beta.profile.by_reply_to().any_messages_benign
  10. any of headers.reply_to where:
    • network.whois(.email.domain).days_old < 30

Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.details.designator, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain, sender.email.email, subject.subject, type.inbound. Sensors: beta.profile.by_reply_to, network.whois, strings.ends_with, strings.starts_with.

Indicators matched (2)

FieldMatchValue
sender.email.emailequalsquickbooks@notification.intuit.com
strings.ends_withsuffix.intuit.com

Stages and Predicates

Stage 1: mql_rule

and
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
  any(headers.reply_to)
    network.whois func_call "network.whois(headers.reply_to[].email.domain).days_old < 30"
  not
    subject.subject starts_with "Payment confirmation:"
  headers.auth_summary.dmarc.pass eq "true"
  headers.auth_summary.spf.details.designator ends_with ".intuit.com"
  headers.auth_summary.spf.pass eq "true"
  headers.reply_to length_compare "0"
  sender.email.email eq "quickbooks@notification.intuit.com"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
subject.subjectstarts_withPayment confirmation:excludes:subject.subject field:"subject.subject" value:"Payment confirmation:"

Indicators

These rows show field, operator, and value matches.

Service abuse: QuickBooks notification with suspicious comments

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

This detection rule matches QuickBooks notifications that contain suspicious keywords within the comments section of the notification

Threat classification

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

CategoryValues
Attack typesCallback Phishing, Credential Phishing, BEC/Fraud
Tactics and techniquesEvasion, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.html
  • sender.email
  • subject
  • type

Rule body

type.inbound

// Legitimate Intuit sending infratructure
and sender.email.email == "quickbooks@notification.intuit.com"

// remove payment confirmation messages
and not strings.starts_with(subject.subject, 'Payment confirmation:')
and body.html.raw is not null
// Comments contains suspicious phrases
and (
  // several different templates where commonly observed, run regex for each template
  any([
        html.xpath(body.html,
                   '//span[@id="condensedEmailMessageSectionContentWebPlayer"]'
        ).nodes,
        html.xpath(body.html, '//div[@id="emailContainer"]').nodes,
        html.xpath(body.html, '//table[@width="700"][1]//tr/td').nodes,
        html.xpath(body.html, '//tr[@class="email-header"]').nodes,
        html.xpath(body.html, '//tr[@class="email-center"]').nodes,
        html.xpath(body.html, '//div[@class="mlr22"]').nodes,
        html.xpath(body.html, '//td[@class="itemDesc"]//div').nodes,
        html.xpath(body.html, '//td[@class="shippingContent"]//div').nodes,
        html.xpath(body.html,
                   '//table[@class="shippingAndCustomLayout width100"]'
        ).nodes
      ],
      any(.,
          regex.icontains(.inner_text,
                          // subscription, renewals, verificaitons, etc
                          '(?:your subscription renewal|couldn.?t be processed|trouble renewing subscription|update your details|just update your|continue your subscription|prefer to use EFT|change payment method|verify your account|suspended due to issue|payment declined notice|account needs verification|confirm your billing|immediate action required|failed payment notification|billing information update|service interruption warning|unable to process payment|subscription payment failed|action needed now|update banking information|subscription expiration notice|payment method change|bill\s+to\s+subscriber)',
                          // callback wording
                          'recognize this seller?|For more info.{0,25}Call|To cancel.{0,25}Call|did not authorize',
          )
      )
  )
)

Detection logic

Scope: inbound message.

This detection rule matches QuickBooks notifications that contain suspicious keywords within the comments section of the notification

  1. inbound message
  2. sender.email.email is 'quickbooks@notification.intuit.com'
  3. not:
    • subject.subject starts with 'Payment confirmation:'
  4. body.html.raw is set
  5. any of [html.xpath(body.html, '//span[@id="condensedEmailMessageSectionContentWebPlayer"]').nodes, html.xpath(body.html, '//div[@id="emailContainer"]').nodes, html.xpath(body.html, '//table[@width="700"][1]//tr/td').nodes, html.xpath(body.html, '//tr[@class="email-header"]').nodes, html.xpath(body.html, '//tr[@class="email-center"]').nodes, html.xpath(body.html, '//div[@class="mlr22"]').nodes, html.xpath(body.html, '//td[@class="itemDesc"]//div').nodes, html.xpath(body.html, '//td[@class="shippingContent"]//div').nodes, html.xpath(body.html, '//table[@class="shippingAndCustomLayout width100"]').nodes] where:
    • any of . where:
      • .inner_text matches any of 2 patterns
        • (?:your subscription renewal|couldn.?t be processed|trouble renewing subscription|update your details|just update your|continue your subscription|prefer to use EFT|change payment method|verify your account|suspended due to issue|payment declined notice|account needs verification|confirm your billing|immediate action required|failed payment notification|billing information update|service interruption warning|unable to process payment|subscription payment failed|action needed now|update banking information|subscription expiration notice|payment method change|bill\s+to\s+subscriber)
        • recognize this seller?|For more info.{0,25}Call|To cancel.{0,25}Call|did not authorize

Inspects: body.html, body.html.raw, sender.email.email, subject.subject, type.inbound. Sensors: html.xpath, regex.icontains, strings.starts_with.

Indicators matched (3)

FieldMatchValue
sender.email.emailequalsquickbooks@notification.intuit.com
regex.icontainsregex(?:your subscription renewal|couldn.?t be processed|trouble renewing subscription|update your details|just update your|continue your subscription|prefer to use EFT|change payment method|verify your account|suspended due to issue|payment declined notice|account needs verification|confirm your billing|immediate action required|failed payment notification|billing information update|service interruption warning|unable to process payment|subscription payment failed|action needed now|update banking information|subscription expiration notice|payment method change|bill\s+to\s+subscriber)
regex.icontainsregexrecognize this seller?|For more info.{0,25}Call|To cancel.{0,25}Call|did not authorize

Stages and Predicates

Stage 1: mql_rule

and
  any([html.xpath(body.html, '//span[@id="condensedEmailMessageSectionContentWebPlayer"]').nodes, html.xpath(body.html, '//div[@id="emailContainer"]').nodes, html.xpath(body.html, '//table[@width="700"][1]//tr/td').nodes, html.xpath(body.html, '//tr[@class="email-header"]').nodes, html.xpath(body.html, '//tr[@class="email-center"]').nodes, html.xpath(body.html, '//div[@class="mlr22"]').nodes, html.xpath(body.html, '//td[@class="itemDesc"]//div').nodes, html.xpath(body.html, '//td[@class="shippingContent"]//div').nodes, html.xpath(body.html, '//table[@class="shippingAndCustomLayout width100"]').nodes])
    any([html.xpath(body.html, '//span[@id="condensedEmailMessageSectionContentWebPlayer"]').nodes, html.xpath(body.html, '//div[@id="emailContainer"]').nodes, html.xpath(body.html, '//table[@width="700"][1]//tr/td').nodes, html.xpath(body.html, '//tr[@class="email-header"]').nodes, html.xpath(body.html, '//tr[@class="email-center"]').nodes, html.xpath(body.html, '//div[@class="mlr22"]').nodes, html.xpath(body.html, '//td[@class="itemDesc"]//div').nodes, html.xpath(body.html, '//td[@class="shippingContent"]//div').nodes, html.xpath(body.html, '//table[@class="shippingAndCustomLayout width100"]').nodes])
      or
        [html.xpath(body.html, '//span[@id="condensedEmailMessageSectionContentWebPlayer"]').nodes, html.xpath(body.html, '//div[@id="emailContainer"]').nodes, html.xpath(body.html, '//table[@width="700"][1]//tr/td').nodes, html.xpath(body.html, '//tr[@class="email-header"]').nodes, html.xpath(body.html, '//tr[@class="email-center"]').nodes, html.xpath(body.html, '//div[@class="mlr22"]').nodes, html.xpath(body.html, '//td[@class="itemDesc"]//div').nodes, html.xpath(body.html, '//td[@class="shippingContent"]//div').nodes, html.xpath(body.html, '//table[@class="shippingAndCustomLayout width100"]').nodes].inner_text regex_match "(?:your subscription renewal|couldn.?t be processed|trouble renewing subscription|update your details|just update your|continue your subscription|prefer to use EFT|change payment method|verify your account|suspended due to issue|payment declined notice|account needs verification|confirm your billing|immediate action required|failed payment notification|billing information update|service interruption warning|unable to process payment|subscription payment failed|action needed now|update banking information|subscription expiration notice|payment method change|bill\\s+to\\s+subscriber)"
        [html.xpath(body.html, '//span[@id="condensedEmailMessageSectionContentWebPlayer"]').nodes, html.xpath(body.html, '//div[@id="emailContainer"]').nodes, html.xpath(body.html, '//table[@width="700"][1]//tr/td').nodes, html.xpath(body.html, '//tr[@class="email-header"]').nodes, html.xpath(body.html, '//tr[@class="email-center"]').nodes, html.xpath(body.html, '//div[@class="mlr22"]').nodes, html.xpath(body.html, '//td[@class="itemDesc"]//div').nodes, html.xpath(body.html, '//td[@class="shippingContent"]//div').nodes, html.xpath(body.html, '//table[@class="shippingAndCustomLayout width100"]').nodes].inner_text regex_match "recognize this seller?|For more info.{0,25}Call|To cancel.{0,25}Call|did not authorize"
  not
    subject.subject starts_with "Payment confirmation:"
  body.html.raw is_not_null
  sender.email.email eq "quickbooks@notification.intuit.com"
  type.inbound eq "true"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
subject.subjectstarts_withPayment confirmation:excludes:subject.subject field:"subject.subject" value:"Payment confirmation:"

Indicators

These rows show field, operator, and value matches.

Service abuse: Substack credential theft with confusable characters and branded button redirects

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

Detects messages from Substack that use confusable characters in the sender display name, contain purple buttons or typical button classes that redirect to non-Substack domains, and include credential theft content with urgency indicators.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesSocial engineering, Evasion

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and sender.email.domain.root_domain == 'substack.com'
and 2 of (
  // substack-branded elements pointing to non-substack domains
  any(filter(html.xpath(body.html, '//a[@href]').nodes,
             // purple button or typical button classes
             (
               strings.icontains(.raw, 'background-color: #7c3aed')
               or strings.icontains(.raw, 'background-color:#7c3aed')
               or strings.icontains(.raw, 'class="button')
               or strings.icontains(.raw, 'bgcolor="#7c3aed"')
             )
      ),
      // rewrites to non-Substack domain
      any(.links, .href_url.domain.root_domain not in~ ('substack.com'))
  ),
  // sender name contains confusables
  sender.display_name != strings.replace_confusables(sender.display_name),
  // lots of urgency entities
  length(filter(ml.nlu_classifier(body.current_thread.text).entities,
                .name == "urgency"
         )
  ) >= 5,
  // excessive hidden character spam in HTML source
  any(html.xpath(body.html, '//*').nodes,
      (
        strings.count(.raw, '&#173;') + strings.count(.raw, '&#847;')
 + strings.count(.raw, '&#8199;')
      ) > 100
  )
)
// cred theft
and (
  any(ml.nlu_classifier(body.current_thread.text).intents,
      .name == "cred_theft" and .confidence != "low"
  )
)

Detection logic

Scope: inbound message.

Detects messages from Substack that use confusable characters in the sender display name, contain purple buttons or typical button classes that redirect to non-Substack domains, and include credential theft content with urgency indicators.

  1. inbound message
  2. sender.email.domain.root_domain is 'substack.com'
  3. at least 2 of:
    • any of filter(...) where:
      • any of .links where:
        • .href_url.domain.root_domain not in ('substack.com')
    • sender.display_name is not strings.replace_confusables(sender.display_name)
    • length(filter(ml.nlu_classifier(body.current_thread.text).entities, .name == 'urgency')) ≥ 5
    • any of html.xpath(body.html, '//*').nodes where:
      • strings.count(.raw) + strings.count(.raw) + strings.count(.raw) > 100
  4. any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
    • .name is 'cred_theft'
    • .confidence is not 'low'

Inspects: body.current_thread.text, body.html, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: html.xpath, ml.nlu_classifier, strings.icontains, strings.replace_confusables.

Indicators matched (7)

FieldMatchValue
sender.email.domain.root_domainequalssubstack.com
strings.icontainssubstringbackground-color: #7c3aed
strings.icontainssubstringbackground-color:#7c3aed
strings.icontainssubstringclass="button
strings.icontainssubstringbgcolor="#7c3aed"
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsurgency
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(filter(...))
      any(filter(...).links)
        not
          filter(...).links[].href_url.domain.root_domain eq "substack.com"
    any(html.xpath(body.html, '//*').nodes)
       macro "((strings.count(html.xpath(body.html, '//*').nodes[].raw) + strings.count(html.xpath(body.html, '//*').nodes[].raw)) + strings.count(html.xpath(body.html, '//*').nodes[].raw)) > 100"
    filter(ml.nlu_classifier(body.current_thread.text).entities, .name == 'urgency') length_compare "5"
     macro "sender.display_name != strings.replace_confusables(sender.display_name)"
  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 "cred_theft"
  sender.email.domain.root_domain eq "substack.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: SurveyMonkey survey from newly registered domain

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

This Attack Surface Reduction (ASR) rule matches on SurveyMonkey Surveys with recently registered reply-to domains.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesEvasion, Free file host, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound

// Legitimate SurveyMonkey sending infratructure
and sender.email.email == "member@surveymonkeyuser.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and any(headers.reply_to, network.whois(.email.domain).days_old < 30)
// 
// 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
// 

// reply-to email address has never been sent an email by the org
and not beta.profile.by_reply_to().solicited

// do not match if the reply_to address has been observed as a reply_to address
// of a message that has been classified as benign
and not beta.profile.by_reply_to().any_messages_benign

Detection logic

Scope: inbound message.

This Attack Surface Reduction (ASR) rule matches on SurveyMonkey Surveys with recently registered reply-to domains.

  1. inbound message
  2. sender.email.email is 'member@surveymonkeyuser.com'
  3. headers.auth_summary.spf.pass
  4. headers.auth_summary.dmarc.pass
  5. any of headers.reply_to where:
    • network.whois(.email.domain).days_old < 30
  6. not:
    • beta.profile.by_reply_to().solicited
  7. not:
    • beta.profile.by_reply_to().any_messages_benign

Inspects: headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.reply_to, headers.reply_to[].email.domain, sender.email.email, type.inbound. Sensors: beta.profile.by_reply_to, network.whois.

Indicators matched (1)

FieldMatchValue
sender.email.emailequalsmember@surveymonkeyuser.com

Stages and Predicates

Stage 1: mql_rule

and
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().any_messages_benign"
  not
    beta.profile.by_reply_to func_call "beta.profile.by_reply_to().solicited"
  any(headers.reply_to)
    network.whois func_call "network.whois(headers.reply_to[].email.domain).days_old < 30"
  headers.auth_summary.dmarc.pass eq "true"
  headers.auth_summary.spf.pass eq "true"
  sender.email.email eq "member@surveymonkeyuser.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: Suspicious Zoom Docs link

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

Detects messages from Zoom Docs in which the document originates from a newly observed email address or contains suspicious indicators.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesSocial engineering, Free file host, Evasion

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.links
  • sender.email
  • type

Rule body

type.inbound
and sender.email.domain.root_domain == "zoom.us"
and strings.ends_with(sender.display_name, "Zoom Docs")
and (
  any(html.xpath(body.html, '//h2').nodes,
      // extract the sender email out of the message body
      any(regex.iextract(.display_text,
                         '^(?P<sender_display_name>[^\(]+)\((?P<sender_email>[^\)]+@(?P<sender_domain>[^\)]+))\)'
          ),
          .named_groups["sender_domain"] not in $org_domains
          and .named_groups["sender_email"] not in $recipient_emails
          and .named_groups["sender_email"] not in $sender_emails
          and not (
            .named_groups["sender_domain"] not in $free_email_providers
            and .named_groups["sender_domain"] in $recipient_domains
            and .named_groups["sender_domain"] in $sender_domains
          )
      )
  )
  or any(body.links,
         .href_url.domain.domain == "docs.zoom.us"
         and any(filter(ml.link_analysis(., mode="aggressive").final_dom.links,
                        .href_url.domain.root_domain != 'zoom.us'
                        and .href_url.domain.domain != 'zoom.us'
                 ),
                 (
                   // any of those links domains are new
                   network.whois(.href_url.domain).days_old < 30
                   // go to free file hosts
                   or .href_url.domain.root_domain in $free_file_hosts
                   or .href_url.domain.domain in $free_file_hosts

                   // go to free subdomains hosts
                   or (
                     .href_url.domain.root_domain in $free_subdomain_hosts
                     // where there is a subdomain
                     and .href_url.domain.subdomain is not null
                     and .href_url.domain.subdomain != "www"
                   )
                   // go to url shortners
                   or .href_url.domain.root_domain in $url_shorteners
                   or .href_url.domain.domain in $url_shorteners
                   or (
                     // find any links that mention common "action" words
                     regex.icontains(.display_text,
                                     '(?:view|click|show|access|download|goto|Validate|Va[il]idar|login|verify|account)'
                     )
                   )
                 )
         )
  )
)

Detection logic

Scope: inbound message.

Detects messages from Zoom Docs in which the document originates from a newly observed email address or contains suspicious indicators.

  1. inbound message
  2. sender.email.domain.root_domain is 'zoom.us'
  3. sender.display_name ends with 'Zoom Docs'
  4. any of:
    • any of html.xpath(body.html, '//h2').nodes where:
      • any of regex.iextract(.display_text) where all hold:
        • .named_groups['sender_domain'] not in $org_domains
        • .named_groups['sender_email'] not in $recipient_emails
        • .named_groups['sender_email'] not in $sender_emails
        • not:
          • all of:
            • .named_groups['sender_domain'] not in $free_email_providers
            • .named_groups['sender_domain'] in $recipient_domains
            • .named_groups['sender_domain'] in $sender_domains
    • any of body.links where all hold:
      • .href_url.domain.domain is 'docs.zoom.us'
      • any of filter(...) where any holds:
        • network.whois(.href_url.domain).days_old < 30
        • .href_url.domain.root_domain in $free_file_hosts
        • .href_url.domain.domain in $free_file_hosts
        • all of:
          • .href_url.domain.root_domain in $free_subdomain_hosts
          • .href_url.domain.subdomain is set
          • .href_url.domain.subdomain is not 'www'
        • .href_url.domain.root_domain in $url_shorteners
        • .href_url.domain.domain in $url_shorteners
        • .display_text matches '(?:view|click|show|access|download|goto|Validate|Va[il]idar|login|verify|account)'

Inspects: body.html, body.links, body.links[].href_url.domain.domain, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: html.xpath, ml.link_analysis, network.whois, regex.icontains, regex.iextract, strings.ends_with. Reference lists: $free_email_providers, $free_file_hosts, $free_subdomain_hosts, $org_domains, $recipient_domains, $recipient_emails, $sender_domains, $sender_emails, $url_shorteners.

Indicators matched (5)

FieldMatchValue
sender.email.domain.root_domainequalszoom.us
strings.ends_withsuffixZoom Docs
regex.iextractregex^(?P<sender_display_name>[^\(]+)\((?P<sender_email>[^\)]+@(?P<sender_domain>[^\)]+))\)
body.links[].href_url.domain.domainequalsdocs.zoom.us
regex.icontainsregex(?:view|click|show|access|download|goto|Validate|Va[il]idar|login|verify|account)

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(body.links)
      and
        any(filter(...))
          or
            and
              filter(...).href_url.domain.subdomain is_not_null
              filter(...).href_url.domain.subdomain ne "www"
               macro "filter(...)[].href_url.domain.root_domain in free_subdomain_hosts"
            filter(...).display_text regex_match "(?:view|click|show|access|download|goto|Validate|Va[il]idar|login|verify|account)"
            network.whois func_call "network.whois(filter(...)[].href_url.domain).days_old < 30"
             macro "filter(...)[].href_url.domain.domain in free_file_hosts"
             macro "filter(...)[].href_url.domain.domain in url_shorteners"
             macro "filter(...)[].href_url.domain.root_domain in free_file_hosts"
             macro "filter(...)[].href_url.domain.root_domain in url_shorteners"
        body.links.href_url.domain.domain eq "docs.zoom.us"
    any(html.xpath(body.html, '//h2').nodes)
      any(regex.iextract(html.xpath(body.html, '//h2').nodes.display_text))
        and
          not
            and
               macro "regex.iextract(html.xpath(body.html, '//h2').nodes[].display_text)[].named_groups['sender_domain'] in recipient_domains"
               macro "regex.iextract(html.xpath(body.html, '//h2').nodes[].display_text)[].named_groups['sender_domain'] in sender_domains"
               macro "regex.iextract(html.xpath(body.html, '//h2').nodes[].display_text)[].named_groups['sender_domain'] not in free_email_providers"
           macro "regex.iextract(html.xpath(body.html, '//h2').nodes[].display_text)[].named_groups['sender_domain'] not in org_domains"
           macro "regex.iextract(html.xpath(body.html, '//h2').nodes[].display_text)[].named_groups['sender_email'] not in recipient_emails"
           macro "regex.iextract(html.xpath(body.html, '//h2').nodes[].display_text)[].named_groups['sender_email'] not in sender_emails"
  sender.display_name ends_with "Zoom Docs"
  sender.email.domain.root_domain eq "zoom.us"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: Task management message sent via SendGrid

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

Detects messages impersonating task or productivity applications by using 'todo list' in the subject line or body while utilizing SendGrid infrastructure. The sender claims to be task-related through display name or body content but originates from non-legitimate domains without proper DMARC authentication.

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
  • headers
  • headers.auth_summary
  • headers.return_path
  • sender.email
  • subject
  • type

Rule body

type.inbound
// subject contains "todo list"
and (
  regex.icontains(subject.subject, "T[0o][-\\s]*D[o0][-\\s]*L[I1l]ST")
  // or we can check the body for todo list content with high cred_theft intent
  or (
    regex.icontains(body.current_thread.text,
                    "T[0o][-\\s]*D[o0][-\\s]*L[I1l]ST"
    )
    and any(ml.nlu_classifier(body.current_thread.text).intents,
            .name == "cred_theft" and .confidence == "high"
    )
  )
)
// utilizing sendgrid infra
and headers.return_path.domain.domain == "sendgrid.net"
// 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
  )
)

Detection logic

Scope: inbound message.

Detects messages impersonating task or productivity applications by using 'todo list' in the subject line or body while utilizing SendGrid infrastructure. The sender claims to be task-related through display name or body content but originates from non-legitimate domains without proper DMARC authentication.

  1. inbound message
  2. any of:
    • subject.subject matches 'T[0o][-\\\\s]*D[o0][-\\\\s]*L[I1l]ST'
    • all of:
      • body.current_thread.text matches 'T[0o][-\\\\s]*D[o0][-\\\\s]*L[I1l]ST'
      • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
        • .name is 'cred_theft'
        • .confidence is 'high'
  3. headers.return_path.domain.domain is 'sendgrid.net'
  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

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

Indicators matched (4)

FieldMatchValue
regex.icontainsregexT[0o][-\\s]*D[o0][-\\s]*L[I1l]ST
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
headers.return_path.domain.domainequalssendgrid.net

Stages and Predicates

Stage 1: mql_rule

and
  or
    and
      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"
      body.current_thread.text regex_match "T[0o][-\\\\s]*D[o0][-\\\\s]*L[I1l]ST"
    subject.subject regex_match "T[0o][-\\\\s]*D[o0][-\\\\s]*L[I1l]ST"
  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"
  headers.return_path.domain.domain eq "sendgrid.net"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: Vimeo with external plain-text links in message

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

Detects messages absuing Vimeo notifications about received messages that contain plain-text links redirecting to domains other than Vimeo, potentially leading users to malicious websites.

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
  • sender.email
  • subject
  • type

Rule body

type.inbound
and sender.email.domain.domain == 'vimeo.com'
and strings.ends_with(subject.base, 'sent you a message on Vimeo')
and (
  // plain-text url that does not go to vimeo
  any(filter(body.current_thread.links, .parser == "plain"),
      .display_url.domain.root_domain != 'vimeo.com'
  )
)

Detection logic

Scope: inbound message.

Detects messages absuing Vimeo notifications about received messages that contain plain-text links redirecting to domains other than Vimeo, potentially leading users to malicious websites.

  1. inbound message
  2. sender.email.domain.domain is 'vimeo.com'
  3. subject.base ends with 'sent you a message on Vimeo'
  4. any of filter(body.current_thread.links) where:
    • .display_url.domain.root_domain is not 'vimeo.com'

Inspects: body.current_thread.links, body.current_thread.links[].parser, sender.email.domain.domain, subject.base, type.inbound. Sensors: strings.ends_with.

Indicators matched (3)

FieldMatchValue
sender.email.domain.domainequalsvimeo.com
strings.ends_withsuffixsent you a message on Vimeo
body.current_thread.links[].parserequalsplain

Stages and Predicates

Stage 1: mql_rule

and
  any(filter(body.current_thread.links))
    filter(body.current_thread.links).display_url.domain.root_domain ne "vimeo.com"
  sender.email.domain.domain eq "vimeo.com"
  subject.base ends_with "sent you a message on Vimeo"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

Service abuse: Wix redirect through bulk mailer domains

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

Detects messages containing Wix-encoded links that redirect through bulk mailing service domains, potentially bypassing security controls through legitimate redirect services.

Threat classification

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

CategoryValues
Attack typesCredential Phishing, Malware/Ransomware
Tactics and techniquesEvasion, Open redirect

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.links
  • type

Rule body

type.inbound
and any(filter(body.links, 'wix' in .href_url.rewrite.encoders),
        .href_url.domain.root_domain in $bulk_mailer_url_root_domains
)

Detection logic

Scope: inbound message.

Detects messages containing Wix-encoded links that redirect through bulk mailing service domains, potentially bypassing security controls through legitimate redirect services.

  1. inbound message
  2. any of filter(body.links) where:
    • .href_url.domain.root_domain in $bulk_mailer_url_root_domains

Inspects: body.links, body.links[].href_url.rewrite.encoders, type.inbound. Reference lists: $bulk_mailer_url_root_domains.

Indicators matched (1)

FieldMatchValue
body.links[].href_url.rewrite.encoderscontainswix

Stages and Predicates

Stage 1: mql_rule

and
  any(filter(body.links))
     macro "filter(body.links)[].href_url.domain.root_domain in bulk_mailer_url_root_domains"
  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"