Detection rules › Sublime MQL

Brand impersonation: Zoom

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

Detects messages impersonating Zoom through social footers, webinar links, and suspicious domain pattern matching. The rule looks for specific combinations of social media links, redirects, and content analysis to identify inauthentic Zoom-branded messages not originating from legitimate Zoom domains.

Threat classification

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

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

Event coverage

Rule body MQL

type.inbound
and (
  // the social links in the footer
  3 of (
    any(body.links, strings.icontains(.href_url.url, "twitter.com/zoom")),
    any(body.links,
        strings.icontains(.href_url.url,
                          "linkedin.com/company/zoom-video-communications"
        )
    ),
    any(body.links, strings.icontains(.href_url.url, "blog.zoom.us")),
    strings.ilike(body.html.raw,
                  '*https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*'
    ),
    strings.ilike(body.html.raw,
                  '*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*'
    ),
    strings.ilike(body.html.raw,
                  '*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*'
    )
  )
  or (
    strings.ilike(body.html.raw,
                  '*https://st1.zoom.us/homepage/publish/_nuxt/social_icons_footer*.png*'
    )
  )
  or (
    length(beta.ml_topic(body.html.display_text).topics) == 1
    and all(beta.ml_topic(body.html.display_text).topics,
            .name in ("Events and Webinars", "Software and App Updates")
            and .confidence != "low"
    )
    and any(ml.logo_detect(file.message_screenshot()).brands,
            .name == "Zoom" and .confidence == "high"
    )
    and any(body.links,
            any(ml.nlu_classifier(.display_text).intents,
                .name == "cred_theft" and .confidence == "high"
            )
    )
  )
  or (
    any(body.links,
        // link claims to go to a Zoom domain, but does not
        (
          .display_url.domain.root_domain in ("zoom.us", "zoom.com")
          or strings.icontains(.display_text, "zoom.us")
          or strings.icontains(.display_text, "zoom.com")
        )
        and .href_url.domain.root_domain not in ("zoom.us", "zoom.com")
        and (
          .href_url.domain.tld in $suspicious_tlds
          // country code second-level domain
          or strings.istarts_with(.href_url.domain.tld, "com.")
          or (
            (
              length(ml.link_analysis(.).files_downloaded) > 0
              // Zoom logo on page
              or ml.link_analysis(.).credphish.brand.name == "Zoom"
              // blocked by a Cloudflare CAPTCHA
              or strings.icontains(ml.link_analysis(.).final_dom.raw,
                                   'https://challenges.cloudflare.com/turnstile/',
              )
            )
            and ml.link_analysis(.).effective_url.domain.root_domain not in (
              "zoom.us",
              "zoom.com"
            )
          )
        )
    )
  )
)
// negate auto-generated meeting summaries
and not (
  strings.icontains(body.current_thread.text, "meeting summary")
  and strings.icontains(body.current_thread.text,
                        "AI-generated content may be inaccurate or misleading."
  )
)
and not (
  (
    strings.istarts_with(subject.subject, "RE:")
    or strings.istarts_with(subject.subject, "R:")
    or strings.istarts_with(subject.subject, "ODG:")
    or strings.istarts_with(subject.subject, "答复:")
    or strings.istarts_with(subject.subject, "AW:")
    or strings.istarts_with(subject.subject, "TR:")
    or strings.istarts_with(subject.subject, "FWD:")
    or regex.imatch(subject.subject, '(\[[^\]]+\]\s?){0,3}(re|fwd?)\s?:')
    or regex.imatch(subject.subject,
                    '^\[?(EXT|EXTERNAL)\]?[: ]\s*(RE|FWD?|FW|AW|TR|ODG|答复):.*'
    )
  )
  and (length(headers.references) > 0 or headers.in_reply_to is not null)
)
// Not from a legitimate Zoom domain
and not (
  sender.email.domain.root_domain in (
    "zoom.us",
    "zuora.com",
    "zoomgov.com",
    "zoom.com",
    "zoom-x.de"
  )
  and headers.auth_summary.dmarc.pass
)

Detection logic

Scope: inbound message.

