OpenVSXマーケットプレイスを標的とした、不可視コードを使用する世界初の自己増殖型ワームを確認

npmエコシステムで初めての自己増殖型ワームとなったShai Huludの登場から1か月、今度はOpenVSXマーケットプレイス上のVS Code拡張機能を標的とする世界初のワームを発見しました。

しかし「GlassWorm」は、単なるサプライチェーン攻撃ではありません。これまで実際の攻撃では確認されたことのないステルス技術を用いています。具体的には、悪意あるコードをコードエディター上で文字通り見えなくする不可視のUnicode文字を使用しているのです。これにブロックチェーンベースのC2インフラ(テイクダウン不可能)、バックアップ指令サーバーとしてのGoogle Calendar、そして感染した開発者全員を犯罪者のプロキシノードに変えるフル機能のリモートアクセス型トロイの木馬を組み合わせています。

これは私たちがこれまで分析した中でも、最も高度なサプライチェーン攻撃の一つです。そして今まさに拡散中です。

GlassWormが感染システムに対して実行する行動:

  • サプライチェーン伝播のためのNPM、GitHub、Gitの認証情報を収集
  • 49種類の異なる暗号通貨ウォレット拡張機能を標的に資金を詐取
  • SOCKSプロキシサーバーを展開し、開発者のマシンを犯罪インフラに転用
  • 完全なリモートアクセスのための隠しVNCサーバーをインストール
  • 盗んだ認証情報を使って追加のパッケージや拡張機能を侵害し、ワームをさらに拡散

現在の状況: 2025年10月17日にOpenVSX拡張機能7件が侵害。総ダウンロード数は35,800件。この記事を読んでいる今この瞬間も、10件の拡張機能が積極的にマルウェアを配布中です。攻撃者のC2インフラは完全に稼働しており、ペイロードサーバーは応答し、盗まれた認証情報は追加パッケージの侵害に利用されています。

更新(2025年10月19日):MicrosoftのVSCodeマーケットプレイスでも新たな感染拡張機能を確認。現在も活動中です。

攻撃は昨日開始されました。インフラは稼働しています。ワームは拡散しています。

リスクエンジンによる検出の経緯

発端はこうです。Koiのリスクエンジンが、OpenVSX拡張機能「CodeJoy」のバージョン1.8.3に不審な動作変化を検知しました。私たちの研究者がリスクエンジンのフラグを受けて調査を開始したところ、非常に衝撃的な事実が明らかになりました。

Image

CodeJoyは正当なツールに見えました。数百件のダウンロード数を持ち、定期的に更新される開発者向け生産性ツールで、コードも一見普通のものでした。しかし私たちのリスクエンジンは、人間のコードレビューでは完全に見逃してしまうものを検知しました。拡張機能の生産性機能とはまったく無関係な、不審なネットワーク接続と認証情報アクセスのパターンです。

そこでソースコードを直接開いて詳しく調べることにしました。

そして気づいたのです。というより、気づかなかったのです。

不可視の攻撃:Unicodeステルス技術

CodeJoy拡張機能のソースコードのスクリーンショットをご覧ください。

Image

2行目と7行目の間にある大きな空白が見えるでしょうか? あれは空白ではありません。悪意あるコードです。コードエディターに文字通り表示されない、印刷不可能なUnicode文字にエンコードされています。

もう一度言います。マルウェアは不可視なのです。難読化されているわけではありません。圧縮ファイルに隠されているわけでもありません。人間の目には本当に見えないのです。

攻撃者が使用したのは、Unicode仕様に含まれながら視覚的な出力を一切生成しない特殊文字「Unicode variation selectors(異体字セレクター)」です。コードレビューをしている開発者には、空白行や余白に見えます。不審なコードをスキャンする静的解析ツールにとっては、何もないように見えます。しかしJavaScriptインタープリターにとっては、これは立派な実行可能コードです。

