ゴーストメール作戦:ロシアのAPTがZimbra Webmailを悪用し、ウクライナの国家機関を標的に
Contents
- イントロダクション
- ターゲット
- フィッシングメール
- 感染分析
- ステージ1:JavaScriptローダー
- ステージ2:ブラウザ窃盗
- インフラストラクチャとアトリビューション
- CVE評価
- 結論
- Seqrite カバレッジ
- IOC
- MITER ATT&CK
イントロダクション
Seqrite 研究所は、クロスサイトスクリプティング(XSS)の脆弱性を悪用する標的型フィッシングキャンペーンを特定しました。 Zimbraコラボレーション (ZCS)はウクライナ政府機関を侵害する目的で作成されました。このフィッシングメールには悪意のある添付ファイル、不審なリンク、マクロは一切含まれていません。攻撃チェーン全体が単一のメールのHTML本文内に存在し、悪意のある添付ファイルはありません。
ソーシャルエンジニアリングを利用したインターンシップの問い合わせメールを装い、難読化されたJavaScriptペイロードをメール本文に直接埋め込んで送信します。被害者が脆弱なZimbraウェブメールセッションでメールを開くと、 HTMLコンテンツ内のCSS @importディレクティブのサニタイズが不十分なために発生する保存型XSSバグであるCVE-2025-66376が悪用されます。スクリプトはブラウザで静かに実行され、認証情報、セッショントークン、バックアップ2FAコード、ブラウザに保存されたパスワード、および被害者のメールボックスの過去90日間の内容を収集し、すべてのデータをDNSとHTTPSの両方で外部に送信します。
Zimbraの攻撃手法との技術的な重複や地政学的な標的設定の一致に基づき、我々は、この攻撃が、ウクライナ政府機関を標的としたロシア政府支援の侵入グループで過去に確認された攻撃手法と一致すると、中程度の確信度で判断する。この件はCERT-UAに報告済みである。
ターゲット
- 国:ウクライナ
- 分類 : 政府
このメールの受信者は、ウクライナ国家水文庁の職員です。同庁は、船舶の航行、海事、水路測量支援を担う、国家重要インフラに分類される分野で活動しています。同庁はインフラ省(具体的にはウクライナ国家海事河川輸送局)の管轄下にあります。今回の標的は、地域紛争の激化が続く中で、ウクライナの公共機関に対して行われている広範なサイバー攻撃の一環です。
フィッシングメール
2026年1月22日、国立内務アカデミー(NAVS)の学生からウクライナ水文局宛てにフィッシングメールが送信されました(送信元IPアドレスがヘッダーに記載されていることから、学生のメールアドレスは不正アクセスされたものと思われます)。ウクライナ語で書かれたこのメールは、一見すると通常のインターンシップに関する問い合わせのようで、学生は4年生であることを名乗り、インターンシップの機会や連絡先を知っているかどうかを尋ねています。さらに、送信者はメールが間違った受信箱に届いた場合に備えて謝罪しており、これは信頼を築くための典型的な手口です。

主な所見:
- NAVS関連のインフラストラクチャから送信されました
- 一見すると正当なものに見える
- 悪意のある添付ファイルや不審な外部リンクはありません。
- HTML本文に直接埋め込まれた悪意のあるコード
- VirusTotalでは検出結果がゼロ。このウイルスは2月26日にウクライナから最初に確認され、アップロードされた。

攻撃者は、自動化ツールによる動作ではなく、Chrome 132(2026年1月14日安定版リリース)上のZimbraウェブインターフェースを通じて手動でこのメールを作成しました。
- 8.15_GA_4717 – 送信者のZimbraサーバーバージョン
- 10.1.7_GA_4200002 – ZimbraWebClient フロントエンド UI ビルド番号

メールには、隠された悪意のあるJavaScriptが埋め込まれていますブロック。これは、HTML本文内に含まれる大きなbase64エンコードされたスクリプトです。@importタグ名のバイパスは、正規表現による検査では不正なHTMLのように見えるように設計されており、ブラウザの解析では有効なままです。

