不可視コードを用いた初の自己増殖型ワームがOpenVSXマーケットプレイスを襲撃

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

しかしGlassWormは、単なるサプライチェーン攻撃ではありません。これまで実環境で見たことのないステルス手法――コードエディタ上で悪意あるコードが文字通り消えて見える、不可視のUnicode文字――を使っています。これに、テイクダウン不可能なブロックチェーンベースのC2インフラ、バックアップのコマンドサーバーとしてのGoogleカレンダー、そして感染した開発者を犯罪者のプロキシノードへと変えてしまう完全なリモートアクセス型トロイの木馬(RAT)を組み合わせています。

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

GlassWormが感染システムに対して行うこと:

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

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

更新(2025年10月19日): MicrosoftのVSCodeマーケットプレイスで新たな感染拡張機能を検出――現在も有効。

攻撃は昨日から稼働しました。インフラはアクティブです。ワームは拡散しています。

当社リスクエンジンが検知したもの

この一連がどのように始まったのかを説明します。Koiのリスクエンジンが、CodeJoyというOpenVSX拡張機能をフラグ付けしました。バージョン1.8.3で不審な挙動の変化が導入されたためです。研究者が(リスクエンジンがフラグ付けしたあらゆるマルウェアに対して行うのと同様に)掘り下げたところ、非常に不穏なものが見つかりました。

Image

KoidexにおけるCodeJoyのリスクレポート

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

そこで、ソースコードを開いて詳しく確認しました。

そして、そのとき見えたのです。いや、正確には――見えませんでした。

不可視の攻撃: Unicodeステルス手法

CodeJoy拡張機能のソースコードのこのスクリーンショットを見てください:

Image

CodeJoyのバージョン1.8.3にある不可視の悪意あるコード

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

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

攻撃者はUnicodeのバリエーションセレクタを使いました。Unicode仕様の一部でありながら、視覚的な出力を一切生成しない特殊文字です。コードレビューをする開発者には、空行や空白にしか見えません。不審なコードをスキャンする静的解析ツールにとっても、何もないように見えます。しかしJavaScriptインタプリタにとっては? 実行可能なコードです。

これが私たちがこれをGlassWormと呼ぶ理由です。ガラスのように、完全に透明。じっと見つめても何も見えません。アカウントが侵害された開発者はおそらくこのファイルを見て、正規のコードだと思い込み、数百人のユーザーにマルウェアを配布しようとしていることに気づかなかったのでしょう。

重要なのは――この手法が従来のコードレビューを完全に破壊するという点です。見えないものは見つけられません。GitHubの差分表示? 不審な点は何も出ません。IDEのシンタックスハイライト? 問題なし。手動のコード検査? すべて正常に見えます。

不可視コード手法は単に巧妙なだけではありません。私たちのセキュリティモデルに対する根本的な破壊です。私たちは「人間がコードをレビューできる」という前提の上にシステム全体を築いてきました。GlassWormは、その前提が誤りであることを証明しました。

ステージ2: 殺せないC2 – Solanaブロックチェーン

そこで私たちは、不可視のUnicode文字をデコードしました。中から何が出てきたでしょう? 正直、顎が外れそうになったほどの、さらなる高度さでした。

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

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

仕組みはこうです:

Image

Solanaブロックチェーンが次のステージを指し示す

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

Image

トランザクションのmemoにある次ステージへのリンク