これが「GlassWorm(ガラスのワーム)」という名前の由来です。ガラスのように完全に透明で、じっと見つめても何も見えません。侵害されたアカウントの開発者は、おそらくこのファイルを見て自分の正当なコードだと思い、何百人ものユーザーにマルウェアを配布しようとしていることにまったく気づかなかったでしょう。

この技術は、従来のコードレビューを根本から無力化します。見えないものは発見できません。GitHubのdiff表示? 不審な点はゼロ。IDEのシンタックスハイライト? 問題なし。手動コード検査? すべて正常に見えます。

不可視コードの技術は単に巧妙なだけではありません。私たちのセキュリティモデルの根幹を崩す手法です。これまで私たちは「人間がコードをレビューできる」という前提でさまざまなシステムを構築してきました。GlassWormはその前提が誤りであることを証明してしまいました。

ステージ2:排除不可能なC2 — Solanaブロックチェーン

不可視のUnicode文字をデコードしたところ、正直言って驚愕するほど高度な次のステージが現れました。

このマルウェアは、コマンド&コントロール(C2)インフラとしてSolanaブロックチェーンを使用しているのです。

もう一度読み直してください。攻撃者は、変更不可能で分散型、テイクダウン不可能な公開ブロックチェーンをC2サーバーとして使っているのです。

その仕組みはこうです。

Image

マルウェアはSolanaブロックチェーン上で、ハードコードされたウォレットアドレスからのトランザクションを検索します。トランザクションが見つかると、メモフィールドを読み取ります。このフィールドにはブロックチェーントランザクションに任意のテキストを付加できます。そのメモの中身は? 次のステージをダウンロードするためのbase64エンコードされたリンクを含むJSONオブジェクトです。

Image

このスクリーンショットをご覧ください。2025年10月15日(3日前)の実際のSolanaトランザクションです。インストラクションデータには次の内容が含まれています。{"link":"aHR0cDovLzIxNy42OS4zLjIxOC9xUUQlMkZKb2kzV0NXU2s4Z2dHSGlTdg=="}

このbase64文字列をデコードすると、http://217.69.3.218/qQD%2FJoi3WCWSk8ggGHiTdg%3D%3Dになります。

こうして、マルウェアは次のペイロードのダウンロード先を知るのです。

この手法が非常に巧妙(かつ恐ろしい)理由:

  • 変更不可能:一度ブロックチェーンに記録されたトランザクションは、修正も削除もできません。永遠に。テイクダウン要請は無意味。ドメイン差し押さえも不可能。永遠にそこに存在し続けます。
  • 匿名性:暗号通貨ウォレットは仮名性があります。実在の人物への追跡は困難です。
  • 検閲耐性:連絡すべきホスティングプロバイダーも、圧力をかけるべきレジストラも、シャットダウンすべきインフラも存在しません。Solanaブロックチェーンはただそこに存在しているのです。
  • 正規トラフィックに偽装:Solana RPCノードへの接続は完全に正常に見えます。セキュリティツールはフラグを立てません。
  • 動的かつ低コスト:ペイロードを更新したければ、新しいトランザクションを投稿するだけです。コストは? 0.000005 SOL、つまり1円以下。攻撃者はわずかな費用でインフラをいくらでも切り替えられます。

ペイロードURLをブロックしたとしても(今回は217.69.3.218)、攻撃者は別のURLで新しいトランザクションを投稿するだけで、感染したすべての拡張機能が自動的に新しい場所を取得します。無限のモグラと無限のハンマーを持つ相手とのモグラ叩きゲームです。

これは理論上の攻撃ベクターではありません。現在進行形で稼働しているリアルな本番C2インフラです。そして、これをテイクダウンする手段は文字通り存在しません。

ステージ3:認証情報の収集

Solanaトランザクションが指し示すIPアドレスは217.69.3.218です。URLを取得すると、巨大なbase64ペイロードが返ってきます。しかし暗号化されています。AES-256-CBC暗号化で、復号鍵は持っていません。

では復号鍵はどこに?

HTTPレスポンスヘッダーの中です。