このサンプルに含まれるエクスプロイトは、Zimbra Collaboration Suite の保存型 XSS 脆弱性である CVE-2025-66376 に該当し、ZCS 10.0.18 / 10.1.13 (2025 年 11 月) で修正されています。CVE の説明には、「HTML コンテンツのサニタイズが不十分であり、特に @import ディレクティブやその他のスクリプト挿入ベクトルを含む細工されたタグ構造と属性値が関与している。この脆弱性は、ユーザーがクラシック UI で細工された電子メール メッセージを表示したときに発生する」と記載されています。
このバイパスは、タグ名と属性キー/値文字列から@importトークンが削除されることで機能します。メールには、同じ原理を使用した二次的なおとりも含まれています。 and tags with @import noise injected into the tag name itself, and an HTML comment inserted mid-tag-name. This tag-name bypass causes AntiSamy to reconstruct from fragmented tokens, and executes the outer Base64 decoded code and the self-executing function runs.
感染分析
被害者はZimbraウェブメールでフィッシングメールを受信します。実行には、被害者が認証済みのセッションが有効なブラウザベースのZimbraインターフェースでメールを開く必要があります。JavaScriptはセッションコンテキスト内で実行され、セッションのCookie、localStorage、および同一オリジンSOAP APIの権限を継承します。

ステージ1:JavaScriptローダー
ローダーは自己実行関数でラップされており、まずID「zmb_pl_v3_ 」のスクリプトが既に実行されているかどうかをチェックして、複数回のインジェクションを防止します。次に重要な部分は、 atob()を使用してbase64ペイロードをデコードし、キー「twichcba5e」とのXOR演算を実行して最終的なJavaScriptペイロードをロードすることです。このコードは、セッションコンテキスト、Cookieへのアクセス、Webメールiframeサンドボックスからの脱出機能を含むため、トップレベルのドキュメントに挿入されます。

ステージ2:ブラウザ窃盗
最終ペイロードは、ブラウザのメモリ内で実行されるスティーラーです。これは、ログイン認証情報、SOAP セッション トークン、メールの内容と添付ファイル、Cookie などをキャプチャします。まず、実行ごとにセッション トークンを生成します。これは、C2 リクエストごとに一意の被害者識別子として使用されるランダムな 12 文字の英数字文字列です。ハードコードされた C2 ドメインはzimbrasoft[.]com[.]uaです。ペイロード内のどこかで例外が捕捉されると、ステージ名、エラー メッセージ、スタック トレースを含む POST リクエストが /v/p に送信されます。C2 オペレーターは、被害者マシンごとにどのステップが失敗したか、その理由を正確に把握できます。すべてのタスクを try/catch ラッパーで囲むことで、失敗を分離し、1 つの操作が失敗しても他の操作が中断されないようにしています。

次に、Zimbra SOAPラッパーがあり、認証済みのSOAPリクエストを被害者自身のZimbraサーバー(/service/soap/)に送信します。X-Zimbra-Csrf-Tokenヘッダーには盗まれたCSRFトークンが含まれているため、リクエストは正規のウェブメールアクティビティと区別がつきません。SOAP呼び出しは、エラーをスローする代わりに失敗した場合にnullを返すようにラップされているため、1つのSOAP呼び出しが拒否された場合でも、他の並列処理が可能になります。

DNSデータ漏洩は、値をRFC 4648 Base32形式でエンコードし、60文字のセグメントに分割して、次の形式のDNSホスト名を構築します。
- d- 。 。 .i[.]zimbrasoft[.]com[.]ua
次に、JSON オブジェクトを application/octet-stream ブロブとしてシリアル化し、X-Filename ヘッダーを付けて /v/d に POST します。このヘッダーは、サーバー構成の完全なダンプなど、より大きな構造化オブジェクトに使用されます。ビーコンは /v/p への単純な POST リクエストで、DNS と併用またはDNS の代わりに、小さな構造化データに使用されます。また、同じ値を DNS と HTTPS の両方で送信することもできます。DNS は HTTPS がブロックされている場合でも通過し、HTTPS はブロックされていない場合に完全なデータを伝送します。

Zimbra Classic UI は、セッション CSRF トークンをここに平文で保存します: localStorage.getItem(“csrfToken”)。これがないと、すべての SOAP 呼び出しが拒否されます。これは、SOAP 操作が開始される前に最初に同期的に実行されます。

