Detection rules › Sublime MQL

Brand impersonation: Adobe Sign with suspicious indicators

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

Detects messages impersonating Adobe Sign that contain Adobe branding elements but are not sent from legitimate Adobe domains and lack proper Adobe Sign authentication headers.

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 (
  (
    length(filter(attachments, .file_type == "pdf")) == 0
    and (
      regex.icontains(body.html.raw,
                      'alt="Adobe(?: Acrobat)? Sign"',
                      "adobe-sign-logo.{0,20}.png",
                      'alt="Powered by Adobe Acrobat Sign"'
      )
      or any(html.xpath(body.html, "//img/@src").nodes,
             strings.parse_url(.raw).domain.root_domain == "adobesign.com"
             and (
               strings.istarts_with(strings.parse_url(.raw).path,
                                    "/cobrand_logo/"
               )
               or strings.icontains(strings.parse_url(.raw).path,
                                    "checkmarkCircle"
               )
             )
      )
    )
  )
  or (
    any(attachments,
        .file_type == "pdf"
        and any(file.explode(.),
                any(.scan.url.urls,
                    regex.icontains(.url,
                                    '(?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn)'
                    )
                )
        )
    )
  )
)
and not (
  // inspect the "oldest" thread, negate where that thread is the original Adobe Sign email (based on link domains)
  (
    length(body.previous_threads[length(body.previous_threads) - 1].links) > 0
    and all(body.previous_threads[length(body.previous_threads) - 1].links,
            .href_url.domain.root_domain in (
              "aka.ms",
              "adobe.com",
              "adobesign.com",
              "echosign.com",
              "adobesignsandbox.com",
              "mimecastprotect.com",
              "mimecast.com"
            )
            or .href_url.domain.root_domain in $org_domains
            or .href_url.domain.root_domain == sender.email.domain.root_domain
            or any(recipients.to,
                   .email.domain.root_domain == ..href_url.domain.root_domain
            )
    )
  )
  // legit review button
  or any(body.links,
         .display_text in (
           "Review and sign",
           "the document",
           "Open agreement",
           "VIEW DOCUMENTS",
           "Click here to review and sign"
         )
         and (
           .href_url.domain.root_domain in (
             "adobe.com",
             "adobesign.com",
             "echosign.com",
             "adobesignsandbox.com",
           )
           // Mimecast link logic
           or (
             .href_url.domain.root_domain in (
               "mimecastprotect.com",
               "mimecast.com"
             )
             and any(.href_url.query_params_decoded['domain'],
                     strings.parse_domain(.).root_domain in (
                       "adobe.com",
                       "adobesign.com",
                       "echosign.com",
                       "adobesignsandbox.com",
                     )
             )
           )
         )
  )
  // accidental recipient
  or any(recipients.to, .email.email == "adobesign@adobesign.com")
  // known Adobe Sign messaage ID formats
  or (
    (length(headers.references) > 1 or length(body.previous_threads) != 0)
    and regex.imatch(headers.references[0],
                     '[0-9]{9,10}\.[0-9]{4,6}\.[0-9]{13}@event-consumer-prod-[a-z]-[a-z0-9]{7,10}-[a-z0-9]{5}',
                     '[0-9]{8,10}\.[0-9]{5,7}\.[0-9]{13}@(webapp|job)-prod-.*$',
                     '[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-APO-PRODHIPAA@apo-p-h'
    )
  )
  // negate Adobe Sign messages from custom domains
  or any(headers.hops,
         any(.fields, .name in ("Adobesigneventid", "Agreementid"))
  )
)
and not (
  sender.email.domain.root_domain in (
    "adobe.com",
    "adobesign.com",
    "adobesignsandbox.com",
    "echosign.com",
    // ticketing software that embeds emails
    "helpscout.net"
  )
  and headers.auth_summary.dmarc.pass
)
and (
  (
    sender.email.domain.root_domain in $high_trust_sender_root_domains
    and not headers.auth_summary.dmarc.pass
  )
  or sender.email.domain.root_domain not in $high_trust_sender_root_domains
)

Detection logic

Scope: inbound message.

