Detection rules › Sublime MQL
Link: Multistage landing - Abused Adobe frame.io
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).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Evasion, Free file host |
Event coverage
| Message attribute |
|---|
| body |
| body.links (collection) |
| sender.email |
| subject |
| type |
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.
- inbound message
- sender.email.domain.domain is 'frame.io'
not:
any of
$org_display_nameswhere:- strings.istarts_with(subject.subject)
- subject.subject contains ' shared '
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).entitieswhere:- .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)
| Field | Match | Value |
|---|---|---|
sender.email.domain.domain | equals | frame.io |
strings.icontains | substring | shared |
strings.icontains | substring | dropbox |
strings.icontains | substring | docusign |
regex.icontains | regex | secured?.*(?:file|document|docs|fax) |
regex.icontains | regex | important.*(?:file|document|docs|fax) |
regex.icontains | regex | shared?.*(?:file|document|docs|fax) |
regex.icontains | regex | protected.*(?:file|document|docs|fax) |
regex.icontains | regex | encrypted.*(?:file|document|docs|fax) |
strings.icontains | substring | scanne[rd]_ |
strings.icontains | substring | _IMG_ |
regex.icontains | regex | ^IMG[_-](?:\d|\W)+$ |
39 more
regex.icontains | regex | doc(?:ument)?\s?\d+$ |
regex.icontains | regex | ^\d+$ |
strings.icontains | substring | one_docx |
strings.icontains | substring | OneDrive |
regex.icontains | regex | A document.*One.?Drive |
strings.icontains | substring | click here |
strings.icontains | substring | Download PDF |
strings.icontains | substring | Validate |
subject.subject | equals | Confidentiality |
subject.subject | equals | Confidential |
ml.nlu_classifier(subject.subject).entities[].name | equals | financial |
strings.icontains | substring | payment |
strings.icontains | substring | invoice |
regex.icontains | regex | INV(?:_|\s)?\d+$ |
regex.icontains | regex | ^INV(?:_|\s) |
regex.icontains | regex | P[O0]\W+?\d+$ |
strings.icontains | substring | receipt |
strings.icontains | substring | billing |
strings.icontains | substring | statement |
subject.subject | equals | Privacy Statement |
strings.icontains | substring | Past Due |
regex.icontains | regex | Remit(tance)? |
strings.icontains | substring | Purchase Order |
strings.icontains | substring | settlement |
strings.icontains | substring | contract agreement |
regex.icontains | regex | Pr[0o]p[0o]sal |
strings.icontains | substring | contract doc |
body.links[].href_url.domain.root_domain | equals | frame.io |
strings.starts_with | prefix | /reviews/ |
strings.starts_with | prefix | /presentations/ |
ml.link_analysis(filter(body.links)[]).final_dom.links[].href_url.domain.root_domain | member | frame.io |
ml.link_analysis(filter(body.links)[]).final_dom.links[].href_url.domain.root_domain | member | f.io |
ml.link_analysis(filter(body.links)[]).final_dom.links[].href_url.domain.root_domain | member | onetrust.com |
regex.icontains | regex | (?:view|click|show|access|download|goto|Validate|Va[il]idar|login|verify|account) |
file.explode(...)[].scan.qr.type | equals | url |
file.explode(...)[].scan.qr.url.domain.root_domain | member | frame.io |
file.explode(...)[].scan.qr.url.domain.root_domain | member | f.io |
file.explode(...)[].scan.qr.url.domain.root_domain | member | onetrust.com |
strings.icontains | substring | This email contains a secure link to sharepoint |