Detection rules › Sublime MQL

Sublime MQL rules: venmo

RuleSeverity
Venmo payment request abusemedium

Venmo payment request abuse

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

A fraudulent payment request found in the body of the message sent by exploiting Venmo's platform. Callback Phishing is an attempt by an attacker to solicit the victim (recipient) to call a phone number. The resulting interaction could lead to a multitude of attacks ranging from Financial theft, Remote Access Trojan (RAT) Installation or Ransomware Deployment.

Threat classification

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

CategoryValues
Attack typesCallback Phishing, BEC/Fraud
Tactics and techniquesSocial engineering, Impersonation: Brand, Evasion

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

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

Rule body

type.inbound
and length(attachments) == 0
and sender.email.domain.root_domain in ("venmo.com")
and strings.ilike(body.html.display_text, "*requests $*")
and (
  (
    // icontains a phone number
    (
      regex.icontains(strings.replace_confusables(body.current_thread.text),
                      '.*\+?([ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}.*\n'
      )
      or regex.icontains(strings.replace_confusables(body.current_thread.text),
                         '.*\+[ilo0-9]{1,3}[ilo0-9]{10}.*\n'
      )
      // +12028001238
      or regex.icontains(strings.replace_confusables(body.current_thread.text),
                         '.*[ilo0-9]{3}\.[ilo0-9]{3}\.[ilo0-9]{4}.*\n'
      )
      // 202-800-1238
      or regex.icontains(strings.replace_confusables(body.current_thread.text),
                         '.*[ilo0-9]{3}-[ilo0-9]{3}-[ilo0-9]{4}.*\n'
      )
      // (202) 800-1238
      or regex.icontains(strings.replace_confusables(body.current_thread.text),
                         '.*\([ilo0-9]{3}\)[\s-]+[ilo0-9]{3}[\s-]+[ilo0-9]{4}.*\n'
      )
      // (202)-800-1238
      or regex.icontains(strings.replace_confusables(body.current_thread.text),
                         '.*\([ilo0-9]{3}\)-[ilo0-9]{3}-[ilo0-9]{4}.*\n'
      )
      or ( // 8123456789
        regex.icontains(strings.replace_confusables(body.current_thread.text),
                        '.*8[ilo0-9]{9}.*\n'
        )
        and regex.icontains(strings.replace_confusables(body.current_thread.text
                            ),
                            '\+[1l]'
        )
      )
    )
    and (
      (
        4 of (
          strings.ilike(body.html.inner_text, '*you did not*'),
          strings.ilike(body.html.inner_text, '*is not for*'),
          strings.ilike(body.html.inner_text, '*done by you*'),
          regex.icontains(body.html.inner_text, "didn\'t ma[kd]e this"),
          strings.ilike(body.html.inner_text, '*Fruad Alert*'),
          strings.ilike(body.html.inner_text, '*Fraud Alert*'),
          strings.ilike(body.html.inner_text, '*fraudulent*'),
          strings.ilike(body.html.inner_text, '*using your PayPal*'),
          strings.ilike(body.html.inner_text, '*subscription*'),
          strings.ilike(body.html.inner_text, '*antivirus*'),
          strings.ilike(body.html.inner_text, '*order*'),
          strings.ilike(body.html.inner_text, '*support*'),
          strings.ilike(body.html.inner_text, '*sincerely apologize*'),
          strings.ilike(body.html.inner_text, '*receipt*'),
          strings.ilike(body.html.inner_text, '*invoice*'),
          strings.ilike(body.html.inner_text, '*Purchase*'),
          strings.ilike(body.html.inner_text, '*transaction*'),
          strings.ilike(body.html.inner_text, '*Market*Value*'),
          strings.ilike(body.html.inner_text, '*BTC*'),
          strings.ilike(body.html.inner_text, '*call*'),
          strings.ilike(body.html.inner_text, '*get in touch with our*'),
          strings.ilike(body.html.inner_text, '*quickly inform*'),
          strings.ilike(body.html.inner_text, '*quickly reach *'),
          strings.ilike(body.html.inner_text, '*detected unusual transactions*'),
          strings.ilike(body.html.inner_text, '*without your authorization*'),
          strings.ilike(body.html.inner_text, '*cancel*'),
          strings.ilike(body.html.inner_text, '*renew*'),
          strings.ilike(body.html.inner_text, '*refund*'),
          strings.ilike(body.html.inner_text, '*+1*'),
          regex.icontains(body.html.inner_text, 'help.{0,3}desk'),
        )
      )
      or regex.icontains(body.current_thread.text,
                         'note from.{0,50}(?:call|reach|contact|paypal)'
      )
      or any(ml.nlu_classifier(body.current_thread.text).intents,
             .name == "callback_scam"
      )
      or (
        // Unicode confusables words obfuscated in note
        regex.icontains(body.html.inner_text,
                        '\+𝟭|𝗽𝗮𝘆𝗺𝗲𝗻𝘁|𝗛𝗲𝗹𝗽 𝗗𝗲𝘀𝗸|𝗿𝗲𝗳𝘂𝗻𝗱|𝗮𝗻𝘁𝗶𝘃𝗶𝗿𝘂𝘀|𝗰𝗮𝗹𝗹|𝗰𝗮𝗻𝗰𝗲𝗹'
        )
      )
      or strings.ilike(body.html.inner_text, '*kindly*')
    )
  )
)

