サイバー脅威
ParaSiteSnatcher:ブラジルを標的とする不正なChrome拡張機能
本稿では、Google Chrome APIを利用することにより、被害者のデータを監視、傍受、送信する不正な拡張機能について詳しく解説します。
トレンドマイクロの「潜在的なセキュリティ脅威(Potential Security Threats)」に関する調査により、不正なChrome拡張機能「ParaSiteSnatcher」が発見されました。ParaSiteSnatcherは、攻撃者が複数のソースから機密性の高い情報を監視、傍受、送信することを可能とします。また、強力なChromeブラウザAPIを利用することで、HTTPリクエストによりTCP(Transmission Control Protocol)接続が開始される前に、被害者の機密情報(アカウントや銀行の口座情報等)を含む全てのPOSTリクエストを傍受し、データを抽出します。
この不正な拡張機能は、ラテンアメリカ地域において、特にブラジルのユーザを標的とする設計が施されています。
ParaSiteSnatcherは、Banco do BrasilやCaixa Econômica Federal(Caixa)関連のURLから機密データを抽出します。また、ブラジルの即時決済プラットフォームである「PIX」や、ブラジル中央銀行により管理されている決済方法「Boleto Bancario」を通じた取引を不正に操作します。さらに、個人や企業の納税者番号やMicrosoftアカウントで使用されるクッキーに関するデータも抽出します。
一度インストールされると、拡張機能を通じて有効化された広範なアクセス権を悪用することで、WebセッションやWebリクエストを不正操作することが可能となります。また、Chrome tabs APIを悪用することで、複数タブにおけるユーザの活動を追跡することも可能となります。
このマルウェアは、攻撃者の不正活動を助長する複数のコンポーネント(Web ページへの不正なコードインジェクションを可能にするコンテンツスクリプト、Chrome タブの監視、ユーザの入力とWeb ブラウザ通信の傍受等)を含みます。
ParaSiteSnatcherは、主にGoogle Chromeブラウザを標的にしていますが、Chrome extension APIやランタイムをサポートする他のブラウザ(Microsoft Edgeの新バージョン、Brave、Opera等)も標的とする恐れがあります。不正な拡張機能は、FirefoxやSafariとも互換性があると推測されますが、これらのケースでは、ブラウザの名前空間の変更などが必要となります。
ParaSiteSnatcherのダウンローダ
ParaSiteSnatcherは、DropboxやGoogle Cloudにおいてホストされている「VBScriptダウンローダ」を介してダウンロードされ、感染したシステムにインストールされます。
トレンドマイクロの解析により、VBScriptダウンローダの三種類の亜種が特定されました。難読化と複雑性の程度は各亜種により異なります。
- 亜種1:この亜種は、ペイロードが難読化されていないため、解析の難易度は高くありません。
- 亜種2:この亜種のイテレーションでは、ペイロード内の重要な文字列がリバースストリング技術(Reverse String Technique)を用いて難読化されています。これによりコードに複雑性が加わり、コンテンツを解読するためにはリバースオペレーションを必要とします。
- 亜種3:この亜種は、さらに高度な難読化を実現しています。解析プロセスを妨害するためのジャンクコード、アンチデバッグ、アンチタンパープロテクションに加え、変数や関数にランダムに生成された名前を付けることで、パターン検出を回避します。また、解析者によるペイロードの解読をさらに困難にするために、文字列を反転させる手法により難読化を実施しています。
実行に際し、ダウンローダは、まず以下のファイルとフォルダの有無をチェックします。
ファイル:%ProgramFiles%\Google\Chrome\Application\chrome.exe
フォルダ:%APPDATA%%USERNAME%
存在しない場合、スクリプトはプロセスを終了します。
マルウェアは、GETリクエストを作成し、以下へ送信することで、攻撃者のC&C(コマンド&コントロール)サーバとの通信を確立します。なお、サーバからは、難読化されたURLのリストが返信されます。
hxxps[:]//storage.googleapis[.]com/98jk3m5azb/-
その後、マルウェアは、文字列を操作することでC&Cサーバから返信されたリストの難読化を解除します。そして、特定の文字を「対応する表現(以下参照)」に置き換えることでURLを復元します。
- URLのプロトコルを設定するために「h」は「https://」に置き換えられる
- ドメイン名を再構築するために「-」は「.」に置き換えられる
- パスを設定するために「_」は「/」に置き換えられる
- ポート番号を設定するために「>」は「:」に置き換えられる
復元されたURLは、Chromeの拡張機能を装った不正な追加モジュールをダウンロードするために使用されます。
リストにおける以下のような最初のURLは、感染したシステムを登録し、攻撃者に通知するために使用されます。
hxxps[:]//rezumdolly[.]com:8443/api/alert
まず、マルウェアはWMI(Windows Management Instrumentation)サービスを利用して、Win32_OperatingSystemクラスに対する検索要求を実行します。そして、取得したOS情報は、攻撃者のC&Cサーバへ送信されます。
その後、システム情報をカプセル化するための文字列(.json形式)を作成します。
- comp:コンピュータ名。ネットワーク上でシステムを一意に識別するために使用
- user:登録されたユーザ名。システムを使用または所有しているユーザを確認
- version:OSのバージョン。特定のビルドや潜在的な脆弱性を示す
- arch:OS(例:32bitまたは64bit)のアーキテクチャ。攻撃をシステム仕様に調整するために用いる
- caption:OSの説明ラベル。エディション情報(例:Windows 10 Pro等)を含むことが多い
マルウェアは、関数 down()を使用することで、感染したシステムのi以下のディレクトリにおいてParaSiteSnatcherをダウンロードし、保存します。
%APPDATA%\%USERNAME%
そして、デスクトップ、パブリックデスクトップ、クイック起動フォルダ内において「chrome.lnk」を含んだショートカットを検索することで、Chrome ショートカットを特定し、削除しよう試みます。
マルウェアは、被害者のシステムにおけるパーシステンス(永続化)を実現し、実行時に不正な拡張機能をロードするために、デスクトップ上にChromeのショートカットを作成します。このショートカットには、カスタム起動パラメータを用いてブラウザを起動する設定が施されています。なお、このパラメータには、デフォルトのユーザプロファイルディレクトリやアプリケーションデータフォルダ内に格納された不正な拡張機能の起動に関連した値を含みます。
このプロセスは、作成されたショートカットからChromeを起動する度に不正な拡張機能がロードされるように設計されています。
拡張機能とC&C通信
不正な拡張機能の通信メカニズムは、Chrome sendMessage APIに大きく依存しています。このAPIは、特定の条件が満たされた際に、複数の拡張機能コンポーネント間で通信を行うために使用されます。
一部のコンポーネントは、攻撃者のC&Cサーバに処理されたデータを直接送信します。一方、その他多くのコンポーネントは、攻撃者から直接「随時更新されるコマンド」を受信するロジックを含みます。不正な拡張機能は、メッセージを受信すると、各イベントに対応した内部関数を実行します。
拡張機能のサービスワーカーは、chrome.windows と chrome.tabs API を利用します。これらのAPIは、他のParaSiteSnatcher コンポーネントが必要とするDOM(Document Object Model)のナビゲートとフォーカスのために使用されます。
不正な拡張機能を構成するファイルの解析
本章では、不正な拡張機能を構成するさまざまなファイルについて解説します。
manifest.json
全てのChrome 拡張機能は、ルートディレクトリに「manifest.json」ファイルを含みます。また、このバックグラウンドマニフェストキーには、重要情報(拡張機能の名前、バージョン、パーミッション、拡張機能に関連するスクリプト等)が含まれます。
この拡張機能は、タスクの処理、モジュールのオーケストレーション、データの同期を実行するために、バックグラウンドプロセスの一環としてサービスワーカー(yyva.js) を使用します。
「manifest.json」ファイルには以下が含まれます。
- Basic Metadata:拡張機能の名前、説明、バージョン、Authorキー等を含む
- Service Workers:拡張機能のイベントハンドラとして動作するJavaScript ファイル。対応するイベントは、Web リクエストの処理だけでなく、ページのナビゲート、通知のクリック、タブの開閉等を含むイベントハンドラとして動作する拡張機能のサービスワーカーは、主にプロキシサービスとしての役割を果たすWebのサービスワーカーとは異なる。なお、バックグラウンドキーに対応するサービスワーカーは前者となる
- Content Scripts:特定のURLパターンに一致するWebページが開かれると、JavaScriptファイルを統計的にロードすることができる
- Permissions:拡張機能がアクセスできる機能や情報を決定
今回調査したParaSiteSnatcherの検体において、重要なcontent_scriptキー(以下参照)が複数発見されました。これらは、埋め込まれるスクリプトやその動作、そして、格納先を決定します。
- matches:マッチングに使用するパターンを指定。値は、許可された全てのURLスキーム(http、https、file等)にマッチする
- run_at:スクリプトをページに埋め込むタイミングを指定。document_end値は、ページリソースを読み込んでいる間にスクリプトを埋め込む
- all_frames:ブール値。 true に設定すると、タブの最上位フレームでない場合でも、拡張機能は全ての <iframe>要素にスクリプトを埋め込む
- persistent:本ブール値が true の場合、chrome.webRequest API にアクセスすることで、ネットワークリクエストの改変やブロックが可能。なお、本ブール値を trueに設定する唯一のケースとなる。また、パフォーマンス上の理由から、当値はデフォルトとしてfalse に設定されている
このマニフェストファイルのパーミッションには、 host_permissions が含まれています。host_permission キーは、拡張機能のAPIに特別な権限を付与します。これにより、API cookie へのアクセス、webRequest API を使用したイベントの受信、プログラムによるスクリプトの埋め込み、トラッキング保護のバイパス、タブ固有のメタデータの読み取りなど、拡張機能のAPI がホストデータを読み取り、改変することが可能となります。さらに、XMLHttpRequest へのアクセスや「クロスオリジン制約のないオリジン」へのアクセス権を取得することも可能となります。
拡張機能がhost_permissionsキーを使用している場合、前述のパーミッションを拡張機能に付与するよう求めるプロンプトが表示される可能性があります。なお、2023年6月現在、Safari、Firefoxおよび一部のChromiumベースのブラウザでは、インストール時にユーザにパーミッションの付与を求めるプロンプトは表示されていません。
また、host_permissionsは、拡張機能が<all_urls>値を使用して全てのURLを読み取り、改変することを可能とします。
ParaSiteSnatcher は、permissions JSON キーを有します。このキーには、拡張機能が使用許可を求めるWebExtension API のキーワードが含まれます。
不正な拡張機能は、以下の WebExtension JavaScript API をリクエストします。
- webNavigation:イベントリスナを追加します。このイベントリスナは、リンクのクリックやロケーションバーへのURL入力など、さまざまなユーザアクションに対応します。
- notifications:拡張機能がユーザへの通知を作成することや、これを通知領域に表示することを可能とします。
- declarativeNetRequest:拡張機能によるネットワークリクエストの処理に関する条件やアクションを指定することができます。明示的なホストアクセス許可を不要とする拡張機能によるネットワークリクエストのブロックやアップグレードが可能となります。
- declarativeNetRequestFeedback:拡張機能が「宣言型ルールに関する情報」を返す関数やイベントにアクセスすることを可能とします。
- scripting:scripting.executeScript()やscripting.registerContentScripts()メソッド等を使用して、WebサイトにJavaScriptを埋め込むことができます。
- webRequest:HTTP やWebSocket リクエストにイベントリスナを追加するためのアクセスを許可します。追加されるイベントリスナは、リクエストの詳細に関する情報を受信します。また、リクエストを変更、キャンセルすることも可能となります。
- storage:拡張機能がデータを受信、保存することや保存されたデータの変更をリッスンすることを可能とします。
- tabs:拡張機能がChrome ブラウザのタブシステムとインタラクトすることで、ブラウザタブの作成、編集、並べ替え等を行うことを可能とします。また、この強力な API により、スクリーンショットの取得やタブのコンテンツスクリプトと通信することが可能となります。
- activeTab:ユーザがブラウザアクションやページアクションを実行する際に、アクティブなタブへのアクセスを許可します。
- cookies:拡張機能によるクッキーの確認や改変を可能とします。また、クッキーの変更に関する通知を受信します。
Chrome拡張機能のリファレンスには、他にも多くのAPIが存在します。また、Webブラウザの拡張機能は複数のアクセス許可を宣言することができる点や拡張機能がユーザにアクセス許可を要求しないケースが存在する点をセキュリティ保護の観点から認識することが大切です。また、ダウンロードされた拡張機能や宣言されたアクセス許可レベルを把握し、適切に管理することも重要となります。
yyva.js
このコンポーネント(拡張機能のサービスワーカーまたはサービスワーカー)は、Chrome 拡張機能の中心的なイベントハンドラです。当ハンドラは、Webイベントや他の拡張機能のコンポーネントからのメッセージを処理します。
拡張機能のサービスワーカーは、拡張機能のイベント(新ページへの移動、通知のクリック、タブを閉じる等)に加えて、標準的なサービスワーカーのイベントにも応答します。このサービスワーカーは 、service_worker キーにより宣言されます。
全ての拡張機能のコンポーネントは、高度に難読化されています。各コンポーネントの難読化を解除し、コードをクリーンアップした結果、Chrome APIにおいて動作する重要なサービスワーカーの特徴が明らかになりました。
- イベントのリッスンと処理:「yavvy.js」サービスワーカーは、chrome.runtime.onMessage.addListener API を使用してイベントをリッスンします。また、Chrome 拡張機能では、さまざまなコンポーネントが Chrome APIを利用(sendMessage API の使用によるメッセージの送信等)します。なお、このサービスワーカーは、主にナビゲート、フォーカス、そして、getcookiesメッセージのリッスンを担当します。
- POSTリクエストのリッスンと傍受:「yavvy.js」サービスワーカーは、Webリクエストイベント(POSTリクエストを含む)をリッスンするために、Chrome.webRequest.onBeforeRequest.addListener を使用して、コールバック関数を作成します。また、タブ情報を解析するためにchrome.tabs.get API を使用してデータを収集します。
ParaSiteSnatcherのリッスンは広範囲に及びますが、ローカルネットワークアドレスとC&Cドメインを監視対象から除外している点は注目に値します。
ParaSiteSnatcherは、ユーザ活動の傍受や監視を行います。また、他のモジュールから受信した以下のメッセージを処理します。
- messageDetails.type == 'focus'
- messageDetails.type == 'navigate'
- messageDetails.type == 'getcookie'
ナビゲートやフォーカスイベントを処理する関数は、chrome.windowsとchrome.tabs APIを使用します。これらのAPIは、DOMのナビゲートとフォーカスのために用いられます。この不正な拡張機能の他のコンポーネントは、これらの情報(メッセージ)を広範囲に渡って利用しています。
jsync.js (Jquery 3.3.1)
このファイルは、Chrome拡張機能の依存性の注入として機能します。また、当ファイルは、攻撃者が管理するC&Cサーバとの「非同期JavaScriptおよびXML(AJAX)通信」に使用されるコンテンツスクリプトとしての役割を果たし、被害者の機密データを送信します。
sovvy.js
不正な拡張機能のコンテンツスクリプトは、Webページ上のフォームや要素を定期的に監視し、2秒ごとにイベントリスナを特定のボタンに設定します。このスクリプトは、以下のAPI メソッドを使用して、異なるイベント間で送信されるカスタムメッセージタイプ(lixo、cookie、timer等)をリッスンします。
chrome.runtime.onMessage.addListener
そして、これらのメッセージタイプに対応するイベントの開始がトリガとして機能し、ParaSiteSnatcher が特定の関数を実行します。
- POSTリクエストの傍受:「lixo」メッセージは、全てのイベントに適用されますが、URLパターンの検索は実行されません。その代わりに、検索対象となる機密情報(ユーザ名、パスワード、電子メール、クレジットカード情報等)を含んだ全てのPOSTリクエストを追跡します。
- クッキーとユーザセッションの窃取:cookie messageは、攻撃者のC&C サーバに POSTリクエストを送信します。これは、クッキーとユーザセッションを窃取するために行われます。
- Microsoftクッキーの窃取:MicrosoftのLive.com と一致するクッキーを確認すると、「sovvy.js」ファイルは、以下のAPI を使用して、サービスワーカーにメッセージ(クッキーに関連するデータを含む)を送信します。その後、当データからMicrosoftアカウントのクッキーが抽出されます。抽出されたクッキーは、アカウントの乗っ取りや「Pass-The-Cookie攻撃」に利用されます。
chrome.runtime.sendMessage
- 銀行口座に関する情報を窃取: ParaSiteSnatcher を調査した結果、この不正な拡張機能は、ブラジルのオンラインバンキングサービスを提供している金融機関(Banco do Brasil や Caixa Econômica Federal 等)に関連する URL を複数チェックしていることが判明しました。被害者がこれらの金融機関のURLにアクセスすると、不正な拡張機能はデータの処理を開始し、ユーザ名、パスワード、クレジットカード番号などの項目を検索します。その後、攻撃者のC&Cサーバに対し、該当するデータを含んだPOSTリクエストを送信します。
- 攻撃者のC&Cサーバからコマンドをフェッチ:「sovvy.js」スクリプトは、不正な拡張機能が、攻撃者のC&Cサーバから標準的なHTTP GETリクエストを介して、コマンドを取得することを可能とします。
33nhauh.js
「33nhuah.js」ファイルは、銀行口座を監視し、PIX即時決済のアクションを実行するためのビジネスロジックを含みます。PIXは、Banco Central do Brasil(ブラジル中央銀行)により開発、管理されている即時決済プラットフォームです。
このコンテンツスクリプトには、パスワード入力フォームのHTMLテンプレート、コマンドタイプを表す列挙型データの定義、アカウント情報、PIXキータイプ、PIXトランザクションのパラメータなどが含まれます。また、銀行口座の残高を監視し、PIX即時決済を実行する関数も含まれています。さらに、ユーザインターフェース(フォームの設定やリセット、メニュー項目のクリック、Process Indicatorの非表示やロード等)を操作する関数も含まれます。
このコンテンツスクリプトは、標準的なHTML DOMセレクタを使用して、PIXの受取金融機関名やユーザアカウント情報(以下参照)など機密性の高い情報を検索します。
- CPF/CNPJ (ブラジルの個人用納税者番号&法人用税務登記番号) の詳細
- メールアドレス
- 携帯電話番号
- PIXキー
unpgp2.js
コンテンツスクリプト「unpgp2.js」は、Caixa Econômica Federalのインターネットバンキングインターフェイスに対応(通信、ナビゲート、フォーカス)する設計が施されています。このコンテンツスクリプトは、Webページのナビゲート、銀行口座に関連する情報の取得、要素のフォーカス、金融取引の実行、PIXトランザクションの開始など、さまざまなアクションを実行します。
s12ih0a.js
このコンテンツスクリプトは、ウィンドウとタブのコンテンツ(特に以下の項目に関連した情報)を定期的に監視するために使用するロジックを含みます。
- Boleto Bancário
- 取引における支払人と受取人双方のCPF(個人納税者番号)
- 取引における支払人と受取人双方のCNPJ(法人用税務登記番号)
- 振込明細書
このコンテンツスクリプトに含まれるロジックは、一定の間隔で呼び出され、コンテンツスクリプト「sovvy.js」を介して、 DOM とユーザの入力を監視します。また、コンテンツスクリプト「s12ih0a.js」は、電話番号やメールアドレスなどの情報を攻撃者のC&CサーバにPOST送信します。
こちらの表は、不正な拡張機能の各コンポーネントに対応した関数です。
まとめ
不正な拡張機能は、強力な Chrome API を利用し、機密性の高いユーザデータを傍受、改変、そして送信します。そのため、拡張機能のアクセス権を許可する際やWebブラウザを使用する際には警戒を怠らないことが大切です。
ParaSiteSnatcherによる多面的な攻撃アプローチの結果、不正アクセスの特定は困難を極めます。また、永続化とステルス性も確保されるため、本マルウェアの検出と除去は容易ではありません。従って、拡張機能をダウンロードやインストールする際には、安全な拡張機能であるか十分に確認することが重要です。
ParaSiteSnatcher は、Chromeブラウザを標的にしてますが、他のブラウザ(Chromiumベース&Chrome用拡張機能対応型)を使用しているユーザも引き続き警戒が必要です。
参考記事:
ParaSiteSnatcher: How Malicious Chrome Extensions Target Brazil
By: Aliakbar Zahravi, Peter Girnus
翻訳:新井 智士(Core Technology Marketing, Trend Micro™ Research)