
ICSフィッシング(悪意のあるカレンダー招待)を阻止するためのオープンソースツール
このツールキットは、悪意のあるカレンダー招待状を是正するためのもので、これらの攻撃をネイティブに是正しないメールセキュリティソリューションを利用しているチームを支援するために設計されています。
Sublime を使用している場合、是正機能がネイティブサポートされているため、このツールキットは不要です。
各メールセキュリティプロバイダーとカレンダープロバイダーの組み合わせに対して、スタック固有のスタンドアロンスクリプト(例:proofpoint-microsoft365.py、mimecast-google-workspace.py)が提供されています。
メールセキュリティプロバイダー:
カレンダープロバイダー:
すぐに始めたい場合はクイックスタートへ!
ご利用のスタックが表示されていませんか?[email protected]まで、サポートしてほしいスタックをお知らせください。
これらのスクリプトは、ICSフィッシングメールをすでに検出しているが、それらのメールによって作成されたカレンダーイベントを削除していないメールセキュリティソリューションを必要とします。
ICSフィッシングを検出するメールセキュリティソリューションをお持ちでない場合は、Sublime Core が無料でセルフホスト可能なメールセキュリティを提供しており、ICSフィッシング検出と自動カレンダー是正機能が組み込まれています。
ICSフィッシングは、悪意のあるペイロードをユーザーの受信トレイとカレンダーの両方に同時に配信する二段階の攻撃です。この攻撃ベクトルは、2025年の第1四半期から第4四半期にかけて約100倍に増加したと、Sublimeの2026年メール脅威調査レポートに記載されています。第4四半期のコールバックフィッシング攻撃の20%以上が、カレンダー招待状を配信メカニズムとして使用していました。
重要なセキュリティギャップ: カレンダーイベントは、メールセキュリティソリューションが悪意のあるメールを隔離または削除した後も残り続けます。これは、セキュアメールゲートウェイ(SEG)とAPIベースのメールセキュリティソリューションの両方に影響を及ぼし、2026年2月時点では、ほとんどのソリューションが悪意のあるカレンダーイベントをクリーンアップしません。
Sublimeの組み込み是正機能に基づき、これらのPythonスクリプトは、メールセキュリティソリューションがICSフィッシングメールを隔離した際に、悪意のあるカレンダーイベントを削除します。スクリプトは:
.icsカレンダー添付ファイルやその他のiCalendar準拠の添付ファイルを抽出ピュアPythonであるため、Tines、Splunk SOAR、Cortex XSOARなど、多くのSOARでこれらのスクリプトを実行できます。
また、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"Found malicious invitation for {invitation.user_id}, UID: {invitation.ics_uid}")
def log_event(invitation, event):
print(f"Found calendar event {event.id} matching invitation {invitation.ics_uid}")
fetcher = ProofpointCloudFetcher()
deleter = GoogleWorkspaceEventDeleter()
delete_events_from_remediated_emails(
fetcher,
deleter,
mode="delete_events", # デフォルトのdry_runモードをオーバーライド
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認証とプロバイダー固有のロジックを処理します。