This post is also available in: English (英語)
概要
Unit 42 のリサーチャーは悪意のある JavaScript サンプルを使って機微情報を盗む攻撃者を観測しました。そのさい攻撃者らは、人気のあるアンケート サイトや、低品質のホスティング、Web チャット API を悪用していました。これらのキャンペーンのなかには、著名人 (オーストラリア人サッカー選手など) の名前でチャットボットを作って登録したキャンペーンもありましたし、侵害したサイトや従来型のフィッシング サイトに Web スキマーを挿入していたマルウェア キャンペーンもありました。
本稿ではいくつかケーススタディを紹介し、悪意のある JavaScript が情報窃取に用いる戦術の一部を解説します。これらのケーススタディでは、観測されたマルウェアが、従来型の静的・動的分析をどのように回避しようとしていたか、具体例をあげて示します。たとえば、難読化、異常な DOM (ドキュメント オブジェクト モデル) インタラクション、選択的ペイロード発動などの戦術です。
私たちは、JavaScript のマルウェア サンドボックスを使い、パスワードやクレジット カード情報を収集するキャンペーンを特定しました。パロアルトネットワークスのお客様は、Advanced WildFire、Advanced URL Filtering などのクラウド配信型セキュリティサービスを有効にした次世代ファイアウォール (NGFW) により、本稿で取り上げた脅威からの保護を受けています。また Cortex XDR Analytics は、インスタント メッセージングや漏出、C2 技術に対し、ネットワーク検出と応答 (NDR) および EDR 分析検出器を通じてこれらの脅威への対応を行っています。
関連する Unit 42 のトピック | JavaScript Malware, Web Skimmer |
JavaScript マルウェアはいかにして機微情報を持ち出すか: スキマー、スティーラー、フィッシング ページ
悪意のある JavaScript を調査するなかで、パスワードやクレジット カード番号などを含む窃取情報の収集や集約を攻撃者らが新たな手法で行っていることに私たちは気づきました。攻撃者らはこれらの漏出手法を、従来型のフィッシング ページ (リモート ホストに悪意があるもの) とスキミング ページ (悪意のあるスクリプトがリモート ホストを侵害したもの) の両方で使っています。
従来型のフィッシング事例であっても検出はかなり難しいのですが、これがスキマーの侵害を受けたページとなると検出はさらにやっかいです。なぜならスキマーの侵害を受けたページの場合、検出ロジックがサイトの場所や URL の特徴にもとづく検出支援を行えないからです。
スキミング サイトがホストされている場所は、正規コンテンツが本来ホストされるべき場所から変わっていないので、検出システムはそのホスティング サイトになんら視覚上の違いを認めません。また、フィッシング ページではよく、漏出用のエンドポイントが隠されます。たとえホスティング ページが検出可能でも、クレデンシャル収集用のエンドポイントは検出を逃れられるようにするためです。
このように検出逃れをはかるスキマーやフィッシング漏出攻撃を検出できるよう、私たちは JavaScript を分析してプログラム内を流れる細かな情報 (情報フロー) を追跡する新しい技術を開発しました。私たちの分析では、データを盗む情報フローを識別することで、当該スクリプトがスクリプト外の攻撃者に機微情報を送信するタイミングを特定できます。
弊社の Advanced Url Filtering (AUF) サービスは 3 か月間の間に重複なしで 21万6,000 件を超える漏出攻撃を検出しました。これらの攻撃では、以下のアクティビティが観測されました。
- 全攻撃の 83% がパスワード情報を盗んでいる
- 同じく 2% がクレジットカード情報を盗んでいる
- ブラウザーの Cookie を盗むのは 1% 未満
- 約 15% がページ上にあるこのほかのテキスト情報を盗んでいる
私たちのデータからは、悪意のある Web サイトがさまざまなドメインや URL をまたいで同じ漏出用エンドポイントを使い回すケースが多いことがわかりました。図 1 は、数千件の異なるドメインと 6万6,000 件以上の URL が 1 つのエンドポイントを共有していることを示したものです。
漏出情報収集エンドポイントの 33% が複数のドメインで共有され、56% が複数の URL で共有されていることがわかります。一般に、異なる URL 間による共有は、異なるドメインによる共有より多く見られます。これは、被害者ごとに異なる URL が攻撃で使われることがあるためです。ただし、個別のドメインが複数、共通してクレデンシャル収集エンドポイントを共有するケースは依然として多数見られます。
攻撃者はチャットやアンケートの REST API でデータを盗む
私たちはこの情報フロー分析を使い、クレデンシャル漏出を意図して正規の人気クラウド API を悪用する攻撃手法を複数発見しました。
図 2a はトップレベルで動的に生成された HTML を含むサンプルを示したもので、図 2b は同じインスタンスを難読化したものです。
このマルウェア サンプルは、データを盗んだ後、チャット プラットフォームの REST API で漏出させます。
図 2b は単純なエスケープによる難読化レイヤーを用いてページ全体を動的に生成したものです。
ただし、図 3 に示したサンプルには難読化レイヤーが複数あり、その一部はカスタム アンパック関数を使っています (強調表示された sd5e95e572 の部分)。エンコードされたペイロードを発動するには、これらのアンパック関数が動的に実行される必要があります。攻撃者は静的分析を回避するためにこの手の難読化をよく使いますが、動的実行サンドボックスであればペイロードを分析可能です。
図 4 は、この目的に使われる複数の公開された REST API を示したものです。通常、これらはチャット プログラムやアンケートと関連付けられる API です。
次にコードを分析します。
動的に生成されたコード (上記図 4 参照) を分析すると、このサンプルが複数種類の機微データを収集することがわかります。
- 個人識別番号
- パスワード
- 顧客番号
その後、このサンプルはデータを攻撃者配下にある特定チャットボットに送信し、さらなる悪用に向けてデータ収集をはかります。この事例は、攻撃者がクラウド API を悪用し、漏出させたクレデンシャルを収集する方法のほんの一例です。チャットボット API 以外の例としては、アンケート フォーム API、低品質なレンタル可能ドメイン、ダイナミック DNS ドメインがあげられます。
私たちは、攻撃者がこうしたクラウド Web サイトのもつ高いレピュテーションにあやかってファイアウォールによるブロックを防ぎ、正規のクラウド API ドメインを使うことで分析を回避しているものと推測しています。脅威オペレーターはこれらのエンドポイントをクレデンシャル収集に使っているので、悪意のあるサンプルを可視化できないかぎり、API が悪用されているのかどうかは判断しづらくなります。
クラウド API の利用により、マルウェア作成者に関する情報が明らかになることもあります。たとえば、チャットボット エンドポイントには、特定ボットに関する情報をクエリーする方法も含まれています。この事例では、チャットボットがオーストラリアのサッカー選手を名乗る人物に登録されていました。これは偽名である可能性が高いですが、一部のチャット エンドポイントは、被害者が参加可能な特定のチャット ルームにつながっていたり、ほかの情報が含まれていたりします。
マルウェアは異常な DOM 要素で情報窃取を隠す
マルウェア サンプルは、ひそかに漏出を行うためにほかの手法を用いることもあります。図 5 は、マルウェアの作成者が、盗んだ情報をクエリー パラメーターに含めて非表示の画像をロードすることによって、情報を漏出させている例です。
ブラウザーは非表示にされた img タグにより画像をダウンロードするための HTTP リクエストを送信しますが、このときいっしょに窃取したデータ (ここではクレジット カード番号) も攻撃者に送信します。これは、非典型的な漏出手法による検出回避試行と考えられます。
マルウェアの作成者は、単純な静的分析やシグネチャーによる検出を回避するため、漏出先のドメインもエンコードします。私たちは、攻撃者が異常な DOM 要素を使って情報を窃取する例をこれまでにも確認しています。たとえば、 script、object、img などの要素がそうした例に含まれます。
難読化も情報窃盗時の検出回避によく用いられる技術です。驚いたことに、コード生成を伴わない事例は増えています。たとえばマルウェアの作成者は eval を使ってコードを実行することがあります。eval は動的にコードを生成する関数で、これを使えば本当のペイロードを難読化しておくことができます。
マルウェアの作成者が動的にコードを生成していない場合、それは検出回避のためではないかと推測されます。というのも、検出器の多くが、サンドボックス分析中、動的に生成されたコードを監視しているからです。以下は漏出行うサンプルのリストです (VirusTotal から入手可能)。これらは単純な難読化手法で多くのベンダーの検出を回避し続けています。
- bf3ab10a5d37fee855a9336669839ce6ad3862ad32f97207d4e959faaba0a3ed
- 13429eebb74575523b242e16b51eacf287a351c6de04557ec3cc343812aae0cb
- db346adb1417340e159c45c5e4fdaea039c0edbca6e62ad46aa9aec1cf1273a1
マルウェアはペイロード発動を拒否して検出を避ける
静的分析による検出の多くは難読化で防げます。マルウェアがペイロードを選択的に発動させれば、動的分析による検出も回避できます。この現象にとくに新規性はありませんが、JavaScript マルウェアの分析回避にあたっては、特定の戦術が確認されています。
ペイロードの発動回数を減らすことで、マルウェア作成者は純粋な動的分析でのマルウェア識別機会を減らしています。ペイロードの強制発動は、分析エミュレーターで回避力の高い JavaScript を検出させるための重要な手法の 1 つです。
このほか、ペイロードの発動拒否も、多くのベンダーからの検出回避に依然として有効です。本稿執筆時点では、VirusTotal 上のどのベンダーもまだ以下の SHA256 ハッシュを持つサンプルを検出していません。
- da416dd6d35e2b779d164f06d4798ca2d9a3d3867e7708b11bf6a863a5e7ffc2
- bf3ab10a5d37fee855a9336669839ce6ad3862ad32f97207d4e959faaba0a3ed
- 13429eebb74575523b242e16b51eacf287a351c6de04557ec3cc343812aae0cb
- db346adb1417340e159c45c5e4fdaea039c0edbca6e62ad46aa9aec1cf1273a1
最初のサンプルの場合、キーワードを含むページでのみ、マルウェアがアクティブ化されることが確認されています。checkout という言葉を使っていることから、被害者が機微情報を入力している可能性があることが示唆されます。
また、自身の実行環境が分析環境であることを示す痕跡 (アーティファクト) がないか、明示的にチェックしているマルウェア サンプルも確認されています (図 6)。これらのアーティファクトは通常はデバッグ セッションにだけ存在します。
マルウェア サンプルは、クローラーを示す痕跡がないかチェックすることもあります。これにより、そのブラウザーが (潜在的な被害者がそうするように) 自然にそのページに到達したのか、それとも (セキュリティ クローラーが行うように) 直接そのページに到達したのかを確認しようとします。セキュリティ クローラーによる分析環境に置かれたマルウェアは発動を拒否します (図 7)。
JavaScript コードを介して情報フローを追う
弊社の JavaScript マルウェア分析エミュレーターは、静的コード分析と動的コード分析を組み合わせで使ってプログラムの振る舞いを調べます。静的分析は通常、コードを静的アーティファクトとして捉えます。それとは対照的に、動的分析はプログラムを実行し、ある 1 つの特定実行パスでの振る舞いを観察します。
通常の無害な JavaScript プログラムですら、その完全な動きを調べるのは非常に骨が折れます。JavaScript は動的特性をもっていて静的分析には限界があるからです。通常のプログラムであっても、動的なコードを完全に網羅するのは多くの場合不可能です。
これがマルウェア分析になると、作成者らは検出回避をねらってプログラムの分析を意図的に難しくしています。作成者は難読化や分析回避技術を使ってサンプル分析中のペイロード発動を回避します。くわえて、マルウェアが CAPTCHA を解かせたり、特別な形式の情報を入力させるなど、自動化の難しい特定のユーザー入力を求める場合もあります。
本稿の分析手法は、静的・動的分析から逃れようとする回避力の高いマルウェアの検出を目的としています。このような回避力の高いケースを検出するため、私たちは静的・動的両方の手法を組み合わせて使い、分析対象サンプル全体について、おおよそのプログラム実行をシミュレートします。これには、動的回避の発動を強制すると同時に、難読化を解除するという利点もあります。
ペイロードを発動させた後、プログラム実行中に発生する情報フローを分析します。私たちは、プログラム内の各データの動きを追跡するのに役立つ「汚染追跡 (taint tracking)」と呼ばれる技術を使っています。汚染追跡とは、プログラムのさまざまな情報フロー プロパティの識別に役立つ技術一般をさします。
私たちの実装の場合、プログラム内のデータごとに、パスワードやクレジット カード データなどの機微情報が含まれているかどうかを追跡します。実行中、私たちの改変済み JavaScript 環境は、データが汚染されているかどうかを含めて各データにラベルを付けます。そうしてから、汚染データの発生源から到達地までの伝播を追跡します。
実行中、私たちの分析器は、それらの機微情報で「汚染された」情報が (たとえば XMLHttpRequest 経由で) ブラウザーの外に送信されるかどうかを監視します。不審な漏出パスへの機微情報のフローが観察された場合、それは JavaScript サンプルによる漏出攻撃実行を示すものです。
結論
JavaScript によるインフォスティーラーがさまざまな手法で検出を回避しているようすが引き続き観測されています。多種多様な難読化技術の使用にくわえ、ペイロードの選択的発動で動的分析を回避する手口も増えています。カスタム ローダーで検出プロセスをさらに難解にする手法も使われるようになっています。
こうしたインフォスティーラーの最終目標は被害者から機微情報を盗み出すことです。私たちは、機微情報漏出においてさらに利用の進む、以下のような回避手法を識別しています。
- 人気アンケートサイトの利用
- 低品質ホスティングの利用
- Web チャット API の利用
セキュリティ担当者はこうした悪意のあるユースケースの特定のため、漏出に使われるエンドポイントを継続的に監視することをお勧めします。また私たちは、本稿により、こうしたサービスの提供者が自身のプラットフォームを悪用するアクターの積極的排除措置を講じられれば、と考えています。
パロアルトネットワークスのお客様は、オフラインおよびオンラインの情報窃取攻撃を自動的に分析する Advanced URL Filtering などのクラウド配信型セキュリティサービスにより、本稿で取り上げた脅威からの保護を受けています。また Cortex XDR Analytics は、インスタント メッセージングや漏出、C2 技術に対し、ローカル/グローバル分析プロファイルを使う NDR および EDR 分析検出器を通じてこれらの脅威への対応を行っています。
Advanced WildFire は、本稿で解説した IoC に鑑み、機械学習モデルと分析手法の見直しと更新を行いました。
こうした攻撃ベクトルは、攻撃者が Web サイトを侵害して悪意のある JavaScript をホストする方法としてよく使われています。このため、Web サイトの運営者は引き続きソフトウェアを最新の状態に保つことをお勧めします。
IoC (侵害指標)
本稿で解説した回避手法はマルウェア全般でよくみられる動作であって、特定のキャンペーンに限定されるものではありません。なお、本稿で参照したサンプルのリストは次のとおりです。
- bf3ab10a5d37fee855a9336669839ce6ad3862ad32f97207d4e959faaba0a3ed
- 13429eebb74575523b242e16b51eacf287a351c6de04557ec3cc343812aae0cb
- db346adb1417340e159c45c5e4fdaea039c0edbca6e62ad46aa9aec1cf1273a1
- da416dd6d35e2b779d164f06d4798ca2d9a3d3867e7708b11bf6a863a5e7ffc2
- f82ef9a948b4eaf9b7d8cda13c5fa8170c20b72fde564f7d3a0f271644c73b92
- acf325dad908534bd97f6df0926f30fc7938a1ac6af1cec00aa45bcf63699e24
追加リソース
- Riding out DOMsday: Toward detecting and preventing DOM cross-site scripting — Melicher, William et al. Network and Distributed System Security Symposium (2018).
- 25 Million Flows Later - Large-scale Detection of DOM-based XSS — Lekies, Sebastian et al. In Proceedings of the 2013 ACM SIGSAC Conference on Computer & Communications security (CCS '13).
- SHA256 bf3ab10a5d37fee855a9336669839ce6ad3862ad32f97207d4e959faaba0a3ed — VirusTotal
- SHA256 13429eebb74575523b242e16b51eacf287a351c6de04557ec3cc343812aae0cb — VirusTotal
- SHA256 db346adb1417340e159c45c5e4fdaea039c0edbca6e62ad46aa9aec1cf1273a1 — VirusTotal
- SHA256 da416dd6d35e2b779d164f06d4798ca2d9a3d3867e7708b11bf6a863a5e7ffc2 — VirusTotal