エグゼクティブサマリー
Rubrik Zero Labsが構築したAI支援型マルウェア解析パイプラインにより、「GhostChrome-X」と命名された新たな脅威が特定されました。認証情報の窃取やセッションハイジャックを主目的とする従来のブラウザベースマルウェアとは異なり、GhostChrome-XはChromeブラウザを通じたアクセスの確立・維持において、より高度なアプローチを採用しています。
GhostChrome-Xが注目される点は、主に2つあります。第一に、このマルウェアはChromeの拡張機能トラストモデルを直接標的とし、保護された設定ファイルを改ざんしたうえで、攻撃者が制御する拡張機能を正規のブラウザコンポーネントとしてChromeに受け入れさせるための整合性メタデータを偽造します。第二に、データ窃取専用の拡張機能として機能するだけでなく、ブラウザベースのアクセスとOSレベルのコマンド実行を統合し、ブラウザを攻撃者の継続的な活動基盤として機能させます。
長期的なアクセスを維持するため、GhostChrome-XはPowerShellスクリプト、スケジュールタスク、レジストリRunキー、ウォッチドッグ機能など、複数の永続化・復旧メカニズムを展開します。これらのコンポーネントにより、悪意のある拡張機能が削除・改ざんされた場合でも、自動的に復元・再インストールが行われます。
拡張機能が有効化されると、リモートのコマンド&コントロール(C2)サーバーと通信を開始し、ブラウザのCookie、閲覧履歴、フォーム送信データを収集するほか、感染システム上でのリモートコマンド実行にも対応します。また、WebAuthnの操作を監視し、被害者のブラウザセッション内から攻撃者がWebAuthn対応Webサイトと直接やり取りできるようにします。
GhostChrome-Xにおいて最も重要な点は、情報窃取能力そのものではなく、Chromeの内部整合性メカニズムを悪用し、攻撃者が制御する拡張機能をユーザーに気づかれることなく登録・維持できる点にあります。これはブラウザベースマルウェアとしては異例の高度な理解をChromeの拡張機能セキュリティモデルに対して示しており、現代の脅威がブラウザを単なる認証情報の取得源ではなく、攻撃の運用基盤として活用する傾向を強めていることを浮き彫りにしています。

技術的詳細
初期感染
GhostChrome-Xの初期感染経路は現時点では不明です。ただし、Authenticator.exeやchrome_updater.exeといったファイル名が存在することから、正規の認証ユーティリティやChromeアップデートコンポーネントに偽装されていた可能性があります。フィッシングメール、悪意あるダウンロード、偽のブラウザアップデート、あるいは信頼されたソフトウェアプロバイダーを装ったWebサイトを通じて、被害者がファイルを実行するよう誘導されたと考えられます。
Nimベースのローダーおよびインストーラー
GhostChrome-XはNimプログラミング言語を使用してコンパイルされています。Nimはスタンドアロン実行ファイルの生成能力、クロスプラットフォーム対応、比較的小さなバイナリサイズを理由に、マルウェア開発者の間で人気が高まっている言語です。NimバイナリはC/C++の従来アプリケーションとは異なる構造とランタイムを持つことが多く、解析や検出がより困難になる場合があります。
実行されると、GhostChrome-Xはsvc_update.ps1という名前のPowerShellスクリプトを%TEMP%ディレクトリに書き込み、実行します。悪意ある拡張機能を登録する前に、このPowerShellスクリプトはChromeの整合性保護された設定ファイルを改ざんし、Chrome整合性メタデータの偽造を実施します。具体的には、攻撃者が制御する拡張機能設定に対して新しいHMAC値を生成し、関連するsuper_mac値を計算します。
これらの改ざんは拡張機能の登録前に実施されるため、Chromeが悪意ある設定を受け入れ、整合性検証の失敗を理由に拡張機能を拒否することを防ぎます。整合性メタデータの更新が完了すると、マルウェアは悪意ある拡張機能、ネイティブメッセージングコンポーネント、PowerShellスクリプト、そしてブラウザベースのC2およびOSアクセスを確立するための永続化メカニズムの展開へと進みます。
Chrome拡張機能の整合性検証の仕組み
GhostChrome-XがChromeの整合性保護機構をどのようにバイパスするかを理解するためには、まずChromeが拡張機能の設定データをどのように保存・検証しているかを把握することが重要です。
Chromeは拡張機能の設定データをユーザーのChromeプロファイルディレクトリ配下の2つのプロファイルファイル、PreferencesとSecure Preferencesに保存しています。
- %LOCALAPPDATA%\Google\Chrome\User Data\Default\Preferences
- %LOCALAPPDATA%\Google\Chrome\User Data\Default\Secure Preferences
Preferencesファイルには一般的なブラウザおよび拡張機能の設定が含まれているのに対し、Secure Preferencesには保護された設定エントリの不正改ざんを検出するためにChromeが使用する追加の整合性メタデータが含まれています。ブラウザの起動時、Chromeは両ファイルを読み込んで拡張機能の状態を再構築し、保護された設定エントリの整合性を検証します。
拡張機能がインストールされると、ChromeはPreferencesファイル内のextensions.settingsの下に登録エントリを作成します。このエントリには、拡張機能ID、インストールパス、権限、インストールタイムスタンプ、状態などの情報が含まれています。簡略化した例を以下に示します。