Promise.allを使用すると、9 つの並列操作すべてが同時に起動されます。C2 の観点からすると、タブが 10 秒後に閉じられた場合、実行可能な操作はすべて既に実行されているため、被害者セッションあたりのデータ取得量が最大化されます。
SendStartPing:ペイロードの実行開始後にC2に通知します。これにより、攻撃者は被害者ごとの開始時刻と終了時刻を関連付けることができます。
gather_email:2つの方法によるメールアドレス収集。まず、ページ読み込み時にZimbraが埋め込むbatchInfoResponse JS変数のインライン<script>タグをスクレイピングします。うまくいかない場合は、 GetIdentitiesRequest SOAPにフォールバックし、エイリアスを含むすべての設定済みIDを返して、DNSとHTTPS経由でデータを外部に送信します。

gather_environment:クライアントのフィンガープリントを取得し、GetInfoRequestを呼び出してサーバー構成応答全体を取得し、そのJSON全体をzimbra_batch_analytics.jsonとして出力します。このオブジェクトには、Zimbraのバージョン、アカウントのクォータ、構成済みの機能、サーバーのホスト名、および数十のアカウント設定が含まれています。
- クラシック(?client=advanced)
- HTML (/h/)
- 現代(/modern/)。
gather_2fa_codes : GetScratchCodesRequestを使用して、アカウントのバックアップ2FAリカバリコードを取得します。これらは緊急アクセス用のワンタイムコードであり、被害者がパスワードを変更してすべてのセッションを取り消した場合でも、攻撃者はこれらを使用して認証を行うことができます。各コードはDNS経由で個別に外部に送信されます。

gather_app_password:これはCreateAppSpecificPasswordRequestを使用して、 ZimbraWebという名前の新しい永続的な認証情報を生成します。アプリ固有のパスワードは、パスワードのリセット後も保持されます。これは攻撃者による長期的なアクセスメカニズムであり、一度作成されると、直接IMAPまたはAPI認証を無期限に有効にし、DNS経由でデータを流出させます。
gather_device_status : GetDeviceStatusRequest (namespace urn:zimbraSync) は、ActiveSync に接続されているすべてのモバイルデバイスを、デバイス ID、タイプ、同期状態などの詳細情報とともに返します。これは、ターゲットプロファイルの作成や、その後のモバイル攻撃に役立ちます。
gather_oauth_consumers : GetOAuthConsumersRequestは、アカウントで承認されているすべてのサードパーティ OAuth アプリを一覧表示するために使用されます。これにより、ターゲットが使用している他のプラットフォームと、それらのプラットフォームのうちどれが受信トレイへの API レベルのアクセス権を持っているかが明らかになります。

gather_autocomplete_password:この操作は、DOM内に2つの非表示フォームフィールド(autocomplete=”username”とautocomplete=”current-password”)を画面外に挿入し、ブラウザのパスワードマネージャが自動入力するまで5秒間待機します。その後、表示された内容を読み取り、外部に持ち出し、挿入されたすべての要素をクリーンアップします。この操作はブラウザをターゲットとしており、Zimbraをターゲットとしていないため、CSRFトークンを必要としない唯一の操作です。
enable_mail_protocols : ModifyPrefsRequestは、被害者のアカウントで zimbraPrefImapEnabled: TRUE を設定します。これにより、IMAP アクセスが密かに有効になり、アプリのパスワードを使用して、任意の IMAP クライアントから永続的なメールボックス監視を行うことができます。

最も重要なセクションである、 90日間のメール流出のためのsendArchivesについて説明します。これは0日目から89日目までループし、Zimbraの組み込みエクスポートエンドポイント「/home/~/?fmt=tgz」から毎日、迷惑メール以外のメールをダウンロードします。そして、毎日ダウンロードした.tgzファイルをjs-[token].i.zimbrasoft.com.ua/v/d経由で直接アップロードします。アップロードモードは2種類あります。
- 最新のブラウザ向けには、ストリーミング(ReadableStreamを直接パイプ処理し、メモリバッファを使用しない)に対応しています。
- 古い機種向けには、500MBの上限を持つバッファ付きアレイが用意されています。

