マルウェア
Node.jsで作られたFacebookアカウント窃取ツールを分析
Node.jsで作られたFacebookアカウント窃取ツールを分析しました。本ツールは単一の実行ファイルにパッケージ化され、窃取した情報をC&CサーバとTelegram用ボットAPIの双方に流出させます。また、C&Cとの通信チャネルにGraphQLを使用します。
以前、トレンドマイクロでは、Facebookアカウントの窃取を目的とした攻撃キャンペーンを調査しました。本調査をさらに進めた結果、前回の報告とは異なる特徴を備えた別の窃取ツールが新たに発見されました。このツールはNode.jsで作成されたものであり、単一の実行ファイルにパッケージ化されています。機能的な特徴として、窃取した情報をコマンドコントロール(C&C:Command and Control)サーバとTelegram用ボットAPIの双方に流出させる点や、C&Cとのクエリ通信に「GraphQL」を用いる点などが挙げられます。本稿では、この新しいアカウント窃取ツールの機能や仕組みについて詳しく解説します。
感染経路
最近の攻撃キャンペーン
前回の攻撃キャンペーンと同様、本アカウント窃取ツールは、大規模言語モデル(LLM:Large Language Model)を謳った不正なFacebook広告を介して配布されます。これらの広告には、「Googleサイト」で作られたページへのリンクが埋め込まれています。さらに当該ページには、オンラインタスク管理ツール「Trello」にアップロードされた不正なアーカイブへのリンクが埋め込まれています。
過去の攻撃キャンペーン
過去に遡って調査したところ、窃取ツールの含まれるアーカイブをTrello経由で配布した古い攻撃キャンペーンの存在が確認されました。これらアーカイブのファイル名には、目を引きやすいキーワードとして、「marketing recruitment(マーケティングの求人)」、「CV sample(履歴書のサンプル)」、「advertising campaign(広告キャンペーン)」、「marketing project(マーケティング・プロジェクト)」といった用語に加え、Google、Facebook、TikTokなどのサービス名が埋め込まれていました。
この他、被害者に不正なアーカイブをダウンロードさせる手口として、動画編集アプリ「CapCut」に扮した偽装サイトも発見されました。
Node.jsのパッケージ化
不正なアーカイブ内の中には、多くの場合、50-70MB程度の実行ファイルがただ1つのみ格納されています。このうち、窃取ツールの主機能が占める容量は100KB以下であり、全体のごく一部に過ぎません。しかし、そこにプラットフォームとして稼働するNode.jsのバイナリや各種関連ファイルが加わり、これら全てがパッケージ化ツール「pkg」によって1つの実行ファイルに集約されることで、容量が大幅に増えています。このように作成された1つの実行ファイルさえあれば、依存関係にある各種ファイルを個別にダウンロードやインストールしなくても、窃取ツールを稼働させることが可能となります。pkgによるパッケージ化では、全ソースを1ファイルに集約する仕組みとして「ソースマップ」と呼ばれる方式を採用しています。
ソースマップ方式では、パッケージ化された実行ファイルの終端部から、各ソースのオフセット(格納場所)や長さを確認できます。解析者はこの情報をもとに、パッケージ内の各ソースを個別に抽出することが可能です。図5の場合、メインファイルである「app.js」がアプリケーションの開始点に配備されています。
- メイン機能には、窃取を頻繁に実行し過ぎないようにする仕組みが備わっている。具体的には、現在の時刻と前回の窃取時刻を比較し、31.5分(0x1cd6d0ミリ秒=1,890,000ミリ秒=1,890秒=31.5分)以上経過していない場合には、窃取を行わずに今回の処理を終了する。前回の窃取時刻については、ホームディレクトリ(C:\Users\<ユーザ名>)の配下にテキストファイルとして保存する。
- 「/bk/map.txt」にアクセスし、Base64でエンコードされたバックアップ用C&Cサーバのアドレスを取得する。このアドレスも、後の利用に備え、ユーザのホームディレクトリ配下にテキストファイルとして保存する。
- Webサイト「whoer.net」にアクセスし、外部IPアドレスを取得する。
- C&CサーバとのWebSocket通信によってGraphQL を利用できるように、graphql-ws、ws、その他必要なライブラリを初期化する。さらに、自己ホスト型のsupergraphにアクセスできるように、GraphQLの状態管理ライブラリ「Apollo Client」を初期化する。
- C&Cサーバへのサブスクリプション(subscription)を行い、C&Cサーバから被害端末宛てにメッセージがプッシュ(通知)されるようにする。また、ライブラリ「zen-observable」を使用し、コールバック付きobservableへのサブスクリプションを行う。サブスクリプション対象のオペレーションでは、パラメータとして外部IPアドレスが含まれ、応答(プッシュするメッセージの内容)として文字列「_id」が返却される。
- 情報窃取の処理を開始する。
- ホームディレクトリ内に自身のコピーを作成し、永続化のために自動起動設定を行う。
プッシュメッセージの対応
攻撃者がクライアントである被害端末宛てにプッシュしたメッセージは、図6のJSON形式で届きます。このメッセージは、被害端末に対して識別子「_id」を割り当てる目的で使用されます。
クライアントが「_id」を受信すると、C&Cサーバ宛てに別のメッセージを返送し、これによってバックエンド側の一部データを変更(本操作はGraphQLの用語で「mutation」と呼ばれる)します。この変更オペレーションでは、そのパラメータとして、先に割り当て済みの「_id」に加え、現在日時を添えたステータスメッセージが含まれます。変更オペレーションの実施後、被害端末上の全ブラウザから認証情報を窃取します。
窃取処理の完了後、クライアントはその旨を示すステータスメッセージをサーバ宛てに送信します。一方、窃取処理の最中にサーバからプッシュメッセージが届いた場合は、「処理中(wait for the completion)」のステータスメッセージをサーバに返送します。
こうしたメッセージに対する応答方式は、攻撃者側の手によって窃取開始の指示を出せるようにしたものです。攻撃者は、窃取開始のメッセージを待ち受けている被害クライアントのIPアドレス一覧を管理しています。該当するクライアントに対してメッセージをプッシュすれば、窃取処理を再実行させることが可能となります。
情報窃取の処理
本窃取ツールは、下記Webブラウザに関連する情報を窃取します。
- Microsoft Edge
- Google Chrome
- Opera / OperaGX
- Brave
具体的な動きとして、まず、ブラウザ毎に有効なプロファイルをフォルダ「User Data」から探し出します。次に、ユーザホームのパス、プロファイルのパス、User Dataのパスをそれぞれ取得し、以下のバージョン情報をファイルから取得します。
\User Data\Last Version
続いて、暗号化された状態の鍵データ(Chromeのクッキー情報やパスワードの復号に使用される)を以下のファイルから抽出し、これを復号します。最後に、Webブラウザのプロセスを停止します。
\User Data\Local State
次に、有効なプロファイルごとに、保存されている全クッキー用データベースを以下のファイルから抽出します。
<プロファイル>\Network\Cookies
続いて、この中にFacebookのセッションIDに相当するクッキー「xs」が存在するかをチェックします。存在する場合は、被害者が当該プロファイルによってFacebookにログインしていることが示唆されるため、処理を継続します。存在しない場合は、当該プロファイルを対象外として扱います。
こうした手法によりFacebook、Google、Outlook(live.com)のクッキー情報を抽出し、先に以下のから取得済みの鍵データを用いてその全てを復号します。
\User Data\Local State
この後、本窃取ツールは、保存されている全ログイン認証情報のデータベースを以下のファイルから取得します。
<プロファイル>\Login Data
続いて、Facebook、Google、Outlookの全ログイン認証情報(ユーザ名、メールアドレス、パスワード)を抽出し、先に以下のから取得済みの鍵データを用いてその全てを復号します。
\User Data\Local State
さらに、以下のフォルダ内部に拡張機能「MetaMask」が存在するかをチェックします。存在する場合は、対象フォルダ全体をZIP形式で圧縮し、Telegramボット宛てに流出させます。
<プロファイル>\Local Extension Settings\
以上の他にも本窃取ツールは、Facebookのクッキー「c_user」やオペレーティングシステム(OS)、バージョン、アーキテクチャなどの各種ブラウザ情報を取得します。さらに、Facebook用アクセストークンの窃取を試みます。失敗した場合は、Facebookのクッキー情報、ブラウザ名、実行ファイルパス、保存されているログイン情報、IPアドレス、国情報を流出させた上で、当該プロファイルの処理は終了し、次のプロファイルの処理に進みます。
最後に、下記の情報を順番通りにC&Cサーバ側に流出させます。通信方式として、GETリクエストを使用します。
- Facebookの識別番号、ユーザのフルネーム、メールアドレス、誕生日、アクセストークン、Facebookのクッキー情報、ブラウザ名、実行ファイルパス、保存済みのログイン情報、IPアドレス、国コード
- Gmailの認証情報やクッキー情報
- Outlookの認証情報やクッキー情報
- Facebookの追加情報:メールアドレスや位置情報など
- ビジネスアカウントのユーザ名や識別情報:本ツールは、各ビジネスアカウントについて、その名前、広告アカウントの上限、作成日時、ビジネスID、付与された役割、照合ステータス、対象ビジネスに紐づくビジネスユーザの数を窃取する。
- ページ情報:ユーザ名やページアクセストークンなど
- 広告アカウントのユーザ名など:本ツールは、各広告アカウントについて、そのアカウントID、API「Ad Account Agencies」の実行結果、上限予算、追加のクレジット情報(インボイスや支払い頻度など)、米ドルへの換算レート、タイムゾーン、次の請求日、作成日時、支払い単位額、残高、支払い用カード、支払い用カードの期限日、支払い用カードの照合ステータス、API「Ad Account Insights」の実行結果、アカウントステータスを窃取する。
なお、前回窃取済みの情報についても、テキストファイルに再度保存し、Telegramボットに送信します。これは、バックアップを目的としたものと考えられます。
C&Cサーバへの情報流出
本ツールは、下記のようにランダムな文字を含むパスを生成し、そこにGETリクエストを送ることで、C&Cサーバへの情報流出を行います。
<C&Cサーバ>/image/<ランダムな26桁のID >.png
この際、窃取したデータの内容は、Authorizationヘッダーに埋め込まれる形で送信されます。
Authorizationヘッダーに埋め込まれたデータは暗号化され、16進数で表記されます。暗号化に際し、本窃取ツールの開発者は、下記コードに示すような簡単な文字列の利用を検討したと推定されます。
しかし、暗号化や復号に相当するコードを詳細に確認したところ、配列加工機能である「map」や「reduce」の用法に不備があり、本来意図される鍵データは作成されないことが判明しました。具体的には、パスフレーズの各文字を全て排他的論理和(XOR)によって重ね合わせた値が、鍵データとして扱われます。得られる値は1バイト値でしかなく、これによって暗号化が行われることとなります。
解析妨害の手口
本窃取ツールは、セキュリティ調査を妨害する手段として、パッケージ「node-hide-console-window」のコマンド「hideConsole」を呼び出し、コンソールウィンドウを隠します。
さらに、エラーログやデバッグメッセージの出力を抑制するため、オブジェクト「console」の一部メソッドを空の内容に書き換えます。
攻撃者に関する知見
コード内において、ベトナム語によるコメントやメッセージが散見されました。この点より、本窃取ツールの開発グループには、ベトナム語の知識を有するメンバーが含まれている可能性があります。
まとめ
本稿で挙げたアカウント窃取ツールを含む情報窃取型マルウェアは、膨大な量に及ぶ機密情報を流出させるものです。これに感染した場合には重大な影響が及ぼされるだけでなく、後続の攻撃を誘発する恐れもあります。そのため、ユーザの方はこうしたマルウェアの存在に対して十分に警戒することを推奨します。オンラインで行うさまざまな業務や活動の安全性を高める上では、警戒体制を緩めることなく、サイバーハイジーン(IT環境の衛生管理)を的確に実施することが重要です。
ユーザの方は下記の対策を実施することで、不正な広告を介してマルウェアに感染するリスクを低減させることが可能です。
- 広告を安易にクリックしない。宣伝内容に不審な点がある場合や、話が良すぎると感じられる場合は、そのことが特に言える。
- 個人情報を求める広告やポップアップウィンドウに注意する。アクセスしているサイトやアプリが正規なものと確実に保証できる場合を除き、機密情報を入力しないように徹底する。
- 信頼できるアンチウイルス、アンチマルウェアを導入する。これらのツールにより、広告経由で配布される不正なソフトウェアを検知し、その影響を軽減することができる。
- 不正な広告を見極める方法を習得する。不正を示す兆候として、誤植や文法の誤り、話の良すぎるオファーなどが挙げられる。
- 広告からソフトウェアをクリックまたはダウンロードする際は、その広告が本当に信頼できる提供元から出されたものであるかを確認する。ツールやアプリをダウンロードする際は、公式のアプリストアや信頼できるWebサイトのみを利用するように徹底する。
侵入の痕跡(Indicators of Compromise、IoC)
侵入の痕跡(IoC)について、こちらで確認してください。
参考記事:
Analyzing a Facebook Profile Stealer Written in Node.js
By: Jaromir Horejsi
翻訳:清水 浩平(Core Technology Marketing, Trend Micro™ Research)