Detection rules › Sublime MQL

Link: Multistage landing - Abused Adobe frame.io

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

The detection rule matches on message groups which make use of Adobe's frame.io as a landing page. The landing page contains links which are newly registered, use free file or subdomain hosts, url shortners or when visited are phishing pages, lead to a captcha or redirect to a well-known domain, seen in evasion tactics.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesEvasion, Free file host

Event coverage

Rule body MQL

type.inbound
and sender.email.domain.domain == "frame.io"
// these messages contain no email address of the actual sender
// so sender profile won't be interesting
// however the subject and sender display names do contain the name of the frame.io account
// which sent the share

// negate where internal employees might have sent the message
and not any($org_display_names, strings.istarts_with(subject.subject, .))

// limiting scope to just "shares" in subject
and strings.icontains(subject.subject, ' shared ')

// the subject contains the name of the file that has been shared
// the body does not contain the name shared depending on how it's shared, 
// let us use the suspicious file shares from sharepoint here
// https://github.com/sublime-security/sublime-rules/blob/main/detection-rules/link_sharepoint_sus_name.yml
and (
  (
    // file sharing service references
    strings.icontains(subject.subject, 'dropbox')
    or strings.icontains(subject.subject, 'docusign')

    // file name lures
    // secure theme
    or regex.icontains(subject.subject, 'secured?.*(?:file|document|docs|fax)')
    or regex.icontains(subject.subject, 'important.*(?:file|document|docs|fax)')
    or regex.icontains(subject.subject, 'shared?.*(?:file|document|docs|fax)')
    or regex.icontains(subject.subject, 'protected.*(?:file|document|docs|fax)')
    or regex.icontains(subject.subject, 'encrypted.*(?:file|document|docs|fax)')

    // scanner theme
    or strings.icontains(subject.subject, 'scanne[rd]_')
    // image themed
    or strings.icontains(subject.subject, '_IMG_')
    or regex.icontains(subject.subject, '^IMG[_-](?:\d|\W)+$')

    // digits
    or regex.icontains(subject.subject, 'doc(?:ument)?\s?\d+$')
    or regex.icontains(subject.subject, '^\d+$')

    // onedrive theme
    or strings.icontains(subject.subject, 'one_docx')
    or strings.icontains(subject.subject, 'OneDrive')
    or regex.icontains(subject.subject, 'A document.*One.?Drive')

    // action in file name
    or strings.icontains(subject.subject, 'click here')
    or strings.icontains(subject.subject, 'Download PDF')
    or strings.icontains(subject.subject, 'Validate')

    // limited file name to "confidential"
    or subject.subject =~ 'Confidentiality'
    or subject.subject =~ 'Confidential'

    // invoice themes
    or any(ml.nlu_classifier(subject.subject).entities, .name == "financial")
    or strings.icontains(subject.subject, 'payment')
    or strings.icontains(subject.subject, 'invoice')
    or regex.icontains(subject.subject, 'INV(?:_|\s)?\d+$')
    // starts with INV_ or INV\x20
    or regex.icontains(subject.subject, '^INV(?:_|\s)')
    or regex.icontains(subject.subject, 'P[O0]\W+?\d+$')
    or strings.icontains(subject.subject, 'receipt')
    or strings.icontains(subject.subject, 'billing')
    or (
      strings.icontains(subject.subject, 'statement')
      and not subject.subject =~ "Privacy Statement"
    )
    or strings.icontains(subject.subject, 'Past Due')
    or regex.icontains(subject.subject, 'Remit(tance)?')
    or strings.icontains(subject.subject, 'Purchase Order')

    // contract language
    or strings.icontains(subject.subject, 'settlement')
    or strings.icontains(subject.subject, 'contract agreement')
    or regex.icontains(subject.subject, 'Pr[0o]p[0o]sal')
    or strings.icontains(subject.subject, 'contract doc')
  )
  or any(filter(body.links,
                .href_url.domain.root_domain == "frame.io"
                and (
                  strings.starts_with(.href_url.path, '/reviews/')
                  or strings.starts_with(.href_url.path, '/presentations/')
                )
         ),
         // when visiting the page on frame.io, the links contain
         // indications of being suspicious
         any(filter(ml.link_analysis(.).final_dom.links,
                    // remove links that are within frame.io or their default page
                    .href_url.domain.root_domain not in (
                      'frame.io',
                      'f.io',
                      'onetrust.com'
                    )
             ),
             (
               // any of those links domains are new
               network.whois(.href_url.domain).days_old < 30

               // go to free file hosts
               or .href_url.domain.root_domain in $free_file_hosts
               or .href_url.domain.domain in $free_file_hosts

               // go to free subdomains hosts
               or (
                 .href_url.domain.root_domain in $free_subdomain_hosts
                 // where there is a subdomain
                 and .href_url.domain.subdomain is not null
                 and .href_url.domain.subdomain != "www"
               )
               // go to url shortners
               or .href_url.domain.root_domain in $url_shorteners
               or .href_url.domain.root_domain in $social_landing_hosts
               or .href_url.domain.domain in $url_shorteners
               or .href_url.domain.domain in $social_landing_hosts
               or (
                 // find any links that mention common "action" words
                 regex.icontains(subject.subject,
                                 '(?:view|click|show|access|download|goto|Validate|Va[il]idar|login|verify|account)'
                 )
                 and (
                   // and when visiting those links, are phishing
                   ml.link_analysis(., mode="aggressive").credphish.disposition == "phishing"

                   // hit a captcha page
                   or ml.link_analysis(., mode="aggressive").credphish.contains_captcha

                   // or the page redirects to common website, observed when evasion happens
                   or (
                     length(ml.link_analysis(., mode="aggressive").redirect_history
                     ) > 0
                     and ml.link_analysis(., mode="aggressive").effective_url.domain.root_domain in $tranco_10k
                   )
                 )
               )
             )
         )

         // or search for QR codes in the screenshot of the frame.io page
         or any(file.explode(ml.link_analysis(.).screenshot),
                .depth == 0
                and (
                  (
                    .scan.qr.type == "url"
                    and .scan.qr.url.domain.root_domain not in (
                      'frame.io',
                      'f.io',
                      'onetrust.com'
                    )
                  )
                  // some samples have a pdf uploaded that contains a Sharepoint File Share lure.
                  // we can use ocr to detect this
                  or strings.icontains(.scan.ocr.raw,
                                       'This email contains a secure link to sharepoint'
                  )
                )
         )
  )
)