これは、localStorage キー (zd_comp_YYYY-MM-DD) をチェックポイントとして使用します。タブが再度開かれた場合、既にデータ流出された日付はスキップされます。タイムアウトは 1 日あたり 24 時間に設定されているため、タブが開いている間はデータがストリーミングされ続けます。
最後に、sendFinishPingビーコンが送信され、すべての操作が完了したことを確認します。C2は、start/finishを使用して、被害者のセッションがどれくらい続いたかを測定し、キャプチャされた内容を推測できます。

インフラストラクチャとアトリビューション
C2ドメインは、フィッシングメールが送信される直前の2026年01月20日12時10分33秒(UTC)に、レジストラ名がua.drsで作成されました。これまでに02つの生成ドメインが特定されています。
- js-l1wt597cimk[.]i[.]zimbrasoft[.]com[.]ua
- js-26tik3egye4[.]i[.]zimbrasoft[.]com[.]ua
これまで、ロシア関連の複数のAPTグループが、東欧の標的に対してZimbraを大規模に悪用してきました。Fancy Bear(APT28)、Cozy Bear(APT29)、Winter Vivern(TA473)などがその例です。APT29によるZimbraの悪用は、脆弱なメールサーバーを介してメール認証情報を盗むコマンドインジェクションの脆弱性を利用したものです。これはメール操作を必要としないサーバーサイド攻撃であり、被害者がウェブメールでメールを開く必要があるHTMLメールのXSSペイロードであるフィッシングメールとは全く異なる攻撃クラスです。一方、TA473は高度なツールを使用せず、ZimbraのXSS脆弱性を利用した軽量なJavaScript認証情報窃盗ツールのみを使用しました。構造化されたSOAP APIの悪用や、デュアルチャネルのデータ流出は行われていません。
ESETが2024年に発表したOperation RoundPressの調査で述べたように、APT28はRoundcubeからZimbra、Horde、MDaemonへと活動範囲を拡大し、東欧の政府機関や防衛関連企業を標的にしました。今回解読したペイロード構造は、SpyPress.ZIMBRAと酷似しており、SOAPリクエストをZimbra APIエンドポイントに送信することで被害者の連絡先リストを収集し、メールソースを取得してデータ流出に利用します。これらの類似点と標的設定に基づき、Operation GhostMailはAPT28によるものと中程度の確信度で判断しました。
結論
Operation GhostMailは、ウェブメールを標的とした侵入の継続的な進化を示しており、攻撃者は従来のマルウェアバイナリではなく、ブラウザに常駐する窃盗ツールに完全に依存しています。難読化されたJavaScriptをHTMLメールに直接埋め込み、ZimbraウェブメールのXSS脆弱性を悪用することで、攻撃者はファイルのドロップ、マクロの悪用、エンドポイントベースの検出のトリガーなしに、セッションの完全な傍受を実現しました。認証情報の収集とメールボックスのエクスポートのために正規のSOAP API呼び出しを悪用した事例は、プラットフォーム固有の機能がいかに巧妙なデータ収集のために悪用されるかを浮き彫りにしています。
ウクライナ政府機関への攻撃は、同地域の公共機関に対して行われている地政学的なサイバー攻撃活動と一致する。攻撃者の特定にはインフラやコードの重複に関するさらなる確認が必要であるが、使用された手法は、東欧全域のウェブメールプラットフォームを悪用するロシア政府系グループがこれまで行ってきた攻撃手法と一致する。ウェブメール環境における厳格なHTMLサニタイズ、迅速なパッチ管理、異常なSOAPアクティビティの監視の重要性は、ブラウザベースのセッション侵害を示唆している。
Seqrite カバレッジ
スクリプト.トロイの木馬.50486.GC
クライアントの声
- Zimbra 8.8.15 から、サポートされているリリース (最低でも 10.1.x) または代替プラットフォームへ直ちに移行してください。
- すべてのアカウントを監査し、ZimbraWebという名前のアプリ固有のパスワード、または不審なメールの送信日付近に作成されたパスワードがないか確認してください。それらのパスワードは直ちに無効にしてください。
- 特にIMAPアクセスを業務上必要としないアカウントにおいて、zimbraPrefImapEnabled: TRUEという予期しない変更がないか、アカウント設定を監査してください。
- Zimbraの監査ログで、通常とは異なる送信元IPアドレスまたは営業時間外からの/home/~/?fmt=tgzへのアクセスがないか確認してください。
- アプリケーション層でSOAP APIの監視を実装してください。特にGetScratchCodesRequestとCreateAppSpecificPasswordRequestへの呼び出しは、通常の使用ではほとんど発生しないため、ベースラインの設定が容易です。
- IOCドメインに対してDNSフィルタリングを実装し、DNS漏洩チャネルの特徴であるd-[a-z0-9]{12}.i.*サブドメインパターンに対する行動アラートを検討してください。
- ユーザーアカウントに対して、IMAPとPOP3へのアクセスをデフォルトで有効にするべきかどうかを検討してください。管理者レベルで使用されていないプロトコルを無効にすることで、たとえ後で認証情報が漏洩した場合でも、永続的なアクセス経路を1つ排除できます。
- HTMLメールの本文には、ウェブメール環境で実行可能なペイロードが含まれている可能性があることをスタッフに周知徹底してください。添付ファイルやリンクがないことは、信頼できる安全性の指標ではありません。
IOC
メールアドレス
c010f64080b0b0997b362a8e6b9c618e
C2
zimbrasoft[.]com[.]ua
js-[a-z0-9]{12}.i.zimbrasoft[.]com[.]ua
MITER ATT&CK
| 戦略 | TID | 技術 | 手順 |
| リソース開発 | T1583.001 | インフラストラクチャの取得:ドメイン | 攻撃直前に登録されたC2ドメイン |
| リソース開発 | T1586.002 | 侵害アカウント: 電子メール アカウント | NAVSのメールから送信されたフィッシングメール |
| 初期アクセス | T1566.001 | フィッシング:スピアフィッシングアタッチメント | XSSペイロードが埋め込まれたHTMLメール |
| 実行 | T1059.007 | コマンドおよびスクリプト インタープリター: JavaScript | ブラウザ常駐ペイロード |
| 実行 | T1203 | クライアント実行のための悪用 | CVE-2025-66376 XSSが悪用されました |
| 固執 | T1098.001 | アカウント操作:追加のクラウド認証情報 | CreateAppSpecificPasswordRequest は新しい永続的な認証情報を生成します |
| 防衛回避 | T1027 | 難読化されたファイルまたは情報 | XOR + Base64 レイヤードエンコーディング、@import トークン |
| 防衛回避 | T1564.001 | アーティファクトの非表示: 隠しファイルとディレクトリ | ペイロードは目視検査から隠蔽されている |
| クレデンシャルアクセス | T1528 | アプリケーションアクセストークンを盗む | GetOAuthConsumersRequest |
| クレデンシャルアクセス | T1539 | Web セッション Cookie を盗む | localStorageからのCSRFトークン |
| クレデンシャルアクセス | T1111 | 多要素認証の傍受 | GetScratchCodesRequest を介した 2FA コードの盗難対策 |
| クレデンシャルアクセス | T1555.003 | パスワード ストアからの資格情報: Web ブラウザからの資格情報 | オートコンプリートDOMインジェクションハーベスト |
| プーケットの魅力 | T1082 | システム情報の発見 | GetInfoRequestサーバーのフィンガープリント |
| プーケットの魅力 | T1087.003 | アカウントの検出: 電子メールアカウント | GetIdentitiesRequestとDOMスクレイピング |
| プーケットの魅力 | T1069 | 権限グループの検出 | GetOAuthConsumersRequest |
| プーケットの魅力 | T1120 | 周辺機器の発見 | GetDeviceStatusRequest |
| 収集 | T1114.002 | メール収集:リモート | 90日間の掃討作戦 |
| 収集 | T1185 | ブラウザセッションハイジャック | window.top.document iframe エスケープ |
| 収集 | T1213 | 情報リポジトリからのデータ | 設定ダンプ zimbra_batch_analytics.json |
| exfiltration | T1041 | C2チャネルを介した浸透 | HTTPS POST /v/d および /v/p |
| exfiltration | T1071.004 | アプリケーション層プロトコル: DNS | Base32エンコードされたDNSデータ漏洩 |
著者
サトウィック・ラム・プラッキ
カルティック・ジヴァニ