Image

攻撃者はリクエストごとに動的に暗号鍵を生成し、カスタムHTTPヘッダーで送信しています。巧妙なことに、暗号化されたペイロードを傍受しても、現在の鍵を取得するには新たにリクエストを送る必要があります。

ペイロードを復号して解析を進めたところ、GlassWormの真の目的が明らかになりました。

Image

マルウェアが狙う認証情報:

  • NPM認証トークン — 悪意あるパッケージを公開するため
  • GitHubトークン — リポジトリを侵害するため
  • OpenVSX認証情報 — さらなる拡張機能に注入するため
  • Git認証情報 — 悪意あるコードをプッシュするため
  • 49種類の暗号通貨ウォレット拡張機能 — MetaMask、Phantom、Coinbase Walletなど多数を標的に

Image

さらに、コードの奥深くにもう一つの発見がありました。Google Calendarのリンクがあったのです。

https://calendar.app.google/M2ZCvM8ULL56PD1d6

Image

マルウェアはバックアップC2メカニズムとして、このGoogle Calendarイベントにアクセスします。そのイベントのタイトルには何が書かれているのか? またもや、別の暗号化ペイロードへのbase64エンコードURLです。

攻撃者が作成したGoogle Calendarイベントのタイトルは、aHR0cDovLzIxNy42OS4zLjIxOC9nZXRfem9tYmlfcGF5bG9hZC9xUUQlMkZKb2kzV0NXU2s4Z2dHSGlUdg==です。

これをデコードすると、http://217.69.3.218/get_zombi_payload/qQD%2FJoi3WCWSk8ggGHiTdg%3D%3Dになります。

パスに注目してください。/get_zombi_payload/

そうです。「zombi」とはゾンビボットネットのことです。攻撃者は文字通り、被害者を何に変えているかをエンドポイント名に使っているのです。

なぜGoogle CalendarをバックアップC2として使うのか:

  • 無料かつ正規サービス(Google Calendarをブロックする組織はない)
  • イベントを編集するだけでいつでも更新可能
  • セキュリティ制御を完全に回避
  • テイクダウン不可能なインフラのもう一つのピース

こうして、3層構造のC2システムが完成しています。

  1. Solanaブロックチェーン(プライマリ、変更不可能)
  2. 直接IP接続(217.69.3.218)
  3. Google Calendar(バックアップ、正規サービス)

一つがブロックされても、残りは機能し続けます。そして3つすべてをテイクダウンすることは、ほぼ不可能です。

ステージ4:ZOMBIモジュール — 戦慄の全貌

「zombi_payload」URLを取得し、ヘッダーから暗号鍵を入手して復号し、高度に難読化されたJavaScriptペイロードの解析を進めました。

そして気づきました。これは単なる認証情報の窃取ではありません。フルスペックのリモートアクセス型トロイの木馬です。

GlassWormの最終ステージ「ZOMBIモジュール」は、感染した開発者のワークステーションをすべて犯罪インフラネットワークのノードに変えてしまいます。これほど高度なマルウェアは私たちもなかなか分析したことがありません。その機能を詳しく説明します。

Image

SOCKSプロキシ — マシンが犯罪インフラに

ZOMBIモジュールはあなたのコンピューターをSOCKSプロキシサーバーに変える機能を持っています。そのコードはこちらです。

Image

社内ネットワーク内に置かれ、ファイアウォールやセキュリティ制御で保護されているはずの開発者ワークステーションが、犯罪活動のプロキシノードになるのです。

これが壊滅的な理由:

  • 社内ネットワークへのアクセス:外部の攻撃者がアクセスできない内部システムにあなたのマシンが到達できる
  • 攻撃の匿名化:攻撃者は自分のIPではなく、あなたのIPを通じてトラフィックをルーティングする
  • ファイアウォール回避:内部マシンは外部プロキシには届かないリソースにアクセスできる
  • インフラのタダ乗り:被害者がプロキシサーバーを提供してくれるなら、費用は一切かからない