Detects messages impersonating Zoom through social footers, webinar links, and suspicious domain pattern matching. The rule looks for specific combinations of social media links, redirects, and content analysis to identify inauthentic Zoom-branded messages not originating from legitimate Zoom domains.

  1. inbound message
  2. any of:
    • at least 3 of:
      • any of body.links where:
        • .href_url.url contains 'twitter.com/zoom'
      • any of body.links where:
        • .href_url.url contains 'linkedin.com/company/zoom-video-communications'
      • any of body.links where:
        • .href_url.url contains 'blog.zoom.us'
      • body.html.raw matches '*https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*'
      • body.html.raw matches '*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*'
      • body.html.raw matches '*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*'
    • body.html.raw matches '*https://st1.zoom.us/homepage/publish/_nuxt/social_icons_footer*.png*'
    • all of:
      • length(beta.ml_topic(body.html.display_text).topics) is 1
      • all of beta.ml_topic(body.html.display_text).topics where all hold:
        • .name in ('Events and Webinars', 'Software and App Updates')
        • .confidence is not 'low'
      • any of ml.logo_detect(file.message_screenshot()).brands where all hold:
        • .name is 'Zoom'
        • .confidence is 'high'
      • any of body.links where:
        • any of ml.nlu_classifier(.display_text).intents where all hold:
          • .name is 'cred_theft'
          • .confidence is 'high'
    • any of body.links where all hold:
      • any of:
        • .display_url.domain.root_domain in ('zoom.us', 'zoom.com')
        • .display_text contains 'zoom.us'
        • .display_text contains 'zoom.com'
      • .href_url.domain.root_domain not in ('zoom.us', 'zoom.com')
      • any of:
        • .href_url.domain.tld in $suspicious_tlds
        • .href_url.domain.tld starts with 'com.'
        • all of:
          • any of:
            • length(ml.link_analysis(.).files_downloaded) > 0
            • ml.link_analysis(.).credphish.brand.name is 'Zoom'
            • ml.link_analysis(.).final_dom.raw contains 'https://challenges.cloudflare.com/turnstile/'
          • ml.link_analysis(.).effective_url.domain.root_domain not in ('zoom.us', 'zoom.com')
  3. not:
    • all of:
      • body.current_thread.text contains 'meeting summary'
      • body.current_thread.text contains 'AI-generated content may be inaccurate or misleading.'
  4. not:
    • all of:
      • any of:
        • subject.subject starts with 'RE:'
        • subject.subject starts with 'R:'
        • subject.subject starts with 'ODG:'
        • subject.subject starts with '答复:'
        • subject.subject starts with 'AW:'
        • subject.subject starts with 'TR:'
        • subject.subject starts with 'FWD:'
        • subject.subject matches '(\\[[^\\]]+\\]\\s?){0,3}(re|fwd?)\\s?:'
        • subject.subject matches '^\\[?(EXT|EXTERNAL)\\]?[: ]\\s*(RE|FWD?|FW|AW|TR|ODG|答复):.*'
      • any of:
        • length(headers.references) > 0
        • headers.in_reply_to is set
  5. not:
    • all of:
      • sender.email.domain.root_domain in ('zoom.us', 'zuora.com', 'zoomgov.com', 'zoom.com', 'zoom-x.de')
      • headers.auth_summary.dmarc.pass

Inspects: body.current_thread.text, body.html.display_text, body.html.raw, body.links, body.links[].display_text, body.links[].display_url.domain.root_domain, body.links[].href_url.domain.root_domain, body.links[].href_url.domain.tld, body.links[].href_url.url, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: beta.ml_topic, file.message_screenshot, ml.link_analysis, ml.logo_detect, ml.nlu_classifier, regex.imatch, strings.icontains, strings.ilike, strings.istarts_with. Reference lists: $suspicious_tlds.

Indicators matched (37)

FieldMatchValue
strings.icontainssubstringtwitter.com/zoom
strings.icontainssubstringlinkedin.com/company/zoom-video-communications
strings.icontainssubstringblog.zoom.us
strings.ilikesubstring*https://go.pardot.com/l/84442/*/*/84442/*/twitter.png*
strings.ilikesubstring*https://go.pardot.com/l/84442/*/*/84442/*/linkedin.png*
strings.ilikesubstring*https://go.pardot.com/l/84442/*/*/84442/*/zoomblog.png*
strings.ilikesubstring*https://st1.zoom.us/homepage/publish/_nuxt/social_icons_footer*.png*
beta.ml_topic(body.html.display_text).topics[].namememberEvents and Webinars
beta.ml_topic(body.html.display_text).topics[].namememberSoftware and App Updates
ml.logo_detect(file.message_screenshot()).brands[].nameequalsZoom
ml.logo_detect(file.message_screenshot()).brands[].confidenceequalshigh
ml.nlu_classifier(body.links[].display_text).intents[].nameequalscred_theft
25 more
ml.nlu_classifier(body.links[].display_text).intents[].confidenceequalshigh
body.links[].display_url.domain.root_domainmemberzoom.us
body.links[].display_url.domain.root_domainmemberzoom.com
strings.icontainssubstringzoom.us
strings.icontainssubstringzoom.com
body.links[].href_url.domain.root_domainmemberzoom.us
body.links[].href_url.domain.root_domainmemberzoom.com
strings.istarts_withprefixcom.
strings.icontainssubstringhttps://challenges.cloudflare.com/turnstile/
strings.icontainssubstringmeeting summary
strings.icontainssubstringAI-generated content may be inaccurate or misleading.
strings.istarts_withprefixRE:
strings.istarts_withprefixR:
strings.istarts_withprefixODG:
strings.istarts_withprefix答复:
strings.istarts_withprefixAW:
strings.istarts_withprefixTR:
strings.istarts_withprefixFWD:
regex.imatchregex(\[[^\]]+\]\s?){0,3}(re|fwd?)\s?:
regex.imatchregex^\[?(EXT|EXTERNAL)\]?[: ]\s*(RE|FWD?|FW|AW|TR|ODG|答复):.*
sender.email.domain.root_domainmemberzoom.us
sender.email.domain.root_domainmemberzuora.com
sender.email.domain.root_domainmemberzoomgov.com
sender.email.domain.root_domainmemberzoom.com
sender.email.domain.root_domainmemberzoom-x.de