技術 約9分で読めます

GlassWormがZigコンパイルのネイティブドロッパーで全IDEに感染する新手口

いけさん目次

GlassWormキャンペーン(一連の攻撃活動)がまた進化した。
今度はZig言語でコンパイルしたネイティブバイナリをOpen VSX拡張機能に同梱し、開発者のマシン上にあるVS Code互換IDE 全て に悪意ある拡張機能をサイレントインストールする手口だ。
Aikido Securityの研究者Ilyas Makariが2026年4月に報告した。

前回の記事では extensionDependencies を踏み台にしたトランジティブ配信への進化を取り上げたが、今回の波はさらに一歩踏み込んでいる。
JavaScriptサンドボックスの外に出てOS権限で動くネイティブバイナリを使い、エディタのCLIを直接叩いて感染を横展開する。
「拡張機能エコシステム内の攻撃」から「ホストOS経由のIDE横断攻撃」への転換と言える。

起点となった偽WakaTime拡張機能

攻撃の起点はOpen VSXに公開された specstudio/code-wakatime-activity-tracker という拡張機能だ。
名前の通り、開発者がIDE上でどのプロジェクトにどれだけ時間を使ったかを計測するWakaTimeの偽装版で、正規のWakaTime拡張機能と見た目はほぼ同じに作られている。

ただしこの拡張機能には ./bin/ ディレクトリにプラットフォーム別のネイティブバイナリが同梱されている。

ファイル形式対象
win.nodePE32+ DLLWindows
mac.nodeUniversal Mach-O (x86_64 + arm64)macOS

拡張機能の activate 関数が呼ばれると、WakaTimeのロジックが走る前にこのバイナリをロードして install() を実行する。

const bw = process.platform === "win32" ? "./bin/win.node" : "./bin/mac.node";
const { install } = require(bw);
install();

なぜ .node ファイルが危険なのか

.node ファイルはNode.jsのネイティブアドオンだ。
C/C++やRust、そして今回のようにZigで書かれたコンパイル済み共有ライブラリで、require() でロードするとNode.jsランタイムに直接バインドされる。

通常のJavaScript拡張機能コードはV8のサンドボックス内で動作するが、ネイティブアドオンはその制約を受けない。
ファイルシステムアクセス、プロセス起動、ネットワーク通信など、OS権限で許可される操作は何でも実行できる。
VS Code拡張機能のセキュリティモデルはJavaScriptコードの静的解析に依存する部分が大きいため、コンパイル済みバイナリの中身は実質的にブラックボックスになる。

Zigが選ばれた理由

GlassWormがドロッパー(本体マルウェアをダウンロード・展開する初段ローダー)の実装言語にZigを選んだのは偶然ではない。
2026年に入ってZigコンパイルのマルウェアは急増しており、VoidLinkクラウドルートキット(9KBのELFバイナリ)やCPU-Z 2.19のサプライチェーン攻撃でもZigが使われている。

Zigがマルウェア作者に好まれる理由は複数ある。

特性攻撃者にとっての利点
クロスコンパイルが標準機能単一ソースからWindows/macOS/Linux向けバイナリを生成。GlassWormの win.nodemac.node も同一ソースから出力されたと推測される
C/C++と異なるバイナリ構造ヒューリスティックエンジンやAI駆動の検出器がC/C++パターンで訓練されているため、Zigバイナリは検出率が低い
静的リンクでランタイム依存なしターゲットマシンにランタイムを要求せず、単体で動作する
小さなバイナリサイズGo言語のように数MBに膨らまず、拡張機能に同梱しても不自然さが少ない
リバースエンジニアリングの難度Zigに対応した解析ツールや専門知識がまだ少なく、インシデント対応を遅らせる

macOSバイナリにはプロジェクトパス /Users/davidioasd/Downloads/vsx_installer_zig とユーザー名 davidioasd がデバッグ情報として残っていた。ストリッピングが不完全だったか、あるいは意図的に残したデコイの可能性もある。

全IDE横断感染の仕組み

