Detection rules › Sublime MQL

Brand impersonation: Robinhood

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

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

Threat classification

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

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

Event coverage

Rule body MQL

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

Detection logic

Scope: inbound message.

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

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

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

Indicators matched (37)

FieldMatchValue
ml.nlu_classifier(body.current_thread.text).entities[].namememberorg
ml.nlu_classifier(body.current_thread.text).entities[].namemembersender
strings.icontainssubstringRobinhood
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscallback_scam
strings.icontainssubstringThe Robinhood Team
regex.icontainsregex©\s*20[0-9]{2}\s*\s*Robinhood
regex.icontainsregex(?:\+?\d{0,2}[\s\-\.]*)?(?:\(?888\)?)[\s\-\.]*344[\s\-\.]*3957
regex.icontainsregexbrokerage clearing (?:service|company|business)
regex.icontainsregexnew passkey was recently added
regex.icontainsregex42 Willow (?:Road|St)
strings.icontainssubstringMenlo Park, CA 97095
regex.icontainsregexLocation:?
25 more
regex.icontainsregexTime:
regex.icontainsregexDevice:?
regex.icontainsregexIP Address:?
regex.icontainsregexDate:
regex.icontainsregexRegion:?
regex.icontainsregexApp:?
regex.icontainsregexEmail ID:?
strings.icontainssubstringnew passkey added
strings.icontainssubstringSecurity support phone number
strings.icontainssubstringhttps://www.facebook.com/robinhood
strings.icontainssubstringhttps://twitter.com/robinhoodapp
strings.icontainssubstringhttps://www.youtube.com/@RobinhoodApp
strings.icontainssubstringhttps://www.instagram.com/robinhood
ml.nlu_classifier(body.current_thread.text).topics[].namememberNewsletters and Digests
ml.nlu_classifier(body.current_thread.text).topics[].namememberHealth and Wellness
ml.nlu_classifier(body.current_thread.text).topics[].namememberEvents and Webinars
ml.nlu_classifier(body.current_thread.text).topics[].confidenceequalshigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalsbenign
ml.nlu_classifier(body.current_thread.text).intents[].confidenceequalshigh
sender.email.domain.root_domainmemberrobinhood.com
sender.email.domain.root_domainmemberrobinhood.org
sender.email.domain.root_domainmemberduck.com
sender.email.domain.root_domainmemberrobinhoodauctions.com
sender.email.domain.root_domainmemberbitstamp.net
sender.email.domain.root_domainmembersinch.com