GhostPoster内部調査:PNGアイコンがFirefoxユーザー5万人を感染させた手口

どんな拡張機能にもロゴがあります。ツールバーに収まる小さな画像は、いわば信頼の視覚的な証です。ユーザーはそれを一目見て「知っているアイコンだ」と認識し、そのまま作業を続けます。そのファイルの中身が実際に何であるかを考えることは、まずないでしょう。

GhostPosterの作者たちは、まさにその思い込みを悪用しています。

Image

私たちのリスクエンジン「Wings」が、Firefox拡張機能「Free VPN Forever」の異常な挙動を検知しました。この拡張機能は自身のロゴファイルを読み込むという、それ自体はごく標準的な動作をしていましたが、その生バイトデータに対して不審な処理を行っていたのです。コードを詳しく調べたところ、隠された抽出ルーチンが見つかりました。この拡張機能は単にロゴを表示していたのではなく、画像データの中から本来存在するはずのないマーカーを探し出していたのです。

あの人畜無害に見える小さな地球のアイコンの中、画像データが終わったその先に、マルウェアが潜んでいました。PNGファイルのバイト列そのものに埋め込まれ、抽出・実行される機会をひたすら待っていたのです。

Free VPN Foreverは2025年9月以降Firefox Add-onsマーケットプレイスに公開されており、インストール数は16,000件を超えています。この記事の執筆時点でも公開されたままです。しかもこれは単独の事例ではありません。今回のキャンペーンは17個のFirefox拡張機能に及び、合計で50,000件を超えるインストール数を記録しています。無料VPN、翻訳ツール、天気予報、広告ブロックなど、おなじみの謳い文句でユーザーを誘い込みますが、実際に配布されるのは多段階型のマルウェアペイロードです。ユーザーの閲覧内容をすべて監視し、ブラウザのセキュリティ保護機能を無効化した上で、リモートコード実行のためのバックドアを開きます。

Image

第1段階:ロゴ画像

Free VPN Foreverが読み込まれると、自身のロゴファイルであるlogo.pngを取得します。これ自体はどの拡張機能でも見られる標準的な動作です。ところが、その後に不審な処理が始まります。

コードは画像の生バイトデータを走査し、あるマーカー、イコール記号3つ(===)を探し始めます。そのマーカー以降のデータは画像データではなく、実はJavaScriptコードです。見えているようで見えない場所に隠されているのです。

Image

この手法はステガノグラフィーと呼ばれ、一見まったく無害に見えるものの中に情報を隠す技術です。拡張機能のJavaScriptファイルを調べるセキュリティスキャナーではこのペイロードを検出できません。コードレビュアーの目にも触れません。ロゴはツールバーに通常どおり表示されるため、何もおかしなところは見当たらないのです。

しかし拡張機能が読み込まれるたびに、その隠されたコードが抽出され、実行されます。

第2段階:ローダー

ロゴから抽出されたコードは、マルウェア本体そのものではありません。これはローダーであり、リモートサーバーから本物のペイロードを取得することだけを目的とした小さなプログラムです。

ローダーはwww.liveupdt[.]comに接続を試みます。それが失敗した場合は、バックアップ先であるwww.dealctr[.]comに接続します。リクエストにはsignatureパラメータが含まれており、攻撃者はどの感染拡張機能が接続してきているかを追跡できる仕組みになっています。

  • プライマリ:www.liveupdt[.]com/ext/rd.php?f=
  • バックアップ: www.dealctr[.]com/ext/load.php?f=svr.png

しかしこのローダーは、毎回コールバックを行うわけではありません。チェックインの間隔は48時間空けられており、さらにその時点でも実際にペイロードを取得するのは10%の確率にすぎません。残りの90%は、何も起こりません。単なる確率的な挙動です。

これは意図的な設計です。ネットワークトラフィックを監視するセキュリティ研究者が感染した拡張機能を何時間観察しても、不審な動きが一切見られない可能性があります。このマルウェアは辛抱強く、一貫性のない挙動の方が一貫した挙動よりも検出されにくいことを知っているのです。

第3段階:暗号化処理

C&Cサーバーからペイロードが届いても、それはそのまま読めるJavaScriptではありません。独自のエンコード方式によって変換されています。

そのデコードアルゴリズムは、拍子抜けするほどシンプルです。

  1. すべての小文字と大文字を入れ替える
  2. 8と9をすべて入れ替える
  3. 結果をBase64デコードする