ただし、拡張機能エントリを追加するだけでは不十分です。Chromeはprotection.macs構造体に保存された整合性レコードを使用してこれらの設定を保護しています。この例では、HMAC値が拡張機能の登録エントリを保護しています。ブラウザの起動時、Chromeは拡張機能設定のHMACを再計算し、保存されている値と比較します。値が一致しない場合、Chromeはその設定が改ざんされたと判断します。

Chromeはデベロッパーモードなど、特定の拡張機能関連の設定も保護しています。例を以下に示します。

個別のHMACエントリに加えて、Chromeはsuper_macと呼ばれるマスター整合性値を管理しています。この値はprotection.macs構造体全体から計算されます。

このため、保護された設定を変更するには、設定値を書き換えるだけでは不十分です。対応するHMACも再生成する必要があり、整合性を維持するためにsuper_macも計算し直さなければなりません。これらの整合性値を更新しなければ、ブラウザの起動時にChromeの検証プロセスが改ざんを検出します。
GhostChrome-XはChromeの標準的な拡張機能インストールプロセスを使用する代わりに、PowerShellスクリプトsvc_update.ps1を実行してChromeのPreferencesおよびSecure Preferencesファイルを直接改ざんします。このアプローチにより、通常の拡張機能インストールワークフローやユーザーの承認なしに、悪意ある拡張機能をサイレントに登録し、改ざんされた設定を信頼済みとしてChromeに受け入れさせるために必要な整合性メタデータを生成することが可能になります。
悪意ある拡張機能登録のためのHMAC偽造
ChromeがどのようにChromeの設定データを保存・検証するかを理解したところで、GhostChrome-Xがこのメカニズムをどのように悪用しているかを詳しく見ていきます。
スクリプトsvc_update.ps1はまずインストール済みのChromeディレクトリを特定し、resources.pakファイルからChromeのマシン固有キーを抽出します。次にデバイス識別子を生成し、図1に示すように悪意ある拡張機能のパスC:\Users\<user>\AppData\Local\Google\Chrome\User Data\Default\Extensions\Authenticatorに対応する拡張機能IDを計算します。このディレクトリはその後、悪意ある認証拡張機能(Authenticator)の保存場所として使用されます。この拡張機能はマルウェアのメインブラウザコンポーネントとして機能し、その後Chromeの設定内に登録されます。
これらの値を取得した後、スクリプトはユーザーのプロファイル内にあるChromeのPreferencesおよびSecure Preferencesファイルを特定します。これらのファイルはその後改ざんされ、悪意ある拡張機能の登録と、Chromeに変更を受け入れさせるために必要な整合性メタデータの更新が行われます。
図1 – 拡張機能IDの生成とChromeプロファイルの探索“>
Chromeの設定ファイルを特定した後、スクリプトはSecure Preferencesの内容を読み込み、解析します。ファイルが利用できない場合はPreferencesを代わりに使用します。図2に示すように、Chromeの整合性メタデータから既存の_encrypted_hashエントリを削除します。これにより、悪意ある拡張機能設定の挿入と、Chromeが改ざんされた設定を受け入れるために必要な新しい整合性値の生成に向けた準備が整います。
図2 – Preferences/Secure Preferencesファイルからの暗号化ハッシュの削除“>
次にスクリプトは、図3に示すように悪意ある認証拡張機能(Authenticator)に対する完全な拡張機能登録オブジェクトを構築します。この登録レコードは以下の権限を付与します。
- activeTab
- background
- clipboardRead
- cookies
- history
- nativeMessaging
- tabs
- declarativeNetRequest
- scripting
さらに、拡張機能には以下の設定が構成されています。
- explicit_host: <all_urls>
- scriptable_host: <all_urls>
<all_urls>設定により、拡張機能はユーザーが訪問するすべてのWebサイトにアクセスして操作できるようになります。explicit_hostエントリはすべてのドメインのWebコンテンツへのアクセスを許可し、scriptable_hostはそれらのWebサイトへのスクリプトの注入と実行を可能にします。これらの権限を組み合わせることで、拡張機能は被害者の閲覧活動に対して幅広い可視性と制御権を手に入れます。
スクリプトはその後、拡張機能のインストールパスを追記して状態を有効に設定し、計算された拡張機能IDを使用してChromeのextensions.settingsセクションに登録レコードを挿入します。これにより、悪意ある認証拡張機能がChromeの設定データベースに正式に登録され、ブラウザ起動時に認識・読み込まれるようになります。
図3 – 拡張機能設定“>
悪意ある拡張機能を登録した後、スクリプトはextensions.ui.developer_modeをtrueに設定することでChromeのデベロッパーモードを有効化します。これにより、拡張機能がChromeの通常のインストールプロセスを経ずにインストールされたものであるため、ブラウザがディスク上に保存されたファイルから直接認証拡張機能(Authenticator)を読み込めるようになります。
スクリプトは図4に示すように、まだ存在しない場合はChromeの設定内にprotection、macs、super_mac構造体を作成します。さらにprotection.macs.extensions.settingsとprotection.macs.extensions.uiの下に追加のコンテナが作成され、その後、新しく追加された拡張機能とデベロッパーモード設定に対応する整合性値が格納されます。
図4 – Chrome整合性メタデータ構造体の作成“>
悪意ある拡張機能が登録されると、スクリプトは先ほど抽出したChromeマシンキーとデバイス識別子を使用してextensions.ui.developer_mode設定の有効なHMACを生成します。図5に示すように、生成された値はChromeの整合性チェックを満たすためにprotection.macs.extensions.ui.developer_modeの下に保存されます。
次にスクリプトは、改ざんされた設定に関連する既存のdeveloper_mode_encrypted_hashとsettings_encrypted_hashエントリを削除し、古い整合性値が新しく生成された署名と競合しないようにします。
図5 – デベロッパーモードHMACの生成“>
次にマルウェアはextensions.settings.<extension_id>の下に位置する悪意ある認証拡張機能エントリのHMACを生成します。この整合性値はprotection.macs.extensions.settingsに挿入され、図6に示すように新しく追加された拡張機能に対応する整合性レコードが効果的に作成されます。
すべての個別HMAC値が生成された後、スクリプトはprotection.macs構造体全体をシリアライズし、保護された設定データに対するChromeのマスター整合性値として機能する新しいsuper_macを計算します。
最後に、悪意ある拡張機能の登録、デベロッパーモード設定、新しく生成されたHMAC、更新されたsuper_macを含む改ざんされた設定が、対象設定ファイル(Secure Preferences)に書き戻されます。これにより整合性偽造プロセスが完了し、次回のブラウザ起動に向けて改ざんされたChromeプロファイルの準備が整います。
図6 – 拡張機能HMACおよびsuper_macの生成“>
Secure Preferencesの更新後、スクリプトはChromeのPreferencesファイルに対しても同様の改ざんを実施します。悪意ある認証拡張機能エントリを挿入し、developer_modeを有効化した後、更新された設定をディスクに書き戻します。ファイルを保存する前に、図7に示すようにexit_typeの値を「crashed」から「none」に置き換え、次回の起動時にChromeがクラッシュ回復プロンプトを表示しないようにします。両方の設定ファイルを更新することで、マルウェアはChromeの設定データベース全体にわたって拡張機能の登録とデベロッパーモードの設定に一貫性を持たせます。
図7 – Chrome Preferencesファイルの改ざん“>
追加ペイロードの展開と永続化
悪意ある拡張機能の長期的なアクセス維持と動作継続を確保するため、GhostChrome-XはC:\Users\<user_name>\AppData\Roaming\Microsoft\Protect\Cache\ディレクトリ内に複数のサポート用PowerShellスクリプトを展開します。具体的にはhttp_proxy.ps1、svc_watchdog.ps1、svc_integrity.ps1が書き込まれ、これらが一体となって感染の維持に必要なインフラを提供します。
GhostChrome-Xはその後、以下のメカニズムを通じて永続化を確立します。
- スケジュールタスクMicrosoft\Windows\Application Experience\StartupAppTaskを作成し、svc_watchdog.ps1を5分ごとに実行。
- スケジュールタスクMicrosoft\Windows\Application Experience\ProgramDataUpdaterを作成し、ユーザーのログオン時にsvc_integrity.ps1を実行。
- レジストリRunキーWindowsSecurityUpdateを作成し、ユーザーのログオン時にsvc_integrity.ps1を実行。
- レジストリRunキーSystemHealthMonitorを作成し、ユーザーのログオン時にhttp_proxy.ps1を実行。
悪意ある拡張機能の展開と設定の復旧
svc_integrity.ps1スクリプトは、マルウェアの主要なインストールおよび復旧メカニズムとして機能します。このスクリプトはユーザーのログオン時にProgramDataUpdaterスケジュールタスクを通じて実行されるほか、svc_watchdog.ps1からも呼び出されます。この仕組みにより、GhostChrome-Xはブラウザベースのコンポーネントが部分的に削除された場合でも自動的に復元することができます。
実行されると、スクリプトはまず実行中のすべてのChromeプロセスを終了させ、以下のパスに悪意ある認証拡張機能(Authenticator)のディレクトリを作成します。
- C:\Users\aptma\AppData\Local\Google\Chrome\UserData\Default\Extensions\Authenticator\
次に図8に示すように、スクリプト自体に埋め込まれたBase64エンコードデータからbackground.js、content.js、manifest.jsonを含む拡張機能コンポーネントを書き込みます。これらのファイルが拡張機能のC2通信、データ収集機能、ブラウザ操作機能を実装します。
図8 – svc_integrity.ps1の内容“>
拡張機能ファイルの展開後、スクリプトは先述したChrome設定と整合性の操作プロセスを繰り返し、設定が改ざんまたは部分的に削除された場合でも悪意ある拡張機能が登録・信頼された状態でブラウザに読み込まれ続けるようにします。
最後に、スクリプトは127.0.0.1:18923でローカルHTTPコマンド実行サービスが動作していることを確認します。サービスが利用できない場合は自動的にhttp_proxy.ps1を起動し、拡張機能がリモートC2インフラから受信したOSコマンドを実行する能力を維持します。
ローカルコマンド実行サービス
http_proxy.ps1は127.0.0.1:18923でローカルHTTPサービスを起動します。このサービスは悪意ある拡張機能からのリクエストを継続的に待ち受け、JSON形式で受信したコマンドを処理します。
スクリプトはshell_commandとls_commandの2つのコマンドをサポートしています。shell_commandはcmd.exeを通じて任意のコマンドを実行し、ls_commandは図9に示すように指定されたパスのディレクトリ一覧を取得してリクエスト元に返します。
要求されたアクションを実行した後、スクリプトは出力をJSON形式のレスポンスにまとめて拡張機能に返送します。このサービスはバックグラウンドで動作し続け、拡張機能がプロセスを直接生成することなくOSと連携できるようにします。
リモートC2サーバーから受信したコマンドは拡張機能によってこのローカルサービスに転送され、被害者のシステム上で実行された後、結果が拡張機能に返されて攻撃者に送信されます。
図9 – コマンド実行“>
コマンド実行へのChrome Native Messagingの悪用
GhostChrome-Xは主にhttp_proxy.ps1が実装するローカルHTTPサービスを通じてOSコマンドを実行しています。ただし、ローカルHTTPサービスが利用できなくなった場合に備えた副次的な実行メカニズムとして、ChromeのNative Messaging機能も悪用しています。
悪意ある認証拡張機能とローカルOSプロセス間の通信を可能にするため、GhostChrome-Xは以下のレジストリエントリを作成してChrome Native Messagingホストを登録します。
- “HKCU\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.google.authenticator” /ve /d “C:\Users\<user_name>\AppData\Local\Google\Chrome\User Data\Default\Extensions\Authenticator\NativeHost\com.google.authenticator.json” /f
このコマンドは現在のユーザーのChromeプロファイル配下にNative Messagingホストの登録を作成し、ホスト名com.google.authenticatorを以下の場所にあるcom.google.authenticator.jsonというマニフェストファイルと関連付けます。
- C:\Users\<user_name>\AppData\Local\Google\Chrome\User Data\Default\Extensions\Authenticator\NativeHost\
悪意ある拡張機能がchrome.runtime.sendNativeMessage() APIを呼び出すと、Chromeは登録されたマニフェストファイルを特定してその設定を読み込み、設定されたNative Messagingホストを起動します。
今回のキャンペーンでは、マニフェストファイルは同じNativeHostディレクトリに保存されたhost.cmdを指しており、拡張機能から受信したコマンドを処理するNative Messagingホストとして機能します。http_proxy.ps1が実装するローカルHTTPサービスとの通信が失敗した場合、background.jsは自動的にNative Messagingにフォールバックし、com.google.authenticatorホストを通じてコマンドを転送します。この結果、GhostChrome-Xはリモートのキャンペーンサーバーから受信したコマンドを被害者のシステム上で実行できるブラウザ-システム間の二次通信チャネルを確立します。
拡張機能マニフェストの設定
拡張機能のmanifest.jsonファイルは、マルウェアが動作するために必要なコンポーネントと権限を定義しています。図10に示すように、この設定はbackground.jsを拡張機能のサービスワーカーとして登録し、<all_urls>マッチパターンを通じて被害者が訪問するすべてのWebサイトにcontent.jsを注入します。
マニフェストはcookies、history、tabs、scripting、clipboardRead、nativeMessaging、declarativeNetRequestなど複数の高リスク権限を付与しています。これらの権限により、拡張機能はブラウザのCookieへのアクセス、閲覧履歴の収集、ブラウザタブとの操作、WebページへのスクリプトのインジェクションのほかChrome Native Messagingを通じたローカルプロセスとの通信、およびネットワーク関連のブラウザ動作の変更が可能になります。
図10 – Manifest.json “>
バックグラウンドサービスワーカーとC2通信
background.jsファイルは悪意ある認証拡張機能の主要なC2コンポーネントとして機能します。読み込まれると、ハードコードされた認証トークンを使用してwss://authenticators.duckdns.org/wsへの永続的なWebSocket接続を確立し、攻撃者からのコマンドを継続的に待ち受けます。
図11に示すように、拡張機能はdump_cookiesやdump_historyなどのブラウザデータ収集操作を含む複数のコマンドをサポートしており、攻撃者は感染システムからブラウザのCookieと閲覧履歴を取得することができます。
OSとの操作については、拡張機能はshell_commandとls_commandをサポートしています。C2サーバーからこれらのコマンドを受信すると、background.jsはhttp_proxy.ps1が実装する127.0.0.1:18923で動作するローカルHTTPサービスにコマンドを転送します。PowerShellスクリプトは要求されたコマンドを実行して拡張機能に結果を返し、その後WebSocket接続を通じて攻撃者に出力が送信されます。
図11 – コマンド実行“>
フォームデータとWebAuthnの傍受
content.jsファイルは被害者が訪問するWebサイトに注入され、Webページからのデータ収集を担います。図12に示すように、このスクリプトはHTMLフォームを監視してフィールド名、値、現在のページURLを含む送信済みフォームデータを取得します。収集された情報は拡張機能のバックグラウンドサービスワーカーに送信され、そこから攻撃者のC2サーバーに転送されます。
フォーム送信を監視することで、GhostChrome-Xはユーザー名、パスワード、メールアドレス、連絡先情報、支払い詳細など、HTMLフォームを通じて送信されたあらゆる機密情報をWebアプリケーションから収集することができます。
フォーム監視に加えて、スクリプトはnavigator.credentials.get()関数をフックすることでWebAuthn認証リクエストを傍受します。Webサイトがまたは認証操作を実行しようとするたびに、拡張機能はそのイベントを記録してバックグラウンドサービスワーカーに通知します。
図12 – Content.json“>
スクリプトはまた、拡張機能を通じて受信するwebauthn_requestコマンドも処理します。図13に示すように、トリガーされると隠しiframeを作成して攻撃者が制御するURLを読み込み、WebAuthnリクエストデータをそのページに渡します。iframeにはWebAuthn APIの使用許可が与えられており、攻撃者が制御するコンテンツが被害者のブラウザセッション内で実行できるようになります。
この機能の正確な目的は入手可能なコードからは特定できませんが、パスキー、セキュリティキー、その他のWebAuthnベースの認証メカニズムを使用するWebサイトに対して攻撃者が制御する操作を実行することを可能にします。これにより攻撃者は被害者の認証済みブラウザコンテキスト内からWebAuthn関連の操作を監視または開始できる可能性があります。
図13 – 隠しIframeを通じたWebAuthnリクエストの処理“>
まとめ
GhostChrome-Xは、現代の脅威がいかにブラウザを永続化、監視、システムアクセスの基盤として活用しているかを示す好例です。データ収集能力そのものは比較的シンプルですが、ブラウザ拡張機能、Native Messaging、コマンド実行、復旧メカニズムを統合することで、侵害されたシステム上に強靭な足場を攻撃者に提供しています。ブラウザが認証やオンラインサービスへのアクセスにおいて中心的な役割を果たし続ける現状において、信頼されたブラウザ機能の悪用は脅威アクターにとって引き続き魅力的な手法であり続けるでしょう。
翻訳元: https://zerolabs.rubrik.com/blog/inside-ghostchrome-x-chrome-extension-integrity-bypass