感染したすべての開発者が、グローバルプロキシネットワークのノードになります。そして本人はまったく気づきません。

WebRTC P2P — 直接ピアツーピア制御

ZOMBIはピアツーピア通信のためのWebRTCモジュールをダウンロード・展開します。

Image

WebRTCはNATトラバーサルによって従来のファイアウォールを通過する、直接的なピアツーピア接続を実現します。攻撃者は中央サーバーを経由することなく、感染したマシンへのリアルタイムな直接制御チャネルを確立できます。

BitTorrent DHT — 分散型コマンド配信

ZOMBIはコマンド配信にBitTorrentの分散ハッシュテーブル(DHT)ネットワークを利用します。

Image

コマンドはBitTorrent DHTネットワーク——トレント追跡のシャットダウンを不可能にする同じ分散システム——を通じて配信されます。シャットダウンすべき中央C2サーバーは存在しません。コマンドは数百万ノードから成る分散ネットワーク全体に伝播します。

Hidden VNC(HVNC)— 完全不可視のリモート制御

そして最も恐ろしい機能がHVNC(Hidden Virtual Network Computing:隠しVNC)です。

Image

HVNCは攻撃者にあなたのマシンへの完全なリモートデスクトップアクセスを与えますが、隠されています。タスクマネージャーに表示されない仮想デスクトップ上で動作し、画面に何もウィンドウを表示せず、完全に不可視の状態で動きます。

攻撃者にできること:

  • ログイン済みセッションを使ってあなたのブラウザを操作
  • メール、Slack、社内ツールにアクセス
  • ソースコードを閲覧
  • 追加の認証情報を窃取
  • ネットワーク上の他のシステムへピボット
  • あなたにできることは何でも実行 — しかしあなたは何も気づかない

全体像

ZOMBIはマルウェアにとどまりません。完全なリモートアクセス&ネットワーク侵入ツールキットです。

  • SOCKSプロキシ:被害者ネットワークを経由した攻撃のルーティング
  • WebRTC P2P:ファイアウォールを回避する直接制御
  • BitTorrent DHT:シャットダウン不可能なコマンド配信
  • HVNC:不可視のリモートデスクトップアクセス
  • 自動再起動:障害時に自動復旧(消えてくれない)
  • モジュラーアーキテクチャ:機能の動的更新に対応

企業にとって、これは最悪のシナリオです。感染した開発者ワークステーションは次のものに変わります。

  • 内部ネットワークへのアクセスポイント
  • 永続的なバックドア
  • 社内の他のシステムへの攻撃プロキシ
  • 機密データの流出チャネル
  • コマンド&コントロールのリレーポイント

これがすべて、VS Code拡張機能内の不可視のUnicode文字一つから始まるのです。

ワームの拡散:盗んだ認証情報による自己増殖

ここでGlassWormが「ワーム」の名を冠する理由が明らかになります。

盗み出した認証情報——NPMトークン、GitHub認証情報、OpenVSXアクセス権——を覚えていますか? これらはデータ窃取だけが目的ではありません。増殖のための手段でもあります。

自己複製のサイクル:

  1. 初期感染 — 侵害された開発者アカウントが、正規の拡張機能に悪意あるコードをプッシュ
  2. 不可視ペイロード — Unicodeで隠されたマルウェアが被害者のマシンで実行
  3. 認証情報の収集 — NPM、GitHub、OpenVSX、Gitの認証情報を窃取
  4. 自動拡散 — 盗んだ認証情報を使い、さらなるパッケージや拡張機能を侵害
  5. 指数関数的成長 — 新たな被害者がそれぞれ感染源となる
  6. 繰り返し — サイクルが自動で継続

これは一回限りのサプライチェーン攻撃ではありません。開発者エコシステムを山火事のように広がることを設計されたワームです。