Detection logic

Scope: inbound message.

The detection rule matches on message groups which make use of Adobe's frame.io as a landing page. The landing page contains links which are newly registered, use free file or subdomain hosts, url shortners or when visited are phishing pages, lead to a captcha or redirect to a well-known domain, seen in evasion tactics.

  1. inbound message
  2. sender.email.domain.domain is 'frame.io'
  3. not:
    • any of $org_display_names where:
      • strings.istarts_with(subject.subject)
  4. subject.subject contains ' shared '
  5. any of:
    • any of:
      • subject.subject contains 'dropbox'
      • subject.subject contains 'docusign'
      • subject.subject matches 'secured?.*(?:file|document|docs|fax)'
      • subject.subject matches 'important.*(?:file|document|docs|fax)'
      • subject.subject matches 'shared?.*(?:file|document|docs|fax)'
      • subject.subject matches 'protected.*(?:file|document|docs|fax)'
      • subject.subject matches 'encrypted.*(?:file|document|docs|fax)'
      • subject.subject contains 'scanne[rd]_'
      • subject.subject contains '_IMG_'
      • subject.subject matches '^IMG[_-](?:\\d|\\W)+$'
      • subject.subject matches 'doc(?:ument)?\\s?\\d+$'
      • subject.subject matches '^\\d+$'
      • subject.subject contains 'one_docx'
      • subject.subject contains 'OneDrive'
      • subject.subject matches 'A document.*One.?Drive'
      • subject.subject contains 'click here'
      • subject.subject contains 'Download PDF'
      • subject.subject contains 'Validate'
      • subject.subject is 'Confidentiality'
      • subject.subject is 'Confidential'
      • any of ml.nlu_classifier(subject.subject).entities where:
        • .name is 'financial'
      • subject.subject contains 'payment'
      • subject.subject contains 'invoice'
      • subject.subject matches 'INV(?:_|\\s)?\\d+$'
      • subject.subject matches '^INV(?:_|\\s)'
      • subject.subject matches 'P[O0]\\W+?\\d+$'
      • subject.subject contains 'receipt'
      • subject.subject contains 'billing'
      • all of:
        • subject.subject contains 'statement'
        • not:
          • subject.subject is 'Privacy Statement'
      • subject.subject contains 'Past Due'
      • subject.subject matches 'Remit(tance)?'
      • subject.subject contains 'Purchase Order'
      • subject.subject contains 'settlement'
      • subject.subject contains 'contract agreement'
      • subject.subject matches 'Pr[0o]p[0o]sal'
      • subject.subject contains 'contract doc'
    • any of filter(body.links) where any holds:
      • any of filter(...) where any holds:
        • network.whois(.href_url.domain).days_old < 30
        • .href_url.domain.root_domain in $free_file_hosts
        • .href_url.domain.domain in $free_file_hosts
        • all of:
          • .href_url.domain.root_domain in $free_subdomain_hosts
          • .href_url.domain.subdomain is set
          • .href_url.domain.subdomain is not 'www'
        • .href_url.domain.root_domain in $url_shorteners
        • .href_url.domain.root_domain in $social_landing_hosts
        • .href_url.domain.domain in $url_shorteners
        • .href_url.domain.domain in $social_landing_hosts
        • all of:
          • subject.subject matches '(?:view|click|show|access|download|goto|Validate|Va[il]idar|login|verify|account)'
          • any of:
            • ml.link_analysis(.).credphish.disposition is 'phishing'
            • ml.link_analysis(.).credphish.contains_captcha
            • all of:
              • length(ml.link_analysis(., mode='aggressive').redirect_history) > 0
              • ml.link_analysis(.).effective_url.domain.root_domain in $tranco_10k
      • any of file.explode(...) where all hold:
        • .depth is 0
        • any of:
          • all of:
            • .scan.qr.type is 'url'
            • .scan.qr.url.domain.root_domain not in ('frame.io', 'f.io', 'onetrust.com')
          • .scan.ocr.raw contains 'This email contains a secure link to sharepoint'

