何が起きたか・対象
Operation RoundPressは、受信メールを表示する際のXSSを使い、複数製品のWebメールを狙った攻撃活動です。攻撃者はJavaScriptを動かすHTMLの要素やイベント属性をメールに含め、標的へ送っていました。
メールはサーバーに保存され、受信者が脆弱なWebメールで開くと、不十分な表示処理によってコードが受信者のブラウザで実行されます。そのコードが本人向けのメールAPIを呼ぶと、ブラウザは送信条件に従ってログイン用Cookieなどを要求へ付けます。APIが返したメール本文をコードが読み、攻撃者のサーバーへ送る経路により、攻撃者は被害者のメールを取得するおそれがありました。 CookieはそのWebメールのAPI宛てで、Domain・Path・Secureなどの条件を満たす要求へブラウザが付けます。コード自身がCookieの値を知らなくても、この送信は行われます。
単一の欠陥ではなく、CVE-2023-43770、CVE-2024-11182、CVE-2024-27443など製品別の問題を含みます。実際の活動の観測と攻撃コードの解析が報告されていますが、全標的での窃取成功を示すものではありません。
報告・修正・公開の時系列
ESETは2023〜2024年の活動を2025-05-15に公表しました。MDaemonは2024-11-01の報告後、11-14の24.5.1で修正されています。Roundcubeの該当修正コミットは2023-09-14、Zimbraは2024-03-01で、攻撃活動の時期と修正時期は製品ごとに違います。
正常ならどう動くはずだったか
外部の送信者が作ったメール本文は、メールサーバーのメールボックスに保存された後、受信者のWebメール画面へ表示されます。装飾やリンクを残す場合も、実行可能なHTMLの要素・属性を除き、本文やヘッダーの値がWebメール自身のJavaScriptとして動かないようにする必要があります。
技術的な原因
Roundcubeでは、本文のリンク参照をHTMLへ変換する際に山括弧などの扱いが不十分でした。MDaemonではHTML解析で特殊なタグの境界を取り違え、実行可能なイベント属性が残りました。 リンク参照の変換は、本文中のURLやメールアドレスをクリックできるHTMLリンクへ直す処理です。そこへ含まれた山括弧がタグの境界として残ると、変換結果の一部が新しいHTML要素・属性になり得ます。製品ごとの全入力文字列と生成HTMLは本記事では再現しておらず、MDaemonの特定タグの詳細も研究資料の確認範囲として扱います。
Zimbraでは、予定招待のX-Zimbra-Calendar-Intended-Forヘッダー由来のcif値が表示用HTMLへ入りました。Hordeについては正確な欠陥を確定できず、古いフィルターでも除去されるため攻撃が機能しなかった可能性があります。 Zimbraでは、ヘッダー由来の値を表示文字としてエンコードせず、HTMLを組み立てる文字列へ入れることが問題です。例えば<b>という入力なら、文字として見せる場合の<b>と、実際にb要素を作る場合では意味が違います。これはエンコードの無害な説明例で、観測されたメールの再現ではありません。
攻撃が成立する条件と流れ
攻撃者が実行可能なHTMLを含むメールを送り、対象者が脆弱なWebメールでその保存済みメールを開くと、表示処理の不備でコードがブラウザ内に入ります。そのコードはWebメールのオリジンで実行され、本人向けのメールAPIなどへHTTPリクエストを送ります。Cookieなどの認証情報が送信条件に従ってそのリクエストに付き、APIがメールを返すと、コードは本文を読み取れます。 オリジンは表示ページのURLのスキーム・ホスト・ポートの組です。ブラウザはコードを書いたメール送信者ではなく、実際にコードを含めて表示したWebメールページの文脈で実行するため、外部の送信者の文字列でも本人向けAPIを呼べるおそれがあります。
- 攻撃者がメールを作成
- 利用者がWebメールで表示
- 閲覧者の権限でAPIを利用
- 取得した内容を外部へ送信
確認された事実と、想定される影響
ESETは実際の攻撃活動を観測し、メール・連絡先・資格情報を取得するコードを解析しています。メール取得では、本人向けAPIが返した本文をコードが読み、攻撃者のサーバーへ送信することで、攻撃者が被害者の会話内容を入手する経路になります。連絡先取得でも、本人向けのアドレス帳を読み外部へ送ることで、人間関係や連絡先を取得するおそれがあります。
資格情報は、ページ内などからコードが読める値と、別途作られるアプリ用パスワードなどを区別します。HttpOnlyでCookieの値が読めなくても、本人の認証情報付きでAPIを呼ぶ操作までは止まりません。具体的な取得機能と条件は製品・攻撃コードごとに異なります。対象組織全てでの成功や全機能の実行を示すものではなく、攻撃者への帰属もESETの評価として扱います。
実際の修正・対応方針
Roundcubeの16ee6865cae8acaa048e234faa1bf9b2704e8c28は、リンク参照として扱う文字列から山括弧を除外します。Zimbraの81c6e8567b1b0f767e466084fb4de0a19a76e505はcifをhtmlEncodeへ通し、HTMLの構造への混入を防ぎます。MDaemonの24.5.1は研究資料で確認でき、差分は未確認です。Hordeの欠陥は確定できません。 Roundcubeでは山括弧をリンク参照の対象から外すことで、その変換を使ってタグの境界を作る経路を止めます。ZimbraのhtmlEncodeは、例えば<を<へ変え、値がHTMLタグとして解析されることを防ぎます。
利用者・運用者が確認すること
製品ごとの修正版を適用し、ログインセッション、転送設定、アプリ用パスワードも調べます。通常のパスワード変更だけでは、別に作られた資格情報や転送ルールが消えるとは限りません。 攻撃コードが転送先を保存したり、通常のパスワードとは別のアプリ用パスワードを発行したりする機能が解析されているためです。元のメールを除いても、サーバー側の設定や別の資格情報は残り得ます。
開発者への教訓(教材としての考察)
受信データの表示で同じサイト内の実行を許すと、正規のメールAPIも窃取の道具になります。Cookieを直接読めるかだけでなく、ログイン状態を使って何ができるかを評価します。
転送設定とアプリ用パスワード
一部のRoundcube向けコードには、メールのコピーを指定先へ転送するSieveルールを作る機能があります。転送先が攻撃者のアドレスとして保存されると、以後メールサーバーが転送するメールを攻撃者が受け取るおそれがあります。元のメール内のコードが動かなくなっても、保存した転送設定が残ることが問題です。
MDaemon向けには、アカウントへ接続する別の資格情報であるアプリ用パスワードを作る機能があります。攻撃者がその値を入手して接続を許可される間は、通常のパスワードを変更した後もアクセスできるおそれがあります。
Roundcube向けコードはページ内のCSRFトークンを読み、その値を正規APIへのリクエストに含めます。別サイトからリクエストだけを送るCSRFと異なり、XSSで同じオリジンの実行権限を得ているため、トークンの読み取りとAPI操作を組み合わせられます。 トークンは正規画面へ渡した値をAPIへ戻させて操作を照合するために使います。別サイトのページは通常、同一オリジンポリシーによりWebメールの応答から値を読めません。一方、Webメール自身のページで動くXSSはその値を読めるため、Cookieとトークンの両方を使った要求を送れるおそれがあります。
出典・確認範囲
- [1] Operation RoundPressESET Research / 確認日 2026-10-29
- [2] Fix XSS in handling of linkrefs in plain text messagesRoundcube / 確認日 2026-10-29
- [3] ZBUG-3730: Sanitize message object before usingZimbra / 確認日 2026-10-29
Hordeの正確な欠陥、各組織の成功・被害範囲、全機能の実行状況は確定できません。