AnalysisType: rule
Filename: proofpoint_malware_detected.py
RuleID: "Proofpoint.MalwareDetected"
DisplayName: "Proofpoint Malware Detected"
Enabled: true
LogTypes:
- Proofpoint.Event
Status: Experimental
Tags:
- Proofpoint
- Email Security
- Malware
- Phishing
- Initial Access:Phishing
- Execution:User Execution
Severity: High
Description: >
This rule alerts when Proofpoint detects malware in an email message.
It triggers when emails are quarantined with the malware rule or when
the malware score is 90 or higher. Events quarantined to the Virus folder
or with the notcleaned rule are handled by the Virus Detected rule instead.
Runbook: |
1. Verify the email was quarantined and check if recipients interacted with malicious content within the last 2 hours
2. Block the sender domain/IP within 15 minutes and notify affected users immediately
3. Escalate to IR team within 30 minutes if malware execution is confirmed on endpoints
Reference: https://www.proofpoint.com/sites/default/files/pfpt-us-ebook-stopping-malware-with-proofpoint-advanced-email-protection.pdf
Reports:
MITRE ATT&CK:
- TA0001:T1566 # Initial Access: Phishing
- TA0002:T1204 # Execution: User Execution
Tests:
- Name: Malware Quarantine Rule Match
ExpectedResult: true
Log:
messageTime: "2026-01-08T23:57:06Z"
sender: "malicious@example.com"
senderIP: "192.0.2.1"
fromAddress:
- "malicious@example.com"
toAddresses:
- "victim@company.com"
recipient:
- "victim@company.com"
subject: "Invoice Attached"
malwareScore: 100
phishScore: 0
spamScore: 0
impostorScore: 0
quarantineFolder: "Malware"
quarantineRule: "malware"
messageID: "<20021004025021.15821.qmail@example.com>"
messageSize: 202302
modulesRun:
- av
- sandbox
- spam
- dmarc
threatsInfoMap:
- threatType: "attachment"
classification: "malware"
threatStatus: "active"
threat: "invoice.exe"
threatID: "9be9e4c4cc2679586acb2511b3ae0505be51c07d32e1071bc4bb95cfe3383b9f"
- Name: High Malware Score
ExpectedResult: true
Log:
messageTime: "2026-01-08T23:57:06Z"
sender: "suspicious@example.com"
senderIP: "198.51.100.1"
fromAddress:
- "suspicious@example.com"
toAddresses:
- "user@company.com"
recipient:
- "user@company.com"
subject: "Urgent: Update Required"
malwareScore: 95
phishScore: 10
spamScore: 20
impostorScore: 0
quarantineFolder: "Attachment Defense"
quarantineRule: "threat"
messageID: "<abc123@example.com>"
threatsInfoMap:
- threatType: "attachment"
classification: "malware"
threatStatus: "active"
threat: "update.zip"
- Name: Boundary Case - Score 89 Below Threshold
ExpectedResult: false
Log:
messageTime: "2026-01-08T23:00:00Z"
sender: "borderline@example.com"
senderIP: "198.51.100.25"
fromAddress:
- "borderline@example.com"
toAddresses:
- "user@company.com"
recipient:
- "user@company.com"
subject: "Document Attached"
malwareScore: 89
phishScore: 10
spamScore: 15
impostorScore: 0
quarantineFolder: "Attachment Defense"
quarantineRule: "threat"
messageID: "<boundary89@example.com>"
- Name: Low Malware Score - No Alert
ExpectedResult: false
Log:
messageTime: "2026-01-08T23:57:06Z"
sender: "legitimate@company.com"
senderIP: "203.0.113.1"
fromAddress:
- "legitimate@company.com"
toAddresses:
- "employee@company.com"
recipient:
- "employee@company.com"
subject: "Meeting Notes"
malwareScore: 0
phishScore: 0
spamScore: 5
impostorScore: 0
messageID: "<normal123@company.com>"
- Name: Virus Quarantine Excluded - No Alert
ExpectedResult: false
Log:
messageTime: "2026-01-08T23:57:06Z"
sender: "virus@example.com"
senderIP: "192.0.2.10"
fromAddress:
- "virus@example.com"
toAddresses:
- "employee@company.com"
recipient:
- "employee@company.com"
subject: "Infected File"
malwareScore: 100
phishScore: 0
spamScore: 0
impostorScore: 0
quarantineFolder: "Virus"
quarantineRule: "notcleaned"
messageID: "<virus-excluded@example.com>"
- Name: Different Quarantine Rule - No Alert
ExpectedResult: false
Log:
messageTime: "2026-01-08T23:57:06Z"
sender: "spam@example.com"
senderIP: "198.51.100.50"
fromAddress:
- "spam@example.com"
toAddresses:
- "user@company.com"
recipient:
- "user@company.com"
subject: "Buy Now!"
malwareScore: 0
phishScore: 0
spamScore: 95
impostorScore: 0
quarantineFolder: "Definite Spam"
quarantineRule: "spam_definite"
messageID: "<spam456@example.com>"
# ------ paired body: proofpoint_malware_detected.py ------
from panther_proofpoint_helpers import proofpoint_alert_context
def rule(event):
# Exclude events already handled by the Virus Detected rule
if event.get("quarantineFolder") == "Virus" or event.get("quarantineRule") == "notcleaned":
return False
return event.get("quarantineRule") == "malware" or event.get("malwareScore", 0) >= 90
def severity(event):
malware_score = event.get("malwareScore", 0)
if malware_score >= 95:
return "CRITICAL"
if malware_score >= 90:
return "HIGH"
return "DEFAULT"
def title(event):
subject = event.get("subject", "<UNKNOWN_SUBJECT>")
sender = event.get("sender", "<UNKNOWN_SENDER>")
return f"Proofpoint: Malware Detected in Email from {sender} " f"- [{subject}]"
def dedup(event):
# Deduplicate by sender and threat type to group related malware alerts
sender = event.get("sender", "<UNKNOWN_SENDER>")
quarantine_rule = event.get("quarantineRule", "malware")
return f"proofpoint:malware:{sender}:{quarantine_rule}"
def alert_context(event):
# Use the common helper and extend with malware-specific fields
context = proofpoint_alert_context(event)
context["messageSize"] = event.get("messageSize", 0)
return context