Detection rules › Sublime MQL

Brand impersonation: Adobe (QR code)

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

Detects messages using Adobe image based lures, referencing or including a QR code from an Unsolicited sender. These messages often lead users to phishing sites or initiate unwanted downloads.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, PDF, QR code

Event coverage

Rule body MQL

type.inbound
and (
  any(attachments,
      (.file_type in $file_types_images or .file_type == "pdf")
      and (
        any(ml.logo_detect(.).brands,
            .name == "Adobe" and .confidence in ("medium", "high")
        )
        or any(ml.logo_detect(file.message_screenshot()).brands,
               .name == "Adobe"
        )
        or any(file.explode(.),
               any(.scan.strings.strings,
                   regex.icontains(., "adobe (acrobat|sign)")
                   // negate PDF data, like "xmp:CreatorTool>Adobe Acrobat Pro (64-bit) 24.4.20272</xmp:CreatorTool>"
                   and not regex.icontains(.,
                                           "(creatortool|producer|creator).{1,5}adobe acrobat"
                   )
               )
        )
      )
  )
  or any(attachments,
         .file_extension in $file_extensions_macros
         and any(file.explode(.), .depth == 0 and .scan.docx.image_count > 0)
         and any(file.explode(.),
                 any(.scan.strings.strings, strings.ilike(., "*adobe*"))
         )
  )
)
and any(attachments,
        (
          .file_type in $file_types_images
          or .file_type == "pdf"
          or .file_type in $file_extensions_macros
        )
        and (
          any(file.explode(.),
              regex.icontains(.scan.ocr.raw, 'scan|camera')
              and regex.icontains(.scan.ocr.raw, '\bQR\b|Q\.R\.|barcode')
          )
          or (
            any(file.explode(.),
                .scan.qr.type == "url"
                // recipient email address is present in the URL, a common tactic used in credential phishing attacks 
                and any(recipients.to,
                        (
                          (
                            .email.domain.valid
                            and (
                              strings.icontains(..scan.qr.data, .email.email)
                              or any(beta.scan_base64(..scan.qr.data,
                                                      format="url"
                                     ),
                                     strings.icontains(., ..email.email)
                              )
                            )
                          )
                          or strings.icontains(.display_name, "undisclosed")
                        )

                        // the recipients sld is in the senders display name
                        or any(recipients.to,
                               strings.icontains(sender.display_name,
                                                 .email.domain.sld
                               )
                        )

                        // the recipient local is in the body  
                        or any(recipients.to,
                               strings.icontains(body.current_thread.text,
                                                 .email.local_part
                               )
                        )

                        // or the body is null 
                        or body.current_thread.text is null
                        or body.current_thread.text == ""

                        // or the subject contains authentication/urgency verbiage
                        or regex.contains(subject.subject,
                                          "(Authenticat(e|or|ion)|2fa|Multi.Factor|(qr|bar).code|action.require|alert|Att(n|ention):)"
                        )

                        // high confidence cred theft in body
                        or any(ml.nlu_classifier(body.current_thread.text).intents,
                               .name == "cred_theft" and .confidence in ("high")
                        )
                )
            )
          )
        )
)
and (
  not any(headers.hops,
          .authentication_results.compauth.verdict is not null
          and .authentication_results.compauth.verdict == "pass"
          and sender.email.domain.root_domain in (
            "acrobat.com",
            "adobecc.com",
            "adobecces.com",
            "adobeccstatic.com",
            "adobe.com",
            "adobeexchange.com",
            "adobe-identity.com",
            "adobe.io",
            "adobejanus.com",
            "adobelogin.com",
            "adobe.net",
            "adobeprojectm.com",
            "adoberesources.net",
            "adobesc.com",
            "adobesign.com",
            "adobestock.com",
            "createjs.com",
            "licensingstack.com",
            "myportfolio.com",
            "photoshop.com",
            "typekit.com",
            "typekit.net"
          )
  )
)

