Detection rules › Sublime MQL
Service Abuse: HelloSign share with suspicious sender or document name
The detection rule is designed to identify messages sent from HelloSign that notify recipients about a shared file and contain suspicious content either in the document or the sender's display name.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Callback Phishing, BEC/Fraud |
| Tactics and techniques | Evasion, Social engineering |
Event coverage
Rule body MQL
type.inbound
// Legitimate Dropbox sending infrastructure
and sender.email.email == "noreply@mail.hellosign.com"
and headers.auth_summary.spf.pass
and headers.auth_summary.dmarc.pass
and (
strings.icontains(subject.subject, ' - Signature Requested')
or (
strings.icontains(subject.subject, 'Reminder: ')
and strings.icontains(subject.subject, 'awaiting your signature')
)
)
and not strings.icontains(subject.subject, 'You just signed')
// negate CDP Esign which reuses hellosign
and not strings.contains(body.current_thread.text, '@cdpesign.com')
// negate messages where the "on_behalf_of_email" is within the org_domains
and not any(headers.hops,
any(.fields,
.name == "X-Mailgun-Variables"
and strings.icontains(.value, 'on_behalf_of_email')
and all(regex.iextract(.value,
'\"on_behalf_of_email": \"(?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\",'
),
.named_groups["sender_domain"] in $org_domains
)
)
)
// sometimes there isn't an on_behalf_of_email, so in those cases we can use the body to extract the sender
and not (
regex.icontains(body.html.raw,
'<th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\)]+)\).*?</th>'
)
// check that the sender email has not been observed previously
and all(regex.iextract(body.html.raw,
'<th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\).*?</th>'
),
.named_groups["sender_domain"] in $org_domains
)
)
and (
// contains the word dropbox
// the subject is in the format of "<actor controlled title>(?: - Signature Requested by| is awaiting your signature) <actor controlled name>"
(
strings.icontains(subject.subject, 'dropbox')
// negate where the sender is dropbox
and not any(headers.hops,
any(.fields,
.name == "X-Mailgun-Variables"
and regex.contains(.value,
'\"on_behalf_of_email": \"[^\"]+@dropbox.com\"'
)
)
)
)
or strings.icontains(subject.subject, 'sharefile')
or strings.icontains(subject.subject, 'helloshare')
// sender names part of the subject
or (
// Signature Terms in the Sender Display Name
strings.icontains(sender.display_name, 'Signature Requ')
// Billing Accounting
or regex.icontains(sender.display_name,
'Accounts? (?:Payable|Receivable)',
)
or strings.icontains(sender.display_name, 'Billing Support')
// HR/Payroll/Legal/etc
or strings.icontains(sender.display_name, 'Compliance HR')
or regex.icontains(sender.display_name,
'(?:Compliance|Executive|\bHR\b|Human Resources|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Support).*(?:Department|Dept|Team|Desk)?'
)
or strings.icontains(sender.display_name, 'Corporate Communications')
or strings.icontains(sender.display_name, 'Employee Relations')
or strings.icontains(sender.display_name, 'Office Manager')
or strings.icontains(sender.display_name, 'Risk Management')
or regex.icontains(sender.display_name, 'Payroll Admin(?:istrator)?')
// IT related
or regex.icontains(sender.display_name,
'IT Support',
'Information Technology',
'(?:Network|System) Admin(?:istrator)?',
'Help Desk',
'Tech(?:nical) Support'
)
)
// NLU/Logo Detection on message from the sender/message body
or any(html.xpath(body.html,
'//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th'
).nodes,
any(ml.nlu_classifier(.display_text).intents,
.name == "callback_scam" and .confidence == "high"
)
)
// callback logos
or any(ml.logo_detect(file.message_screenshot()).brands,
.name in ("PayPal", "Norton", "GeekSquad", "Ebay", "McAfee", "AT&T")
)
// filename analysis
// the filename is also contianed in the subject line
or (
// scanner themed
regex.icontains(subject.subject,
'scanne[rd].*(?: - Signature Requested by| is awaiting your signature)'
)
// image theme
or regex.icontains(subject.subject,
'_IMG_.*(?: - Signature Requested by| is awaiting your signature)',
'IMG[_-](?:\d|\W)+.*(?: - Signature Requested by| is awaiting your signature)'
)
// Invoice Themes
or regex.icontains(subject.subject,
'(?:INV\b|\bACH\b|Wire Confirmation|\bP[O0]\W+?\d+\"|\bP[O0](?:\W+?|\d+)|Purchase Order|Past Due|Remit(?:tance)?).*(?: - Signature Requested by| is awaiting your signature)'
)
// Payment Themes
or regex.icontains(subject.subject,
'(?:payment.*(?:complete|confirmation|approved|recent|processing)|(complete|confirmation|approved|recent|processing).*payment).*(?: - Signature Requested by| is awaiting your signature)'
)
// Payroll/HR
or regex.icontains(subject.subject,
'(?:Payroll|Employee Pay\b|Salary|Benefit Enrollment|Payment.*Benefit|Benefit.*Update|Employee Handbook|Reimbursement Approved).*(?: - Signature Requested by| is awaiting your signature)'
)
// shared files/extenstion/urgency/CTA
or regex.icontains(subject.subject,
'(?:Urgent|Important|Immediate|Secure|Encrypt|shared|\bsent\b|protected|Validate|Final Notice|Review(?:and |& )?Sign|Download PDF).*(?: - Signature Requested by| is awaiting your signature)'
)
// MFA theme
or regex.icontains(subject.subject,
'(?:Verification Code|\bMFA\b).*(?: - Signature Requested by| is awaiting your signature)'
)
)
)
Detection logic
Scope: inbound message.
The detection rule is designed to identify messages sent from HelloSign that notify recipients about a shared file and contain suspicious content either in the document or the sender's display name.
- inbound message
- sender.email.email is 'noreply@mail.hellosign.com'
- headers.auth_summary.spf.pass
- headers.auth_summary.dmarc.pass
any of:
- subject.subject contains ' - Signature Requested'
all of:
- subject.subject contains 'Reminder: '
- subject.subject contains 'awaiting your signature'
not:
- subject.subject contains 'You just signed'
not:
- body.current_thread.text contains '@cdpesign.com'
not:
any of
headers.hopswhere:any of
.fieldswhere all hold:- .name is 'X-Mailgun-Variables'
- .value contains 'on_behalf_of_email'
all of
regex.iextract(.value)where:- .named_groups['sender_domain'] in $org_domains
not:
all of:
- body.html.raw matches '<th class="action-item--action[^\\>]+\\>\\s*[^\\<]*\\((?P<sender_email>[^\\)]+)\\).*?</th>'
all of
regex.iextract(body.html.raw)where:- .named_groups['sender_domain'] in $org_domains
any of:
all of:
- subject.subject contains 'dropbox'
not:
any of
headers.hopswhere:any of
.fieldswhere all hold:- .name is 'X-Mailgun-Variables'
- .value matches '\\"on_behalf_of_email": \\"[^\\"]+@dropbox.com\\"'
- subject.subject contains 'sharefile'
- subject.subject contains 'helloshare'
any of:
- sender.display_name contains 'Signature Requ'
- sender.display_name matches 'Accounts? (?:Payable|Receivable)'
- sender.display_name contains 'Billing Support'
- sender.display_name contains 'Compliance HR'
- sender.display_name matches '(?:Compliance|Executive|\\bHR\\b|Human Resources|\\bHR\\b|\\bIT\\b|Legal|Payroll|Purchasing|Operations|Security|Support).*(?:Department|Dept|Team|Desk)?'
- sender.display_name contains 'Corporate Communications'
- sender.display_name contains 'Employee Relations'
- sender.display_name contains 'Office Manager'
- sender.display_name contains 'Risk Management'
- sender.display_name matches 'Payroll Admin(?:istrator)?'
sender.display_name matches any of 5 patterns
IT SupportInformation Technology(?:Network|System) Admin(?:istrator)?Help DeskTech(?:nical) Support
any of
html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodeswhere:any of
ml.nlu_classifier(.display_text).intentswhere all hold:- .name is 'callback_scam'
- .confidence is 'high'
any of
ml.logo_detect(file.message_screenshot()).brandswhere:- .name in ('PayPal', 'Norton', 'GeekSquad', 'Ebay', 'McAfee', 'AT&T')
subject.subject matches any of 8 patterns
scanne[rd].*(?: - Signature Requested by| is awaiting your signature)_IMG_.*(?: - Signature Requested by| is awaiting your signature)IMG[_-](?:\d|\W)+.*(?: - Signature Requested by| is awaiting your signature)(?:INV\b|\bACH\b|Wire Confirmation|\bP[O0]\W+?\d+\"|\bP[O0](?:\W+?|\d+)|Purchase Order|Past Due|Remit(?:tance)?).*(?: - Signature Requested by| is awaiting your signature)(?:payment.*(?:complete|confirmation|approved|recent|processing)|(complete|confirmation|approved|recent|processing).*payment).*(?: - Signature Requested by| is awaiting your signature)(?:Payroll|Employee Pay\b|Salary|Benefit Enrollment|Payment.*Benefit|Benefit.*Update|Employee Handbook|Reimbursement Approved).*(?: - Signature Requested by| is awaiting your signature)(?:Urgent|Important|Immediate|Secure|Encrypt|shared|\bsent\b|protected|Validate|Final Notice|Review(?:and |& )?Sign|Download PDF).*(?: - Signature Requested by| is awaiting your signature)(?:Verification Code|\bMFA\b).*(?: - Signature Requested by| is awaiting your signature)
Inspects: body.current_thread.text, body.html, body.html.raw, headers.auth_summary.dmarc.pass, headers.auth_summary.spf.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, sender.display_name, sender.email.email, subject.subject, type.inbound. Sensors: file.message_screenshot, html.xpath, ml.logo_detect, ml.nlu_classifier, regex.contains, regex.icontains, regex.iextract, strings.contains, strings.icontains. Reference lists: $org_domains.
Indicators matched (46)
| Field | Match | Value |
|---|---|---|
sender.email.email | equals | noreply@mail.hellosign.com |
strings.icontains | substring | - Signature Requested |
strings.icontains | substring | Reminder: |
strings.icontains | substring | awaiting your signature |
strings.icontains | substring | You just signed |
strings.contains | substring | @cdpesign.com |
headers.hops[].fields[].name | equals | X-Mailgun-Variables |
strings.icontains | substring | on_behalf_of_email |
regex.iextract | regex | \"on_behalf_of_email": \"(?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\", |
regex.icontains | regex | <th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\)]+)\).*?</th> |
regex.iextract | regex | <th class="action-item--action[^\>]+\>\s*[^\<]*\((?P<sender_email>[^\"]+@(?P<sender_domain>[^\"]+))\).*?</th> |
strings.icontains | substring | dropbox |
34 more
regex.contains | regex | \"on_behalf_of_email": \"[^\"]+@dropbox.com\" |
strings.icontains | substring | sharefile |
strings.icontains | substring | helloshare |
strings.icontains | substring | Signature Requ |
regex.icontains | regex | Accounts? (?:Payable|Receivable) |
strings.icontains | substring | Billing Support |
strings.icontains | substring | Compliance HR |
regex.icontains | regex | (?:Compliance|Executive|\bHR\b|Human Resources|\bHR\b|\bIT\b|Legal|Payroll|Purchasing|Operations|Security|Support).*(?:Department|Dept|Team|Desk)? |
strings.icontains | substring | Corporate Communications |
strings.icontains | substring | Employee Relations |
strings.icontains | substring | Office Manager |
strings.icontains | substring | Risk Management |
regex.icontains | regex | Payroll Admin(?:istrator)? |
regex.icontains | regex | IT Support |
regex.icontains | regex | Information Technology |
regex.icontains | regex | (?:Network|System) Admin(?:istrator)? |
regex.icontains | regex | Help Desk |
regex.icontains | regex | Tech(?:nical) Support |
ml.nlu_classifier(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes[].display_text).intents[].name | equals | callback_scam |
ml.nlu_classifier(html.xpath(body.html, '//table[not(@class)]/tbody/tr/th[2]/p[@class="subhead"][2]/parent::th').nodes[].display_text).intents[].confidence | equals | high |
ml.logo_detect(file.message_screenshot()).brands[].name | member | PayPal |
ml.logo_detect(file.message_screenshot()).brands[].name | member | Norton |
ml.logo_detect(file.message_screenshot()).brands[].name | member | GeekSquad |
ml.logo_detect(file.message_screenshot()).brands[].name | member | Ebay |
ml.logo_detect(file.message_screenshot()).brands[].name | member | McAfee |
ml.logo_detect(file.message_screenshot()).brands[].name | member | AT&T |
regex.icontains | regex | scanne[rd].*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | _IMG_.*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | IMG[_-](?:\d|\W)+.*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | (?:INV\b|\bACH\b|Wire Confirmation|\bP[O0]\W+?\d+\"|\bP[O0](?:\W+?|\d+)|Purchase Order|Past Due|Remit(?:tance)?).*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | (?:payment.*(?:complete|confirmation|approved|recent|processing)|(complete|confirmation|approved|recent|processing).*payment).*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | (?:Payroll|Employee Pay\b|Salary|Benefit Enrollment|Payment.*Benefit|Benefit.*Update|Employee Handbook|Reimbursement Approved).*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | (?:Urgent|Important|Immediate|Secure|Encrypt|shared|\bsent\b|protected|Validate|Final Notice|Review(?:and |& )?Sign|Download PDF).*(?: - Signature Requested by| is awaiting your signature) |
regex.icontains | regex | (?:Verification Code|\bMFA\b).*(?: - Signature Requested by| is awaiting your signature) |