Detection logic

Scope: inbound message.

A fraudulent payment request found in the body of the message sent by exploiting Venmo's platform. Callback Phishing is an attempt by an attacker to solicit the victim (recipient) to call a phone number. The resulting interaction could lead to a multitude of attacks ranging from Financial theft, Remote Access Trojan (RAT) Installation or Ransomware Deployment.

  1. inbound message
  2. length(attachments) is 0
  3. sender.email.domain.root_domain in ('venmo.com')
  4. body.html.display_text matches '*requests $*'
  5. all of:
    • any of:
      • strings.replace_confusables(body.current_thread.text) matches '.*\\+?([ilo0-9]{1}.)?\\(?[ilo0-9]{3}?\\)?.[ilo0-9]{3}.?[ilo0-9]{4}.*\\n'
      • strings.replace_confusables(body.current_thread.text) matches '.*\\+[ilo0-9]{1,3}[ilo0-9]{10}.*\\n'
      • strings.replace_confusables(body.current_thread.text) matches '.*[ilo0-9]{3}\\.[ilo0-9]{3}\\.[ilo0-9]{4}.*\\n'
      • strings.replace_confusables(body.current_thread.text) matches '.*[ilo0-9]{3}-[ilo0-9]{3}-[ilo0-9]{4}.*\\n'
      • strings.replace_confusables(body.current_thread.text) matches '.*\\([ilo0-9]{3}\\)[\\s-]+[ilo0-9]{3}[\\s-]+[ilo0-9]{4}.*\\n'
      • strings.replace_confusables(body.current_thread.text) matches '.*\\([ilo0-9]{3}\\)-[ilo0-9]{3}-[ilo0-9]{4}.*\\n'
      • all of:
        • strings.replace_confusables(body.current_thread.text) matches '.*8[ilo0-9]{9}.*\\n'
        • strings.replace_confusables(body.current_thread.text) matches '\\+[1l]'
    • any of:
      • at least 4 of 30: body.html.inner_text matches any of 30 patterns
        • *you did not*
        • *is not for*
        • *done by you*
        • didn\'t ma[kd]e this
        • *Fruad Alert*
        • *Fraud Alert*
        • *fraudulent*
        • *using your PayPal*
        • *subscription*
        • *antivirus*
        • *order*
        • *support*
        • *sincerely apologize*
        • *receipt*
        • *invoice*
        • *Purchase*
        • *transaction*
        • *Market*Value*
        • *BTC*
        • *call*
        • *get in touch with our*
        • *quickly inform*
        • *quickly reach *
        • *detected unusual transactions*
        • *without your authorization*
        • *cancel*
        • *renew*
        • *refund*
        • *+1*
        • help.{0,3}desk
      • body.current_thread.text matches 'note from.{0,50}(?:call|reach|contact|paypal)'
      • any of ml.nlu_classifier(body.current_thread.text).intents where:
        • .name is 'callback_scam'
      • body.html.inner_text matches '\\+𝟭|𝗽𝗮𝘆𝗺𝗲𝗻𝘁|𝗛𝗲𝗹𝗽 𝗗𝗲𝘀𝗸|𝗿𝗲𝗳𝘂𝗻𝗱|𝗮𝗻𝘁𝗶𝘃𝗶𝗿𝘂𝘀|𝗰𝗮𝗹𝗹|𝗰𝗮𝗻𝗰𝗲𝗹'
      • body.html.inner_text matches '*kindly*'

Inspects: body.current_thread.text, body.html.display_text, body.html.inner_text, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.ilike, strings.replace_confusables.

Indicators matched (44)