Image

デコードされたペイロードは、拡張機能固有のランタイムIDから導出されたキーを使ってXOR暗号化され、ブラウザのストレージに保存されます。これにより永続化が達成されます。

第4段階:ペイロード本体

ここからが本題です。

C&Cサーバーから取得され、デコード・実行される最終的なペイロードは、ユーザーに気づかれることなくブラウザを金銭目的に悪用するための総合的なツールキットです。

アフィリエイトリンクの乗っ取り

このマルウェアは、大手ECプラットフォームへのアクセスを監視しています。ユーザーがTaobaoやJD.comでアフィリエイトリンクをクリックすると、拡張機能がそのリンクを横取りします。本来その購入によってコミッションを得るはずだった正規のアフィリエイト運営者は何も受け取れず、代わりにマルウェアの運営者が報酬を得る仕組みです。

Image

ユーザーからは完全に見えない形で行われます。ユーザー自身は普段どおり商品ページにたどり着き、普段どおり購入を完了します。唯一の違いは、誰がコミッションを受け取るかという点だけです。

トラッキングコードの注入

このマルウェアは、ユーザーが訪れるすべてのページにGoogleアナリティクスのトラッキングコードを注入します。トラッキングID:UA-60144933-8。拡張機能のインストール日、感染してから何日経過したか、訪問した加盟店ネットワーク、ブラウザに紐づく固有識別子などを収集します。

extwaigglbitやextwaiokistといったIDを持つ非表示のdiv要素が各ページに注入されます。これらの要素にはトラッキング属性、インストール経過日数、シグネチャ、加盟店ネットワークのデータなどが含まれており、ページ上のスクリプトや拡張機能自身から読み取ることが可能です。

ユーザーは知らぬ間にプロファイリングされているのです。

セキュリティヘッダーの削除

このマルウェアは、HTTPレスポンスからセキュリティヘッダーを積極的に削除します。

  • Content-Security-Policy — 削除
  • X-Frame-Options — 削除

これらのヘッダーは、クリックジャッキングやクロスサイトスクリプティング攻撃からユーザーを守るために存在するものです。この拡張機能は、ユーザーが訪れるすべてのサイトのすべてのレスポンスからこれらのヘッダーを取り除きます。ブラウザのセキュリティモデルが、静かに解体されているのです。

CAPTCHA回避

このマルウェアには、CAPTCHA認証を回避するための複数の手法が組み込まれています。ある手法では、見えないオーバーレイを作成しユーザー操作をシミュレートします。別の手法では、refeuficn.github.ioから外部のCAPTCHAソルバーを読み込みます。さらに別の手法では、ユーザーがBaiduにログインしているかどうかを確認し、そのログイン状態を認証の代わりに利用します。

なぜマルウェアがCAPTCHAを回避する必要があるのでしょうか。それは、隠しiframeの注入などの一部の動作がボット検知をトリガーしてしまうためです。マルウェアは動作を継続するために「人間である」ことを証明する必要があるのです。

隠しiframeの注入

この拡張機能は、攻撃者が管理するサーバーのURLを読み込む不可視のiframeをページに注入します。これらのiframeは広告詐欺、クリック詐欺、さらなるトラッキングを可能にします。作成・利用・削除が行われ、目に見える痕跡は一切残りません。

リファラーポリシーが操作され、トラフィックの発信元が隠蔽されます。iframeは15秒後に消去されるため、フォレンジック分析ではその瞬間を現行犯で捉える必要があります。

回避手法の全体像

GhostPosterを効果的たらしめているのは、単一の技術ではなく、それらが幾重にも重ねられている点です。

ステガノグラフィーは、スキャナーの目が届かない場所に最初のペイロードを隠します。

段階的な読み込みにより、マルウェア本体がファイルとして存在することはなく、実行時に取得される形を取ります。

独自エンコードは、パターンマッチングによる検出を無効化します。

ランダムな遅延と確率判定により、挙動に一貫性がなくなり観測が困難になります。

時間差による発動制御により、インストールから6日以上経過するまでマルウェアは活動を開始しません。ほとんどのセキュリティレビューが終わった後のタイミングです。

XOR暗号化は、保存データを不用意な調査から保護します。

それぞれの手法は単体で見ればさほど高度なものではありません。しかし組み合わさることで、検出が本当に困難なものへと仕上がっています。

17個の拡張機能、共通のインフラ

