EXPLORE
← Back to Explore
sublimelowRule

Spam: Website errors solicitation

This rule detects messages claiming to have identified errors on a website. The messages typically offer to send pricing or information upon request.

MITRE ATT&CK

Detection Query

type.inbound
and not profile.by_sender().solicited
// no attachments
and length(attachments) == 0
// subject must contain SEO or web dev spam keywords or be short
and (
  (
    // SEO or web development service keywords
    regex.icontains(strings.replace_confusables(subject.subject),
                    '(?:proposal|cost|estimate|error|bug|audit|screenshot|strategy|rankings|issues|fix|website|design|review|price)'
    )
    or regex.icontains(subject.base,
                       '[^\x{2600}-\x{27BF}\x{1F300}-\x{1F9FF}][\x{2600}-\x{27BF}\x{1F300}-\x{1F9FF}]\x{FE0F}?$'
    )
    // report and follow up keywords
    or (
      strings.icontains(strings.replace_confusables(subject.subject), "report")
      and regex.icontains(strings.replace_confusables(body.current_thread.text),
                          "(?:free|send you|can i send|may i send|let me know|interested|get back to me|reply back|just reply)"
      )
    )
    // short subject
    or length(subject.base) < 5
  )
  // or a reply or forward in a thread that mentions website or screenshots
  or (
    (length(subject.base) < 5 or subject.is_reply or subject.is_forward)
    and any(body.previous_threads,
            regex.icontains(strings.replace_confusables(.text),
                            "(?:screenshot|website)"
            )
    )
  )
)
// body structure and content patterns
and (
  // Single thread with no links
  (
    length(body.links) == 0
    and length(body.previous_threads) == 0
    // short message between 20 and 500 chars
    and 20 < length(body.current_thread.text) < 500
    // service offering keywords
    and regex.icontains(strings.replace_confusables(body.current_thread.text),
                        "(?:screenshot|error list|plan|quote|rank|professional|price|mistake|visibility|improvement|review|emailed.{0,10}more details)"
    )
    // generic greeting
    and regex.icontains(strings.replace_confusables(body.current_thread.text),
                        'h(?:i|ello|ey)\b'
    )
    // problem or urgency keywords
    and regex.icontains(strings.replace_confusables(body.current_thread.text),
                        '(?:error|report|issues|website|repair|redesign|upgrade|Google\s+.{0,15}find it|glitch)'
    )
    // website or page mention
    and regex.icontains(strings.replace_confusables(body.current_thread.text),
                        "(?:site|website|page)"
    )
  )
  // Single thread with unsubscribe link or $org_domains link
  or (
    length(body.links) <= 3
    and (
      // unsubscribe mailto link
      regex.icontains(body.html.raw, "mailto:*[++unsubscribe@]")
      // or link to found in org_domains
      or any(body.links, .href_url.domain.root_domain in~ $org_domains)
    )
    and length(body.previous_threads) == 0
    // short message between 20 and 500 chars
    and 20 < length(body.current_thread.text) < 500
    // service offering keywords
    and regex.icontains(strings.replace_confusables(body.current_thread.text),
                        "(?:screenshot|error list|plan|quote|rank|professional|price|mistake)"
    )
    // generic greeting
    and regex.icontains(strings.replace_confusables(body.current_thread.text),
                        '(?:h(?:i|ello|ey)|morning)\b'
    )
    // problem or urgency keywords
    and regex.icontains(strings.replace_confusables(body.current_thread.text),
                        '(?:error|report|issues|website|repair|redesign|upgrade|Google\s+.{0,15}find it)'
    )
    // website or page mention
    and regex.icontains(strings.replace_confusables(body.current_thread.text),
                        "(?:site|website|page)"
    )
  )
  // Multiple thread messages
  or (
    length(body.links) == 0
    // small thread with less than 5 messages
    and length(body.previous_threads) < 5
    // check previous messages for spam characteristics
    and any(body.previous_threads,
            // short previous messages less than 400 chars
            length(.text) < 400
            and (
              // generic greeting
              regex.icontains(strings.replace_confusables(.text),
                              '(?:h(?:i|ello|ey)|morning)\b'
              )
              // service offering keywords
              and regex.icontains(strings.replace_confusables(.text),
                                  '(?:\berror(?:\s+list)?\b|screenshot|report|plan)'
              )
              // previous threads written in English
              and ml.nlu_classifier(.text).language == "english"
            )
    )
  )
)

Data Sources

Email MessagesEmail HeadersEmail Attachments

Platforms

email

Tags