install() が呼ばれると、バイナリはまずホストOS上のファイルシステムをスキャンし、VS Code互換のIDEを探索する。
対象は以下の通り。

IDEWindowsmacOS
VS Code既知のインストールパス/Applications/Visual Studio Code.app
VS Code Insiders同上/Applications/Visual Studio Code - Insiders.app
Cursor同上/Applications/Cursor.app
Windsurf同上/Applications/Windsurf.app
VSCodium同上/Applications/VSCodium.app
Positron同上/Applications/Positron.app

IDE検出後、GitHubリポジトリ ColossusQuailPray/oiegjqde のReleasesから第2段ペイロード(悪意あるコード本体)である autoimport-2.7.9.vsix をダウンロードする。
このVSIXは正規の steoates.autoimport を偽装したもので、拡張機能IDは floktokbok.autoimport になっている。

ダウンロードした .vsix はテンポラリパスに配置された後、検出した全てのIDEに対してCLIでサイレントインストールされる。

cmd.exe /d /e:ON /v:OFF /c "<ide_path> --install-extension <vsix_path>"

macOSでも同等のコマンドが実行される。
インストール完了後、.vsix ファイルは cleanupVsix() で削除され痕跡を消す。

graph TD
    A["偽WakaTime拡張機能を<br/>Open VSXからインストール"] --> B["activate時にZigバイナリを<br/>require経由でロード"]
    B --> C["ファイルシステムをスキャンし<br/>全VS Code互換IDEを検出"]
    C --> D["GitHubリリースから<br/>autoimport-2.7.9.vsixをDL"]
    D --> E["各IDEのCLIで<br/>サイレントインストール"]
    E --> F["vsixファイルを削除し<br/>痕跡を消去"]
    F --> G["第2段拡張機能が起動"]
    G --> H["ロシアロケールを検出したら停止"]
    H -->|ロシア以外| I["SolanaブロックチェーンからC2取得"]
    I --> J["認証情報・トークンを窃取"]
    J --> K["RAT + Chrome拡張機能を配備"]

第2段ペイロードの挙動

サイレントインストールされた floktokbok.autoimport の中身は、これまでのGlassWormドロッパーと同じ機能セットを備えている。

機能内容
ロケールチェックロシア語環境では実行を停止する。GlassWormが初期から備えるジオフェンシングで、攻撃者の所在地を示唆する
Solana C2解決SolanaブロックチェーンのトランザクションデータからC2(コマンド&コントロール)サーバーのアドレスを取得するデッドドロップリゾルバ。ブロックチェーンの不変性によりC2情報のテイクダウン(強制削除)が極めて困難になる
情報窃取開発環境の認証情報、APIトークン、シークレットを収集してC2に送信
RAT配備リモートアクセストロイの木馬をインストール。加えて、キーロガーとセッションCookie窃取機能を持つ悪意あるChrome拡張機能も展開する

この第2段拡張機能が全IDEにインストールされるため、開発者がいずれか1つのIDEから削除しても、他のIDEでは引き続き動作し続ける。

IOC(侵害指標)

種別
第1段拡張機能specstudio/code-wakatime-activity-tracker
第2段拡張機能floktokbok.autoimport(autoimport-2.7.9.vsix)
win.node SHA-2562819ea44e22b9c47049e86894e544f3fd0de1d8afc7b545314bd3bc718bf2e02
mac.node SHA-256112d1b33dd9b0244525f51e59e6a79ac5ae452bf6e98c310e7b4fa7902e4db44
ペイロード配信元github[.]com/ColossusQuailPray/oiegjqde/releases
デバッグ痕跡/Users/davidioasd/Downloads/vsx_installer_zig

前回の波との違い

前回のGlassWormは extensionDependencies フィールドを悪用したトランジティブ配信が核心だった。フロント拡張機能のインストール時にVS Codeの依存関係解決機構が自動で悪意ある拡張機能を引き込む仕組みで、Open VSXのマーケットプレイス機能の中で完結する攻撃だった。