わずか1か月前、セキュリティコミュニティはnpmエコシステムで初めての自己増殖型ワーム「Shai Hulud」を目撃しました。このキャンペーンはnpmトークンを盗み、悪意あるバージョンを自動公開することで100を超えるパッケージを侵害しました。

GlassWormはこれと同じ手法をOpenVSXに持ち込みながら、恐ろしい進化を遂げています。

  • すべてのコードレビューを回避する不可視コード注入
  • テイクダウン不可能なブロックチェーンベースC2
  • 被害者を犯罪インフラに変えるフルRAT機能
  • 3つの異なるC2メカニズムによる多層冗長性

パターンは明確です。攻撃者はサプライチェーンマルウェアを自立持続させる方法を見つけました。もはや個別のパッケージを侵害するだけにとどまらず、ソフトウェア開発エコシステム全体を自律的に拡散するワームを構築しています。

従来のサプライチェーン攻撃では、一つのパッケージを侵害してもその被害範囲は限られていました。しかしShai HuludやGlassWormのようなワームでは、各感染がさらに数十の感染の出発点になります。これは指数関数的成長です。そして私たちはその実態をようやく目の当たりにし始めたところです。

被害状況:35,800件の感染、今まさに進行中

この感染の現状についてお伝えします。これは理論上の攻撃でも過去の事例でもありません。GlassWormは今この瞬間も活動しています。

攻撃タイムライン:

  • 2025年10月17日:OpenVSX拡張機能7件が侵害(昨日)
  • 2025年10月18日:私たちが検知し、分析を開始(今日)
  • 2025年10月19日:OpenVSXおよびVSCodeマーケットプレイスでさらなる侵害拡張機能を検出
  • 現在の状況:5件の拡張機能が現在も積極的にマルウェアを配布中

総被害規模:35,800件のインストール

これが特に緊急性を高める理由があります。VS Code拡張機能は自動更新されます。CodeJoyが不可視マルウェア入りのバージョン1.8.3をプッシュした時点で、CodeJoyをインストールしていたすべてのユーザーは自動的に感染バージョンへ更新されました。ユーザーの操作なし。警告なし。静かに、自動的に感染するのです。

そしてマルウェアは不可視であるため、アカウントを侵害された元の開発者たちもおそらく気づいていませんでした。自分のコードの「空白」の行を確認しても、何もおかしな点は見えなかったでしょう。

感染システムで今起きていること:

  1. 認証情報の窃取が進行中 — NPMトークン、GitHub認証情報、Git認証情報が収集されている
  2. 暗号通貨ウォレットの資金が流出中 — 49種類のウォレット拡張機能が標的に
  3. SOCKSプロキシが展開中 — 開発者ワークステーションが犯罪インフラに変わっている
  4. HVNCがインストール中 — 隠しリモートアクセスが確立されつつある
  5. ネットワーク偵察 — 感染マシンが社内ネットワークをマッピング中
  6. 拡散準備 — 盗まれた認証情報が追加侵害のために検証されている

C2インフラは完全に稼働中です。

  • 217.69.3.218 — 応答中で暗号化ペイロードを配信
  • Solanaブロックチェーン — トランザクションが有効で、ペイロードサーバーを指示
  • Google Calendarイベント — 稼働中でアクセス可能
  • 流出サーバー(140.82.52.31) — 盗んだデータを収集中

これはケーススタディではありません。昔話でもありません。今この文章を読んでいる間にも起きていることです。

感染した拡張機能のいずれかをインストールしていれば、あなたのシステムは侵害されています。認証情報はすでに盗まれている可能性が高く、暗号通貨ウォレットの資金は流出しているかもしれません。マシンはすでに犯罪活動のSOCKSプロキシとして機能している可能性があります。そしてあなたは何も知らないまま、この状況に置かれているかもしれません。

2人の開発者(vscode-theme-seti-folderとgit-worktree-menu)はクリーンなバージョンへの更新に成功しており、アカウントを取り戻すか、異常に気づいたものと思われます。しかし5件の拡張機能は依然として感染したままです。侵害に気づいていないか、アカウントを取り戻せていない5人の開発者がいます。