このスクリーンショットを見てください。これは2025年10月15日――3日前――の実際のSolanaトランザクションです。instruction dataには次が含まれています: {"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

暗号資産ウォレットを狙うGlassWorm

このマルウェアは認証情報を狩っています:

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

Image

NPMとOpenVSXの認証情報を盗むGlassWorm

しかし、まだあります。コードの奥深くに、別のものが埋め込まれていました。Googleカレンダーのリンクです。

https://calendar.app.google/M2ZCvM8ULL56PD1d6

Image

Googleカレンダーのイベントとしては妙なタイトルですよね?

マルウェアはバックアップC2機構として、このGoogleカレンダーイベントにアクセスします。そしてイベントタイトルに何が入っていると思いますか? さらに別の暗号化ペイロードを指す、base64エンコードされたURLです。

攻撃者は次のタイトルでGoogleカレンダーイベントを作成していました: aHR0cDovLzIxNy42OS4zLjIxOC9nZXRfem9tYmlfcGF5bG9hZC9xUUQlMkZKb2kzV0NXU2s4Z2dHSGlUdg==

デコードすると: http://217.69.3.218/get_zombi_payload/qQD%2FJoi3WCWSk8ggGHiTdg%3D%3D

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

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

なぜバックアップC2にGoogleカレンダーを使うのか?

  • 無料で正当(Googleカレンダーをブロックする組織はほぼない)
  • イベントを編集すればいつでも更新できる
  • セキュリティ制御を完全に回避できる
  • また一つの「殺せない」インフラ要素になる

これでC2は三層構造になりました:

  1. Solanaブロックチェーン(主系、不変)
  2. 直接IP接続(217.69.3.218)
  3. Googleカレンダー(バックアップ、正当なサービス)

一つがブロックされても、他が動き続けます。そして3つとも、テイクダウンはほぼ不可能です。

ステージ4: ZOMBI – 悪夢の正体

私たちは「zombi_payload」URLを取得し、ヘッダーから暗号鍵を捕捉して復号し、結果として極度に難読化されたJavaScriptペイロードのデオブファスケーションを開始しました。

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

GlassWormの最終段階――ZOMBIモジュール――は、感染した開発者のワークステーションをすべて犯罪インフラネットワークのノードへと変貌させます。何ができるのかを分解して説明します。正直、私たちが分析したマルウェアの中でも最も高度な部類です。

Image

まずい! GlassWormがzombiになってしまった!

SOCKSプロキシ – あなたのマシンが犯罪インフラになる

ZOMBIモジュールは、あなたのコンピュータをSOCKSプロキシサーバーに変えることができます。コードはこちら:

Image

GlassWorm zombi – ワークステーションをsocksサーバーに変える

あなたの開発者ワークステーション――企業ネットワーク内にあり、あらゆるファイアウォールやセキュリティ制御の背後にあるそのマシン――が、犯罪活動のためのプロキシノードになってしまいます。

これが壊滅的な理由:

  • 企業ネットワークへのアクセス: 外部攻撃者が到達できない内部システムにあなたのマシンは到達できる
  • 攻撃の匿名化: 攻撃者は自分のIPではなく、あなたのIP経由で通信を流す
  • ファイアウォール回避: 内部マシンは外部プロキシでは届かないリソースにアクセスできる
  • 無料インフラ: 被害者が提供してくれるのに、なぜプロキシサーバーに金を払う?

感染した開発者は全員、グローバルなプロキシネットワークのノードになります。そして、あなたはそれが起きていることすら知りません。

WebRTC P2P – ピアツーピアでの直接制御

ZOMBIはP2P通信のためにWebRTCモジュールをダウンロードして展開します:

Image

WebRTCはNATトラバーサルにより、従来のファイアウォールを迂回して直接のP2P接続を可能にします。攻撃者は中央サーバーを介さず、感染マシンに対してリアルタイムで直接制御チャネルを確立できます。

BitTorrent DHT – 分散型コマンド配布

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

Image

コマンドはBitTorrent DHTネットワークを通じて配布されます。これはトレント追跡をテイクダウン不可能にしているのと同じ分散システムです。オフラインにできる中央C2サーバーは存在しません。コマンドは数百万ノードからなる分散ネットワークを通じて伝播します。

隠しVNC(HVNC) – 完全に不可視のリモート制御

そして本当に恐ろしいのがこれです――HVNC(Hidden Virtual Network Computing):

Image

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

攻撃者は次のことが可能です:

  • ログイン済みセッションのままブラウザを使用する
  • メール、Slack、社内ツールにアクセスする
  • ソースコードを読む
  • 追加の認証情報を盗む
  • ネットワーク内の他システムへ横展開する
  • あなたができることは文字通り何でもできる――しかしあなたはそれが起きているのを決して見られない

全体像

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

  • 被害者ネットワーク経由で攻撃を中継するためのSOCKSプロキシ
  • ファイアウォールを迂回する直接制御のためのWebRTC P2P
  • テイクダウン不可能なコマンド配布のためのBitTorrent DHT
  • 不可視のリモートデスクトップアクセスのためのHVNC
  • 障害時の自動再起動(消えない)
  • 動的な機能更新を支えるモジュラーアーキテクチャ

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

  • 内部ネットワークへのアクセスポイント
  • 永続的なバックドア
  • 他の内部システムを攻撃するためのプロキシ
  • 機密データの持ち出しチャネル
  • コマンド&コントロールの中継点

そしてすべては、VS Code拡張機能内の不可視Unicode文字から始まりました。

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

ここでGlassWormは、その名の「Worm(ワーム)」たる所以を示します。

盗んでいる認証情報を覚えていますか? NPMトークン、GitHub認証情報、OpenVSXアクセス。これらは単なるデータ窃取のためではありません。拡散のためです。

自己複製サイクル:

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

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

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

GlassWormは同じ手法をOpenVSXに持ち込みましたが、恐ろしい進化を伴っています:

  • あらゆるコードレビューを回避する不可視コード注入
  • テイクダウン不可能なブロックチェーンベースC2
  • 被害者を犯罪インフラに変える完全なRAT機能
  • 3種類のC2機構にまたがる多層冗長性

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

従来のサプライチェーン攻撃では、1つのパッケージを侵害すれば被害範囲はそこで決まります。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カレンダーイベント – 稼働中でアクセス可能
  • 持ち出しサーバー(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の組織、BFSI、そして世界最大級のテック企業の一部に信頼されているKoiは、この広大な攻撃対象領域に対して、可視化、ガバナンス確立、リスクの予防的低減に必要なセキュリティプロセスを自動化します。

マルウェアが文字通り不可視になり得る世界では、疑心暗鬼はバグではありません――機能です。

どうか安全に。

IOCs

侵害された拡張機能

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カレンダー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