// negate highly trusted sender domains unless they fail DMARC authentication
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 using Adobe image based lures, referencing or including a QR code from an Unsolicited sender. These messages often lead users to phishing sites or initiate unwanted downloads.

  1. inbound message
  2. any of:
    • any of attachments where all hold:
      • any of:
        • .file_type in $file_types_images
        • .file_type is 'pdf'
      • any of:
        • any of ml.logo_detect(.).brands where all hold:
          • .name is 'Adobe'
          • .confidence in ('medium', 'high')
        • any of ml.logo_detect(file.message_screenshot()).brands where:
          • .name is 'Adobe'
        • any of file.explode(.) where:
          • any of .scan.strings.strings where all hold:
            • . matches 'adobe (acrobat|sign)'
            • not:
              • . matches '(creatortool|producer|creator).{1,5}adobe acrobat'
    • any of attachments where all hold:
      • .file_extension in $file_extensions_macros
      • any of file.explode(.) where all hold:
        • .depth is 0
        • .scan.docx.image_count > 0
      • any of file.explode(.) where:
        • any of .scan.strings.strings where:
          • . matches '*adobe*'
  3. any of attachments where all hold:
    • any of:
      • .file_type in $file_types_images
      • .file_type is 'pdf'
      • .file_type in $file_extensions_macros
    • any of:
      • any of file.explode(.) where all hold:
        • .scan.ocr.raw matches 'scan|camera'
        • .scan.ocr.raw matches '\\bQR\\b|Q\\.R\\.|barcode'
      • any of file.explode(.) where all hold:
        • .scan.qr.type is 'url'
        • any of recipients.to where any holds:
          • any of:
            • all of:
              • .email.domain.valid
              • any of:
                • strings.icontains(.scan.qr.data)
                • any of beta.scan_base64(.scan.qr.data) where:
                  • strings.icontains(.)
            • .display_name contains 'undisclosed'
          • any of recipients.to where:
            • strings.icontains(sender.display_name)
          • any of recipients.to where:
            • strings.icontains(body.current_thread.text)
          • body.current_thread.text is missing
          • body.current_thread.text is ''
          • subject.subject matches '(Authenticat(e|or|ion)|2fa|Multi.Factor|(qr|bar).code|action.require|alert|Att(n|ention):)'
          • any of ml.nlu_classifier(body.current_thread.text).intents where all hold:
            • .name is 'cred_theft'
            • .confidence in ('high')
  4. not:
    • any of headers.hops where all hold:
      • .authentication_results.compauth.verdict is set
      • .authentication_results.compauth.verdict is 'pass'
      • sender.email.domain.root_domain in ('acrobat.com', 'adobecc.com', 'adobecces.com', 'adobeccstatic.com', 'adobe.com', 'adobeexchange.com', 'adobe-identity.com', 'adobe.io', 'adobejanus.com', 'adobelogin.com', 'adobe.net', 'adobeprojectm.com', 'adoberesources.net', 'adobesc.com', 'adobesign.com', 'adobestock.com', 'createjs.com', 'licensingstack.com', 'myportfolio.com', 'photoshop.com', 'typekit.com', 'typekit.net')
  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_extension, attachments[].file_type, body.current_thread.text, headers.auth_summary.dmarc.pass, headers.hops, headers.hops[].authentication_results.compauth.verdict, recipients.to, recipients.to[].display_name, recipients.to[].email.domain.sld, recipients.to[].email.domain.valid, recipients.to[].email.email, recipients.to[].email.local_part, sender.display_name, sender.email.domain.root_domain, subject.subject, type.inbound. Sensors: beta.scan_base64, file.explode, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, regex.contains, regex.icontains, strings.icontains, strings.ilike. Reference lists: $file_extensions_macros, $file_types_images, $high_trust_sender_root_domains.

Indicators matched (39)

FieldMatchValue
attachments[].file_typeequalspdf
ml.logo_detect(attachments[]).brands[].nameequalsAdobe
ml.logo_detect(attachments[]).brands[].confidencemembermedium
ml.logo_detect(attachments[]).brands[].confidencememberhigh
ml.logo_detect(file.message_screenshot()).brands[].nameequalsAdobe
regex.icontainsregexadobe (acrobat|sign)
regex.icontainsregex(creatortool|producer|creator).{1,5}adobe acrobat
strings.ilikesubstring*adobe*
regex.icontainsregexscan|camera
regex.icontainsregex\bQR\b|Q\.R\.|barcode
file.explode(attachments[])[].scan.qr.typeequalsurl
strings.icontainssubstringundisclosed
27 more
body.current_thread.textequals
regex.containsregex(Authenticat(e|or|ion)|2fa|Multi.Factor|(qr|bar).code|action.require|alert|Att(n|ention):)
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
ml.nlu_classifier(body.current_thread.text).intents[].confidencememberhigh
headers.hops[].authentication_results.compauth.verdictequalspass
sender.email.domain.root_domainmemberacrobat.com
sender.email.domain.root_domainmemberadobecc.com
sender.email.domain.root_domainmemberadobecces.com
sender.email.domain.root_domainmemberadobeccstatic.com
sender.email.domain.root_domainmemberadobe.com
sender.email.domain.root_domainmemberadobeexchange.com
sender.email.domain.root_domainmemberadobe-identity.com
sender.email.domain.root_domainmemberadobe.io
sender.email.domain.root_domainmemberadobejanus.com
sender.email.domain.root_domainmemberadobelogin.com
sender.email.domain.root_domainmemberadobe.net
sender.email.domain.root_domainmemberadobeprojectm.com
sender.email.domain.root_domainmemberadoberesources.net
sender.email.domain.root_domainmemberadobesc.com
sender.email.domain.root_domainmemberadobesign.com
sender.email.domain.root_domainmemberadobestock.com
sender.email.domain.root_domainmembercreatejs.com
sender.email.domain.root_domainmemberlicensingstack.com
sender.email.domain.root_domainmembermyportfolio.com
sender.email.domain.root_domainmemberphotoshop.com
sender.email.domain.root_domainmembertypekit.com
sender.email.domain.root_domainmembertypekit.net