Free VPN Foreverは単独の存在ではありません。私たちは、同一のC&Cインフラ(liveupdt.comとdealctr.com)と通信している他の16個のFirefox拡張機能を発見しました。拡張機能も謳い文句もそれぞれ異なりますが、バックエンドは共通です。

PNGステガノグラフィーの手法を使うものもあれば、JavaScriptを直接ダウンロードしてユーザーが訪れるすべてのページに注入するものもあります。また、独自の暗号方式でC&Cドメインをエンコードした隠しeval()呼び出しを使うものも存在します。

攻撃者は同一、サーバーも同一ですが、配布の仕組みはそれぞれ異なります。これはまさに実験の様相を呈しており、どの手法が最も長く検知を逃れられるか、どれが最もインストール数を稼げるか、どれが最も収益を生むかを試している段階だと考えられます。

これらの拡張機能全体では、50,000件を超えるインストールが記録されています。

「無料VPN」という定番のパターン

無料VPNを謳う拡張機能が悪意ある挙動を見せたのは、GhostPosterが初めてではありません。もはやひとつのパターンとなりつつあります。

Image

今週初め、私たちはUrban VPN Proxyの実態を明らかにしました。ユーザー数800万人を抱えGoogleにも掲載されていたこの拡張機能は、ChatGPT、Claude、GeminiとのAI会話内容を密かに収集し、データブローカーに販売していました。

それ以前には、FreeVPN.Oneの件もありました。こちらも認証済みでおすすめ表示されていた拡張機能で、インストール数は10万件以上、銀行口座やプライベートな写真、機密文書を含む、ユーザーが閲覧するすべての画面を密かにキャプチャしていました。

無料のVPNはプライバシー保護を謳いますが、この世に本当の「タダ」は存在しません。今回もまた、実際に提供されていたのは監視だったのです。

結び

GhostPosterの危険性は、単一の技術に由来するものではありません。その本質は「アクセス権限」にあります。

これらの拡張機能は、ユーザーが訪れるすべてのサイトでセキュリティヘッダーを削除します。すべてのページにコードを注入します。攻撃者が管理するサーバーとの接続を常時維持し、指示を待ち続けます。ペイロードはいつでも更新可能であり、明日ユーザーのブラウザ上で何が実行されるかは、完全に攻撃者側の意のままなのです。

ステガノグラフィーの手口は巧妙であり、幾重にも重ねられた回避技術は運用面での成熟度の高さを物語っています。しかし本当の脅威はもっと単純なところにあります。50,000人ものユーザーが、攻撃者にブラウザの完全な制御権を渡す拡張機能をインストールしてしまい、しかもそれらの拡張機能は今なおFirefox Add-onsマーケットプレイスで公開され続けているという事実です。

私たちはKoiを、まさにこの種の脅威、すなわちマーケットプレイスのレビューをすり抜けユーザー環境を侵害する悪意ある拡張機能を検出するために開発しました。私たちのリスクエンジンは、GhostPosterの画像読み込みコードの異常な挙動を、隠されたペイロードを実際に抽出するよりも前に検知していました。

デモを予約して、静的解析では見逃してしまう脅威を挙動監視がどのように捉えるかをご確認ください。

侵害指標(IOC)

拡張機能

  • free-vpn-forever
  • screenshot-saved-easy
  • weather-best-forecast
  • crxmouse-gesture
  • cache-fast-site-loader
  • freemp3downloader
  • google-translate-right-clicks
  • google-traductor-esp
  • world-wide-vpn
  • dark-reader-for-ff
  • translator-gbbd
  • i-like-weather
  • google-translate-pro-extension
  • 谷歌-翻译
  • libretv-watch-free-videos
  • ad-stop
  • right-click-google-translate

ネットワーク指標

  • プライマリC2:www.liveupdt[.]com
  • バックアップC2:www.dealctr[.]com
  • 追加のC2:mitarchive[.]info
  • CAPTCHAソルバー:refeuficn.github.io

ファイル指標

  • logo.png内のステガノグラフィーマーカー:=== (0x3D 0x3D 0x3D)
  • ストレージキー:dipLstCd667dipLstSig667dipLstLd667

トラッキング

  • Googleアナリティクス ID:UA-60144933-8

翻訳元: https://www.koi.ai/blog/inside-ghostposter-how-a-png-icon-infected-50-000-firefox-browser-users

本記事は koi.ai の記事を翻訳・要約したものです。