そして忘れないでください。これはあくまでも私たちが今時点で把握していることです。GlassWormは拡散するよう設計されています。盗まれた認証情報は今この瞬間も、追加のパッケージや拡張機能の侵害に使われています。実際の被害者数はもっと多い可能性があります。

まとめ

本稿はKoi Securityの研究チームが執筆しました。健全な警戒心と、より安全なオープンソースエコシステムへの希望を込めて。

GlassWormは、悪意ある拡張機能がいかに容易にマーケットプレイスのセキュリティをすり抜け、機密データを侵害できるかを示しています。Koiを活用することで、セキュリティチームはソフトウェアが本番環境に入る前に、バイナリ・非バイナリ問わず可視性、リスクスコアリング、ガバナンスを確立できます。

デモを予約して、従来ツールが見逃してきたギャップをKoiがどのように埋めるかをご確認ください。

長い間、最高レベルの権限で実行されることも多い信頼されていないサードパーティコードの使用は、企業にとっても攻撃者にとっても盲点でした。しかしその時代は終わりを迎えつつあります。潮目は変わっています。先月も私たちは、悪意ある化した18件の注目・検証済み拡張機能のキャンペーンを暴露し、数百万ユーザーへの影響を確認しました。

私たちはKoiをこの時代に対応するために構築しました。セキュリティ実践者にとっても、企業にとっても。私たちのプラットフォームは、Chrome Web Store、VSCode、Hugging Face、Homebrew、GitHubなどのマーケットプレイスからチームが取得するすべてのものの発見・評価・ガバナンスを支援します。

Fortune 50企業、金融機関、世界最大級のテクノロジー企業に信頼されているKoiは、この広大な攻撃対象領域全体で可視性の確保、ガバナンスの確立、リスクの予防的低減に必要なセキュリティプロセスを自動化します。

マルウェアが文字通り不可視になり得る世界では、疑うことはバグではなく、機能です。

どうかご安全に。

IoC(侵害の痕跡)

侵害された拡張機能

OpenVSX拡張機能(悪意あるバージョン):

Microsoft VSCode拡張機能:

インフラ情報

コマンド&コントロール:

  • 217.69.3.218(プライマリC2サーバー)
  • 199.247.10.166(プライマリC2サーバー)
  • 140.82.52.31:80/wall(流出エンドポイント)
  • 199.247.13.106:80/wall(流出エンドポイント)

ブロックチェーンインフラ:

Solanaウォレット:28PKnu7RzizxBzFPoLp69HLXp9bJL3JFtT2s5QzHsEA2

トランザクション:49CDiVWZpuSW1b2HpzweMgePNg15dckgmqrrmpihYXJMYRsZvumVtFsDim1keESPCrKcW2CzYjN3nSQDGG14KKFM 3eVTqgEVdUCWcppSh7HQ6h6au7k8JL7Nt7rreKYB598ew4sVe2tBcx87cQS1ocrHPKzeatbJUyHM57Yb1qFasCuL 3v3jCvKfdvHjdoZx3RX7ATUY8jKTrt9hJwhqF5qqpeoK9U9BQvGPPntH2B4qDwQtACBtfrfjNRkM6DZtnjZPGwHL

Google Calendar C2:

https://calendar.app.google/M2ZCvM8ULL56PD1d6

主催者:[email protected]

ペイロードURL:

http://217.69.3.218/qQD%2FJoi3WCWSk8ggGHiTdg%3D%3D

http://217.69.3.218/get_arhive_npm/

http://217.69.3.218/get_zombi_payload/qQD%2FJoi3WCWSk8ggGHiTdg%3D%3D

レジストリ指標

持続化メカニズム:

HKCU\Software\Microsoft\Windows\CurrentVersion\Run

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

翻訳元: https://www.koi.ai/blog/glassworm-first-self-propagating-worm-using-invisible-code-hits-openvsx-marketplace

ソース: koi.ai