本工具包用于修复恶意日历邀请,专为使用邮件安全解决方案但未能原生修复此类攻击的团队设计。
如果你使用Sublime,则无需此工具包,因为其原生支持修复。
针对每种邮件安全提供商与日历提供商的组合,提供了独立的脚本(例如 proofpoint-microsoft365.py、mimecast-google-workspace.py):
邮件安全提供商:
日历提供商:
直接前往快速开始!
没有看到你的组合?请随时通过 [email protected] 告知我们你希望支持哪些组合。
这些脚本要求邮件安全解决方案已能检测ICS钓鱼邮件,但尚未移除通过这些邮件创建的日历事件。
如果你没有能够检测ICS钓鱼的邮件安全解决方案,Sublime Core 提供了免费且可自托管的邮件安全功能,内置ICS钓鱼检测和自动日历修复。
ICS钓鱼是一种双管齐下的攻击,同时将恶意载荷投递到用户的收件箱和日历。根据Sublime的2026年邮件威胁研究报告,该攻击载体从2025年第一季度到第四季度增长了约100倍,其中Q4回调钓鱼攻击中超过20%使用日历邀请作为投递机制。
关键安全缺口:即使邮件安全解决方案隔离或删除了恶意邮件,日历事件仍然存在。这影响到安全邮件网关(SEG)和基于API的邮件安全解决方案,截至2026年2月,大多数方案不会清理恶意的日历事件。
基于Sublime内置的恶意日历事件修复功能,这些Python脚本可在你的邮件安全解决方案隔离ICS钓鱼邮件时删除恶意事件。脚本:
.ics 日历附件及其他符合iCalendar标准的附件作为纯Python脚本,你可以在许多SOAR平台中运行它们,包括Tines、Splunk SOAR和Cortex XSOAR。
我们也在编写特定SOAR的指南。如果你需要帮助,或希望在某个SOAR的文档发布时收到通知,请通过 [email protected] 联系我们。
每个独立脚本需要:
你可以在任何环境中运行这些脚本:
requirements.txt 中列出的PyPI包(requests 和 PyJWT)对于生产部署,你还需要定期调度脚本运行,例如使用cron任务。
脚本默认以只读模式运行,以防止意外删除事件。有关如何启用删除以及如何针对发现的恶意邀请和事件实现自定义逻辑,请参见配置选项。
export PROOFPOINT_CLIENT_ID="your-client-id"
export PROOFPOINT_CLIENT_SECRET="your-client-secret"
PROOFPOINT_CLIENT_ID: Proofpoint Cloud Threat Response API的OAuth 2.0客户端IDPROOFPOINT_CLIENT_SECRET: OAuth 2.0客户端密钥export MIMECAST_CLIENT_ID="your-client-id"
export MIMECAST_CLIENT_SECRET="your-client-secret"
export MIMECAST_REGION="global" # 选项:global, us, uk(默认:global)
MIMECAST_CLIENT_ID: Mimecast API 2.0的OAuth 2.0客户端IDMIMECAST_CLIENT_SECRET: OAuth 2.0客户端密钥MIMECAST_REGION: API区域端点(可选,默认为global)所需API权限:
Services | Threat Remediation | ReadGateway | Tracking | ReadArchive | Readexport ABNORMAL_API_KEY="your-api-key"
ABNORMAL_API_KEY: 来自Abnormal Security平台的API密钥# 选项1:服务账号文件
export GOOGLE_SERVICE_ACCOUNT_FILE="/path/to/service-account.json"
# 选项2:内联服务账号JSON
export GOOGLE_SERVICE_ACCOUNT_JSON='{"type":"service_account",...}'
GOOGLE_SERVICE_ACCOUNT_FILE: 服务账号JSON密钥文件的路径GOOGLE_SERVICE_ACCOUNT_JSON: 内联服务账号凭据,JSON字符串格式所需设置:
https://www.googleapis.com/auth/calendar.eventsexport MICROSOFT_CLIENT_ID="your-client-id"
export MICROSOFT_CLIENT_SECRET="your-client-secret"
export MICROSOFT_TENANT_ID="your-tenant-id"
MICROSOFT_CLIENT_ID: Azure AD应用程序(客户端)IDMICROSOFT_CLIENT_SECRET: Azure AD应用程序客户端密钥MICROSOFT_TENANT_ID: Azure AD目录(租户)ID所需API权限: Calendars.ReadWrite(应用程序权限)
export ICS_PHISHING_REMEDIATION_MODE="dry_run" # "dry_run" 为默认值
export MESSAGE_LOOKBACK_MINUTES=10
export PROOFPOINT_CLIENT_ID="your-client-id"
export PROOFPOINT_CLIENT_SECRET="your-secret"
export MICROSOFT_TENANT_ID="your-tenant"
export MICROSOFT_CLIENT_ID="your-client"
export MICROSOFT_CLIENT_SECRET="your-secret"
python3 proofpoint-microsoft365.py
默认情况下,所有脚本以只读模式运行,以防止意外删除。在此模式下,脚本将:
这使你可以在启用实际删除之前验证脚本是否正常工作。
要实际删除日历事件,设置 ICS_PHISHING_REMEDIATION_MODE 环境变量:
export ICS_PHISHING_REMEDIATION_MODE="delete_events"
有效值:
dry_run(默认) - 预览操作但不删除delete_events - 实际删除匹配的日历事件无效值将引发错误以防止配置错误。
所有脚本在可配置的时间窗口内搜索隔离邮件:
export MESSAGE_LOOKBACK_MINUTES=10 # 可选,默认值为5分钟
重要提示: 此值应与你的cron调度频率匹配,并留出少量缓冲,确保不会遗漏任何消息。例如,如果每5分钟运行一次,则将回溯窗口设置为10分钟。
为了实现额外集成(例如与日志系统或监控工具),你可以在脚本中实现自定义回调,并将其传递给 delete_events_from_remediated_emails 函数:
on_invitation_found_callback(invitation: CalendarInvitation) - 当在隔离消息中发现日历邀请时调用on_event_found_callback(invitation: CalendarInvitation, event: CalendarEvent) - 为每个匹配的日历事件调用示例:
def log_invitation(invitation):
print(f"发现恶意邀请,用户:{invitation.user_id},UID:{invitation.ics_uid}")
def log_event(invitation, event):
print(f"发现日历事件 {event.id},匹配邀请 {invitation.ics_uid}")
fetcher = ProofpointCloudFetcher()
deleter = GoogleWorkspaceEventDeleter()
delete_events_from_remediated_emails(
fetcher,
deleter,
mode="delete_events", # 覆盖默认的只读模式
on_invitation_found_callback=log_invitation,
on_event_found_callback=log_event
)
注意:回调中的错误会被记录,但不会停止事件处理。
所有脚本遵循 common.py 中定义的通用模式:
class MessageFetcher:
def yield_remediated_emails(self) -> Iterator[Message]:
"""从你的邮件安全解决方案获取已隔离的邮件"""
class EventDeleter:
def delete_matching_events(
self,
invitation: CalendarInvitation,
mode: Mode,
on_event_found_callback: Optional[Callable[[CalendarInvitation, CalendarEvent], None]]
) -> None:
"""删除与ICS附件匹配的日历事件"""
特定组合的实现负责处理API认证和提供商特定的逻辑。