Detects messages impersonating Adobe Sign that contain Adobe branding elements but are not sent from legitimate Adobe domains and lack proper Adobe Sign authentication headers.

  1. inbound message
  2. any of:
    • all of:
      • length(filter(attachments, .file_type == 'pdf')) is 0
      • any of:
        • body.html.raw matches any of 3 patterns
          • alt="Adobe(?: Acrobat)? Sign"
          • adobe-sign-logo.{0,20}.png
          • alt="Powered by Adobe Acrobat Sign"
        • any of html.xpath(body.html, '//img/@src').nodes where all hold:
          • strings.parse_url(.raw).domain.root_domain is 'adobesign.com'
          • any of:
            • strings.parse_url(.raw).path starts with '/cobrand_logo/'
            • strings.parse_url(.raw).path contains 'checkmarkCircle'
    • any of attachments where all hold:
      • .file_type is 'pdf'
      • any of file.explode(.) where:
        • any of .scan.url.urls where:
          • .url matches '(?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn)'
  3. none of:
    • all of:
      • length(body.previous_threads[].links) > 0
      • all of body.previous_threads[].links where any holds:
        • .href_url.domain.root_domain in ('aka.ms', 'adobe.com', 'adobesign.com', 'echosign.com', 'adobesignsandbox.com', 'mimecastprotect.com', 'mimecast.com')
        • .href_url.domain.root_domain in $org_domains
        • .href_url.domain.root_domain is sender.email.domain.root_domain
        • any of recipients.to where:
          • .email.domain.root_domain is .href_url.domain.root_domain
    • any of body.links where all hold:
      • .display_text in ('Review and sign', 'the document', 'Open agreement', 'VIEW DOCUMENTS', 'Click here to review and sign')
      • any of:
        • .href_url.domain.root_domain in ('adobe.com', 'adobesign.com', 'echosign.com', 'adobesignsandbox.com')
        • all of:
          • .href_url.domain.root_domain in ('mimecastprotect.com', 'mimecast.com')
          • any of .href_url.query_params_decoded['domain'] where:
            • strings.parse_domain(.).root_domain in ('adobe.com', 'adobesign.com', 'echosign.com', 'adobesignsandbox.com')
    • any of recipients.to where:
      • .email.email is 'adobesign@adobesign.com'
    • all of:
      • any of:
        • length(headers.references) > 1
        • length(body.previous_threads) is not 0
      • headers.references[0] matches any of 3 patterns
        • [0-9]{9,10}\.[0-9]{4,6}\.[0-9]{13}@event-consumer-prod-[a-z]-[a-z0-9]{7,10}-[a-z0-9]{5}
        • [0-9]{8,10}\.[0-9]{5,7}\.[0-9]{13}@(webapp|job)-prod-.*$
        • [a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-APO-PRODHIPAA@apo-p-h
    • any of headers.hops where:
      • any of .fields where:
        • .name in ('Adobesigneventid', 'Agreementid')
  4. not:
    • all of:
      • sender.email.domain.root_domain in ('adobe.com', 'adobesign.com', 'adobesignsandbox.com', 'echosign.com', 'helpscout.net')
      • headers.auth_summary.dmarc.pass
  5. any of:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • not:
        • headers.auth_summary.dmarc.pass
    • sender.email.domain.root_domain not in $high_trust_sender_root_domains

Inspects: attachments[].file_type, body.html, body.html.raw, body.links, body.links[].display_text, body.links[].href_url.domain.root_domain, body.links[].href_url.query_params_decoded['domain'], body.previous_threads, body.previous_threads[].links, body.previous_threads[].links[].href_url.domain.root_domain, headers.auth_summary.dmarc.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.references, headers.references[0], recipients.to, recipients.to[].email.domain.root_domain, recipients.to[].email.email, sender.email.domain.root_domain, type.inbound. Sensors: file.explode, html.xpath, regex.icontains, regex.imatch, strings.icontains, strings.istarts_with, strings.parse_domain, strings.parse_url. Reference lists: $high_trust_sender_root_domains, $org_domains.

Indicators matched (36)

FieldMatchValue
attachments[].file_typeequalspdf
regex.icontainsregexalt="Adobe(?: Acrobat)? Sign"
regex.icontainsregexadobe-sign-logo.{0,20}.png
regex.icontainsregexalt="Powered by Adobe Acrobat Sign"
strings.istarts_withprefix/cobrand_logo/
strings.icontainssubstringcheckmarkCircle
regex.icontainsregex(?:ad0be.{0,5}s[1i]gn|ad[0o]be.{0,5}s1gn)
body.previous_threads[].links[].href_url.domain.root_domainmemberaka.ms
body.previous_threads[].links[].href_url.domain.root_domainmemberadobe.com
body.previous_threads[].links[].href_url.domain.root_domainmemberadobesign.com
body.previous_threads[].links[].href_url.domain.root_domainmemberechosign.com
body.previous_threads[].links[].href_url.domain.root_domainmemberadobesignsandbox.com
24 more
body.previous_threads[].links[].href_url.domain.root_domainmembermimecastprotect.com
body.previous_threads[].links[].href_url.domain.root_domainmembermimecast.com
body.links[].display_textmemberReview and sign
body.links[].display_textmemberthe document
body.links[].display_textmemberOpen agreement
body.links[].display_textmemberVIEW DOCUMENTS
body.links[].display_textmemberClick here to review and sign
body.links[].href_url.domain.root_domainmemberadobe.com
body.links[].href_url.domain.root_domainmemberadobesign.com
body.links[].href_url.domain.root_domainmemberechosign.com
body.links[].href_url.domain.root_domainmemberadobesignsandbox.com
body.links[].href_url.domain.root_domainmembermimecastprotect.com
body.links[].href_url.domain.root_domainmembermimecast.com
recipients.to[].email.emailequalsadobesign@adobesign.com
regex.imatchregex[0-9]{9,10}\.[0-9]{4,6}\.[0-9]{13}@event-consumer-prod-[a-z]-[a-z0-9]{7,10}-[a-z0-9]{5}
regex.imatchregex[0-9]{8,10}\.[0-9]{5,7}\.[0-9]{13}@(webapp|job)-prod-.*$
regex.imatchregex[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-APO-PRODHIPAA@apo-p-h
headers.hops[].fields[].namememberAdobesigneventid
headers.hops[].fields[].namememberAgreementid
sender.email.domain.root_domainmemberadobe.com
sender.email.domain.root_domainmemberadobesign.com
sender.email.domain.root_domainmemberadobesignsandbox.com
sender.email.domain.root_domainmemberechosign.com
sender.email.domain.root_domainmemberhelpscout.net