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.

Sublime rule (View on GitHub)

  1name: "Spam: Website errors solicitation"
  2description: "This rule detects messages claiming to have identified errors on a website. The messages typically offer to send pricing or information upon request."
  3type: "rule"
  4severity: "low"
  5source: |
  6  type.inbound
  7  and (
  8    sender.email.email not in $recipient_emails
  9    or not profile.by_sender().solicited
 10  )
 11  and 1 of (
 12    // Single thread message groups
 13    (
 14      length(attachments) == 0
 15      and length(body.links) == 0
 16      and length(body.previous_threads) == 0
 17      and 20 < length(body.current_thread.text) < 500
 18      and regex.icontains(strings.replace_confusables(body.current_thread.text),
 19                          "(?:screenshot|error list|plan|quote|rank|professional|price|mistake)"
 20      )
 21      and regex.icontains(strings.replace_confusables(body.current_thread.text),
 22                          'h(?:i|ello|ey)\b'
 23      )
 24      and regex.icontains(strings.replace_confusables(body.current_thread.text),
 25                          '(?:error|report|issues|repair|redesign|upgrade|Google\s+.{0,15}find it)'
 26      )
 27      and regex.icontains(strings.replace_confusables(body.current_thread.text),
 28                          "(?:site|website|page)"
 29      )
 30      and (
 31        regex.icontains(strings.replace_confusables(subject.subject),
 32                        "(?:proposal|cost|estimate|error|bug|audit|screenshot|strategy|rankings|issues|fix|website|design)"
 33        )
 34        or (
 35          strings.icontains(strings.replace_confusables(subject.subject), "report")
 36          and regex.icontains(strings.replace_confusables(body.current_thread.text),
 37                              "(?:free|send you|can i send|may i send|let me know|interested|get back to me|reply back|just reply)"
 38          )
 39        )
 40        or length(subject.base) < 5
 41      )
 42    ),
 43    // Single thread message groups but with 1 unsubscribe link or link is recipient
 44    (
 45      length(attachments) == 0
 46      and length(body.links) == 1
 47      and (
 48        regex.icontains(body.html.raw, "mailto:*[++unsubscribe@]")
 49        or any(body.links, .href_url.domain.root_domain in~ $org_domains)
 50      )
 51      and length(body.previous_threads) == 0
 52      and 20 < length(body.current_thread.text) < 500
 53      and regex.icontains(strings.replace_confusables(body.current_thread.text),
 54                          "(?:screenshot|error list|plan|quote|rank|professional|price)"
 55      )
 56      and regex.icontains(strings.replace_confusables(body.current_thread.text),
 57                          'h(?:i|ello|ey)\b'
 58      )
 59      and regex.icontains(strings.replace_confusables(body.current_thread.text),
 60                          '(?:error|report|issues|website|repair|redesign|upgrade|Google\s+.{0,15}find it)'
 61      )
 62      and regex.icontains(strings.replace_confusables(body.current_thread.text),
 63                          "(?:site|website|page)"
 64      )
 65      and (
 66        regex.icontains(strings.replace_confusables(subject.subject),
 67                        "(?:proposal|cost|estimate|error|bug|audit|screenshot|strategy|rankings|issues|fix|website|design)"
 68        )
 69        or (
 70          strings.icontains(strings.replace_confusables(subject.subject),
 71                            "report"
 72          )
 73          and regex.icontains(strings.replace_confusables(body.current_thread.text),
 74                              "(?:free|send you|can i send|may i send|let me know|interested|get back to me|reply back|just reply)"
 75          )
 76        )
 77        or length(subject.base) < 5
 78      )
 79    ),
 80    // Multiple thread message groups
 81    (
 82      length(attachments) == 0
 83      and length(body.links) == 0
 84      and length(body.previous_threads) < 5
 85      and (
 86        regex.icontains(strings.replace_confusables(subject.subject),
 87                        "(?:proposal|cost|estimate|error|bug|audit|screenshot|strategy|rankings|issues|fix|website|design)"
 88        )
 89        or (
 90          (
 91            length(subject.base) < 5
 92            or subject.is_reply or subject.is_forward
 93          )
 94          and any(body.previous_threads,
 95                  regex.icontains(strings.replace_confusables(.text),
 96                                  "(?:screenshot|website)"
 97                  )
 98          )
 99        )
100      )
101      and any(body.previous_threads,
102              length(.text) < 400
103              and (
104                regex.icontains(strings.replace_confusables(.text),
105                                'h(?:i|ello|ey)\b'
106                )
107                or strings.icontains(strings.replace_confusables(.text),
108                                     "morning"
109                )
110              )
111              and regex.icontains(strings.replace_confusables(.text),
112                                  '(?:\berror(?:\s+list)?\b|screenshot|report|plan)'
113              )
114              and ml.nlu_classifier(.text).language == "english"
115      )
116    )
117  )  
118
119tags:
120  - "Attack surface reduction"
121attack_types:
122  - "Spam"
123detection_methods:
124  - "Content analysis"
125  - "Sender analysis"
126  - "Natural Language Understanding"
127id: "122ea794-f619-5f29-acb2-83261d8f81fc"

Related rules

to-top