Attack surface reduction
Raw Content
name: "Spam: Website errors solicitation"
description: "This rule detects messages claiming to have identified errors on a website. The messages typically offer to send pricing or information upon request."
type: "rule"
severity: "low"
source: |
  type.inbound
  and not profile.by_sender().solicited
  // no attachments
  and length(attachments) == 0
  // subject must contain SEO or web dev spam keywords or be short
  and (
    (
      // SEO or web development service keywords
      regex.icontains(strings.replace_confusables(subject.subject),
                      '(?:proposal|cost|estimate|error|bug|audit|screenshot|strategy|rankings|issues|fix|website|design|review|price)'
      )
      or regex.icontains(subject.base,
                         '[^\x{2600}-\x{27BF}\x{1F300}-\x{1F9FF}][\x{2600}-\x{27BF}\x{1F300}-\x{1F9FF}]\x{FE0F}?$'
      )
      // report and follow up keywords
      or (
        strings.icontains(strings.replace_confusables(subject.subject), "report")
        and regex.icontains(strings.replace_confusables(body.current_thread.text),
                            "(?:free|send you|can i send|may i send|let me know|interested|get back to me|reply back|just reply)"
        )
      )
      // short subject
      or length(subject.base) < 5
    )
    // or a reply or forward in a thread that mentions website or screenshots
    or (
      (length(subject.base) < 5 or subject.is_reply or subject.is_forward)
      and any(body.previous_threads,
              regex.icontains(strings.replace_confusables(.text),
                              "(?:screenshot|website)"
              )
      )
    )
  )
  // body structure and content patterns
  and (
    // Single thread with no links
    (
      length(body.links) == 0
      and length(body.previous_threads) == 0
      // short message between 20 and 500 chars
      and 20 < length(body.current_thread.text) < 500
      // service offering keywords
      and regex.icontains(strings.replace_confusables(body.current_thread.text),
                          "(?:screenshot|error list|plan|quote|rank|professional|price|mistake|visibility|improvement|review|emailed.{0,10}more details)"
      )
      // generic greeting
      and regex.icontains(strings.replace_confusables(body.current_thread.text),
                          'h(?:i|ello|ey)\b'
      )
      // problem or urgency keywords
      and regex.icontains(strings.replace_confusables(body.current_thread.text),
                          '(?:error|report|issues|website|repair|redesign|upgrade|Google\s+.{0,15}find it|glitch)'
      )
      // website or page mention
      and regex.icontains(strings.replace_confusables(body.current_thread.text),
                          "(?:site|website|page)"
      )
    )
    // Single thread with unsubscribe link or $org_domains link
    or (
      length(body.links) <= 3
      and (
        // unsubscribe mailto link
        regex.icontains(body.html.raw, "mailto:*[++unsubscribe@]")
        // or link to found in org_domains
        or any(body.links, .href_url.domain.root_domain in~ $org_domains)
      )
      and length(body.previous_threads) == 0
      // short message between 20 and 500 chars
      and 20 < length(body.current_thread.text) < 500
      // service offering keywords
      and regex.icontains(strings.replace_confusables(body.current_thread.text),
                          "(?:screenshot|error list|plan|quote|rank|professional|price|mistake)"
      )
      // generic greeting
      and regex.icontains(strings.replace_confusables(body.current_thread.text),
                          '(?:h(?:i|ello|ey)|morning)\b'
      )
      // problem or urgency keywords
      and regex.icontains(strings.replace_confusables(body.current_thread.text),
                          '(?:error|report|issues|website|repair|redesign|upgrade|Google\s+.{0,15}find it)'
      )
      // website or page mention
      and regex.icontains(strings.replace_confusables(body.current_thread.text),
                          "(?:site|website|page)"
      )
    )
    // Multiple thread messages
    or (
      length(body.links) == 0
      // small thread with less than 5 messages
      and length(body.previous_threads) < 5
      // check previous messages for spam characteristics
      and any(body.previous_threads,
              // short previous messages less than 400 chars
              length(.text) < 400
              and (
                // generic greeting
                regex.icontains(strings.replace_confusables(.text),
                                '(?:h(?:i|ello|ey)|morning)\b'
                )
                // service offering keywords
                and regex.icontains(strings.replace_confusables(.text),
                                    '(?:\berror(?:\s+list)?\b|screenshot|report|plan)'
                )
                // previous threads written in English
                and ml.nlu_classifier(.text).language == "english"
              )
      )
    )
  )

tags:
  - "Attack surface reduction"
attack_types:
  - "Spam"
detection_methods:
  - "Content analysis"
  - "Sender analysis"
  - "Natural Language Understanding"
id: "122ea794-f619-5f29-acb2-83261d8f81fc"