Inspects: body.links, body.links[].href_url.domain.root_domain, body.links[].href_url.path, sender.email.domain.domain, subject.subject, type.inbound. Sensors: file.explode, ml.link_analysis, ml.nlu_classifier, network.whois, regex.icontains, strings.icontains, strings.istarts_with, strings.starts_with. Reference lists: $free_file_hosts, $free_subdomain_hosts, $org_display_names, $social_landing_hosts, $tranco_10k, $url_shorteners.

Indicators matched (51)

FieldMatchValue
sender.email.domain.domainequalsframe.io
strings.icontainssubstring shared
strings.icontainssubstringdropbox
strings.icontainssubstringdocusign
regex.icontainsregexsecured?.*(?:file|document|docs|fax)
regex.icontainsregeximportant.*(?:file|document|docs|fax)
regex.icontainsregexshared?.*(?:file|document|docs|fax)
regex.icontainsregexprotected.*(?:file|document|docs|fax)
regex.icontainsregexencrypted.*(?:file|document|docs|fax)
strings.icontainssubstringscanne[rd]_
strings.icontainssubstring_IMG_
regex.icontainsregex^IMG[_-](?:\d|\W)+$
39 more
regex.icontainsregexdoc(?:ument)?\s?\d+$
regex.icontainsregex^\d+$
strings.icontainssubstringone_docx
strings.icontainssubstringOneDrive
regex.icontainsregexA document.*One.?Drive
strings.icontainssubstringclick here
strings.icontainssubstringDownload PDF
strings.icontainssubstringValidate
subject.subjectequalsConfidentiality
subject.subjectequalsConfidential
ml.nlu_classifier(subject.subject).entities[].nameequalsfinancial
strings.icontainssubstringpayment
strings.icontainssubstringinvoice
regex.icontainsregexINV(?:_|\s)?\d+$
regex.icontainsregex^INV(?:_|\s)
regex.icontainsregexP[O0]\W+?\d+$
strings.icontainssubstringreceipt
strings.icontainssubstringbilling
strings.icontainssubstringstatement
subject.subjectequalsPrivacy Statement
strings.icontainssubstringPast Due
regex.icontainsregexRemit(tance)?
strings.icontainssubstringPurchase Order
strings.icontainssubstringsettlement
strings.icontainssubstringcontract agreement
regex.icontainsregexPr[0o]p[0o]sal
strings.icontainssubstringcontract doc
body.links[].href_url.domain.root_domainequalsframe.io
strings.starts_withprefix/reviews/
strings.starts_withprefix/presentations/
ml.link_analysis(filter(body.links)[]).final_dom.links[].href_url.domain.root_domainmemberframe.io
ml.link_analysis(filter(body.links)[]).final_dom.links[].href_url.domain.root_domainmemberf.io
ml.link_analysis(filter(body.links)[]).final_dom.links[].href_url.domain.root_domainmemberonetrust.com
regex.icontainsregex(?:view|click|show|access|download|goto|Validate|Va[il]idar|login|verify|account)
file.explode(...)[].scan.qr.typeequalsurl
file.explode(...)[].scan.qr.url.domain.root_domainmemberframe.io
file.explode(...)[].scan.qr.url.domain.root_domainmemberf.io
file.explode(...)[].scan.qr.url.domain.root_domainmemberonetrust.com
strings.icontainssubstringThis email contains a secure link to sharepoint