FieldMatchValue
sender.email.domain.root_domainmembervenmo.com
strings.ilikesubstring*requests $*
regex.icontainsregex.*\+?([ilo0-9]{1}.)?\(?[ilo0-9]{3}?\)?.[ilo0-9]{3}.?[ilo0-9]{4}.*\n
regex.icontainsregex.*\+[ilo0-9]{1,3}[ilo0-9]{10}.*\n
regex.icontainsregex.*[ilo0-9]{3}\.[ilo0-9]{3}\.[ilo0-9]{4}.*\n
regex.icontainsregex.*[ilo0-9]{3}-[ilo0-9]{3}-[ilo0-9]{4}.*\n
regex.icontainsregex.*\([ilo0-9]{3}\)[\s-]+[ilo0-9]{3}[\s-]+[ilo0-9]{4}.*\n
regex.icontainsregex.*\([ilo0-9]{3}\)-[ilo0-9]{3}-[ilo0-9]{4}.*\n
regex.icontainsregex.*8[ilo0-9]{9}.*\n
regex.icontainsregex\+[1l]
strings.ilikesubstring*you did not*
strings.ilikesubstring*is not for*
32 more
strings.ilikesubstring*done by you*
regex.icontainsregexdidn\'t ma[kd]e this
strings.ilikesubstring*Fruad Alert*
strings.ilikesubstring*Fraud Alert*
strings.ilikesubstring*fraudulent*
strings.ilikesubstring*using your PayPal*
strings.ilikesubstring*subscription*
strings.ilikesubstring*antivirus*
strings.ilikesubstring*order*
strings.ilikesubstring*support*
strings.ilikesubstring*sincerely apologize*
strings.ilikesubstring*receipt*
strings.ilikesubstring*invoice*
strings.ilikesubstring*Purchase*
strings.ilikesubstring*transaction*
strings.ilikesubstring*Market*Value*
strings.ilikesubstring*BTC*
strings.ilikesubstring*call*
strings.ilikesubstring*get in touch with our*
strings.ilikesubstring*quickly inform*
strings.ilikesubstring*quickly reach *
strings.ilikesubstring*detected unusual transactions*
strings.ilikesubstring*without your authorization*
strings.ilikesubstring*cancel*
strings.ilikesubstring*renew*
strings.ilikesubstring*refund*
strings.ilikesubstring*+1*
regex.icontainsregexhelp.{0,3}desk
regex.icontainsregexnote from.{0,50}(?:call|reach|contact|paypal)
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscallback_scam
regex.icontainsregex\+𝟭|𝗽𝗮𝘆𝗺𝗲𝗻𝘁|𝗛𝗲𝗹𝗽 𝗗𝗲𝘀𝗸|𝗿𝗲𝗳𝘂𝗻𝗱|𝗮𝗻𝘁𝗶𝘃𝗶𝗿𝘂𝘀|𝗰𝗮𝗹𝗹|𝗰𝗮𝗻𝗰𝗲𝗹
strings.ilikesubstring*kindly*

Stages and Predicates

Stage 1: mql_rule