今回の波が決定的に異なるのは、攻撃の実行レイヤーがエディタ拡張機能APIからOSネイティブレイヤーに降りた点だ。

観点前回(extensionDependencies)今回(Zigドロッパー)
感染経路エディタの依存関係解決機構ネイティブバイナリによるCLI実行
感染範囲インストール元の単一IDEホスト上の全VS Code互換IDE
検出対象マニフェストの依存関係監査コンパイル済みバイナリの動的解析
ペイロード配信Open VSXレジストリ経由GitHub Releases経由
痕跡依存拡張機能がリストに残るvsixファイル削除で証拠隠滅

特にCursor、WindsurfといったAIコーディングエージェントを標的に含めている点は見逃せない。
これらのIDEにはAPIキー、クラウド認証情報、プロジェクトのコンテキスト情報が集約されており、1つの感染で得られる情報の価値が従来のテキストエディタとは比較にならない。

引っかかりやすい行動パターン

今回の手口はWakaTimeという「開発者なら誰でも使いそうなツール」を偽装している点がポイントだ。
以下のような習慣がある開発者はリスクが高い。

  • Open VSXから拡張機能を入れている
    Cursor、Windsurf、VSCodiumなどVS Code Marketplaceを使えないIDEはOpen VSXが主な拡張機能ソースになる。
    前回のGlassWorm波でも狙われたのはOpen VSX経由のユーザーだった。
    Open VSXはMicrosoftのマーケットプレイスより審査が緩く、パブリッシャーの検証も甘い
  • 拡張機能を名前だけで選んでいる
    「wakatime」で検索して上位に出たものをそのままインストールするパターン。
    パブリッシャーIDが正規のもの(WakaTime.vscode-wakatime)かどうかまで確認していないと偽装版を掴む
  • VS Code互換IDEを複数併用している
    VS CodeとCursorを両方使っている、Windsurfも試している、といった開発者は攻撃面が広い。
    今回の手口はまさにこの「IDE併用」を突いて横展開する
  • 拡張機能のファイル構成を確認しない
    .vsix を展開して中身を見る開発者はほぼいない。
    ./bin/ にネイティブバイナリが入っていても気づかないまま activate が走る
  • 生産性系・テーマ系の拡張機能を気軽に入れる
    WakaTime、GitLens、Prettier、カラーテーマなど、コア機能ではない「あると便利」系の拡張機能は攻撃者の偽装対象になりやすい。
    npmのaxios乗っ取りでも「誰もが使うライブラリ」が狙われた

サプライチェーン攻撃は「怪しいものを入れた」のではなく「信頼できると思ったものが汚染されていた」のが本質だ。
開発ツールのセキュリティまとめでも触れたが、IDE・拡張機能・パッケージマネージャのどれが狙われてもおかしくない状況だ。

対処

specstudio/code-wakatime-activity-tracker または floktokbok.autoimport をインストールした心当たりがある場合、Aikidoはマシン全体の侵害を前提とした対応を推奨している。

まずマシン上の全てのVS Code互換IDEで拡張機能リストを確認し、floktokbok.autoimport が含まれていないかチェックする。
見つかった場合は全IDEから削除した上で、Git認証情報、APIトークン、環境変数に保存されたシークレット、ブラウザのセッションCookieなど、開発環境に紐づく全ての認証情報をローテーションする必要がある。
Chrome拡張機能リストの確認も忘れてはいけない。

npmサプライチェーン攻撃Clinejectionでも繰り返し見てきたパターンだが、開発ツールのエコシステムを狙う攻撃は手口が急速に洗練されている。
SANDWORM_MODEワームはAI開発環境を標的にし、AIエージェント経由のmacOS感染も報告されている。
特にネイティブバイナリを使った攻撃は、JavaScriptレベルの静的解析やマーケットプレイスのレビュープロセスをすり抜けやすい。
拡張機能のインストール前に ./bin/ ディレクトリの有無と中身を確認する、あるいは組織で拡張機能の許可リストを運用するといった防御が現実的な対策になる。