and
  or
    any(ml.nlu_classifier(body.current_thread.text).intents)
      ml.nlu_classifier(body.current_thread.text).intents.name eq "callback_scam"
    body.current_thread.text regex_match "note from.{0,50}(?:call|reach|contact|paypal)"
    body.html.inner_text match "+1"
    body.html.inner_text match "BTC"
    body.html.inner_text match "Fraud Alert"
    body.html.inner_text match "Fruad Alert"
    body.html.inner_text match "Purchase"
    body.html.inner_text match "antivirus"
    body.html.inner_text match "call"
    body.html.inner_text match "cancel"
    body.html.inner_text match "detected unusual transactions"
    body.html.inner_text match "done by you"
    body.html.inner_text match "fraudulent"
    body.html.inner_text match "get in touch with our"
    body.html.inner_text match "invoice"
    body.html.inner_text match "is not for"
    body.html.inner_text match "kindly"
    body.html.inner_text match "order"
    body.html.inner_text match "quickly inform"
    body.html.inner_text match "quickly reach "
    body.html.inner_text match "receipt"
    body.html.inner_text match "refund"
    body.html.inner_text match "renew"
    body.html.inner_text match "sincerely apologize"
    body.html.inner_text match "subscription"
    body.html.inner_text match "support"
    body.html.inner_text match "transaction"
    body.html.inner_text match "using your PayPal"
    body.html.inner_text match "without your authorization"
    body.html.inner_text match "you did not"
    body.html.inner_text regex_match "\\+𝟭|𝗽𝗮𝘆𝗺𝗲𝗻𝘁|𝗛𝗲𝗹𝗽 𝗗𝗲𝘀𝗸|𝗿𝗲𝗳𝘂𝗻𝗱|𝗮𝗻𝘁𝗶𝘃𝗶𝗿𝘂𝘀|𝗰𝗮𝗹𝗹|𝗰𝗮𝗻𝗰𝗲𝗹"
    body.html.inner_text regex_match "didn\\'t ma[kd]e this"
    body.html.inner_text regex_match "help.{0,3}desk"
    body.html.inner_text wildcard "*Market*Value*"
  or
    and
      strings.replace_confusables(body.current_thread.text) regex_match ".*8[ilo0-9]{9}.*\\n"
      strings.replace_confusables(body.current_thread.text) regex_match "\\+[1l]"
    strings.replace_confusables(body.current_thread.text) regex_match ".*[ilo0-9]{3}-[ilo0-9]{3}-[ilo0-9]{4}.*\\n"
    strings.replace_confusables(body.current_thread.text) regex_match ".*[ilo0-9]{3}\\.[ilo0-9]{3}\\.[ilo0-9]{4}.*\\n"
    strings.replace_confusables(body.current_thread.text) regex_match ".*\\([ilo0-9]{3}\\)-[ilo0-9]{3}-[ilo0-9]{4}.*\\n"
    strings.replace_confusables(body.current_thread.text) regex_match ".*\\([ilo0-9]{3}\\)[\\s-]+[ilo0-9]{3}[\\s-]+[ilo0-9]{4}.*\\n"
    strings.replace_confusables(body.current_thread.text) regex_match ".*\\+?([ilo0-9]{1}.)?\\(?[ilo0-9]{3}?\\)?.[ilo0-9]{3}.?[ilo0-9]{4}.*\\n"
    strings.replace_confusables(body.current_thread.text) regex_match ".*\\+[ilo0-9]{1,3}[ilo0-9]{10}.*\\n"
  attachments length_compare "0"
  body.html.display_text match "requests $"
  sender.email.domain.root_domain eq "venmo.com"
  type.inbound eq "true"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
body.current_thread.textregex_match
  • note from.{0,50}(?:call|reach|contact|paypal)
field:"body.current_thread.text" kind:regex_match value:"note from.{0,50}(?:call|reach|contact|paypal)"
body.html.display_textwildcard
  • *requests $*
field:"body.html.display_text" kind:wildcard value:"*requests $*"
body.html.inner_textregex_match
    • +𝟭
    • 𝗽𝗮𝘆𝗺𝗲𝗻𝘁
    • 𝗛𝗲𝗹𝗽 𝗗𝗲𝘀𝗸
    • 𝗿𝗲𝗳𝘂𝗻𝗱
    • 𝗮𝗻𝘁𝗶𝘃𝗶𝗿𝘂𝘀
    • 𝗰𝗮𝗹𝗹
    • 𝗰𝗮𝗻𝗰𝗲𝗹
  • didn\'t ma[kd]e this
  • help.{0,3}desk
field:"body.html.inner_text" kind:regex_match
body.html.inner_textwildcard
  • *+1*
  • *BTC*
  • *Fraud Alert*
  • *Fruad Alert*
  • *Market*Value*
  • *Purchase*
  • *antivirus*
  • *call*
  • *cancel*
  • *detected unusual transactions*
  • *done by you*
  • *fraudulent*
  • *get in touch with our*
  • *invoice*
  • *is not for*
  • *kindly*
  • *order*
  • *quickly inform*
  • *quickly reach *
  • *receipt*
  • *refund*
  • *renew*
  • *sincerely apologize*
  • *subscription*
  • *support*
  • *transaction*
  • *using your PayPal*
  • *without your authorization*
  • *you did not*
field:"body.html.inner_text" kind:wildcard
sender.email.domain.root_domainin
  • venmo.com
field:"sender.email.domain.root_domain" kind:in value:"venmo.com"
strings.replace_confusables(body.current_thread.text)regex_match
  • .*8[ilo0-9]{9}.*\n
  • .*[ilo0-9]{3}-[ilo0-9]{3}-[ilo0-9]{4}.*\n
  • .*[ilo0-9]{3}.[ilo0-9]{3}.[ilo0-9]{4}.*\n
  • .*([ilo0-9]{3})-[ilo0-9]{3}-[ilo0-9]{4}.*\n
  • .*([ilo0-9]{3})[\s-]+[ilo0-9]{3}[\s-]+[ilo0-9]{4}.*\n
  • .*+?([ilo0-9]{1}.)?(?[ilo0-9]{3}?)?.[ilo0-9]{3}.?[ilo0-9]{4}.*\n
  • .*+[ilo0-9]{1,3}[ilo0-9]{10}.*\n
  • +[1l]
field:"strings.replace_confusables(body.current_thread.text)" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"