2025年10月に発見されたサプライチェーン攻撃マルウェア「GlassWorm」が、VS Code拡張・npm・GitHubを標的に拡大中。不可視文字に隠れた脅威の実態と、開発者が今すぐ取るべき対策を解説します。
「インストールした覚えのない拡張機能が動いている?」
こんな経験はありませんか?
- VS Codeに入れた拡張機能を、チームメンバーが「それ入れた?」と怪訝な顔をする
- npmパッケージのアップデート後、なぜかCPU使用率が微妙に上がっている
- GitHubのコミット履歴に、自分が触っていないはずのファイルへの変更が混じっている
これらは単なる気のせいではなく、GlassWorm(グラスワーム) と呼ばれるサプライチェーン攻撃マルウェアの感染サインである可能性があります。2026年3月には第4波が観測され、400以上のリポジトリ・拡張機能が侵害されたことが確認されました。他人事ではありません。弊社でも社内ツールチェーンの棚卸しを緊急で実施したほどです。
この記事では、GlassWormの手口を技術的に正確に解説しながら、今日から実践できる検出・対策手順をまとめます。
GlassWormとは何か——なぜ「見えない」のか
GlassWormは2025年10月に初めて発見されたサプライチェーン攻撃型マルウェアです。GitHub・npm・VS Code Marketplace(およびOpenVSX)を主な攻撃経路としており、2026年3月の第4波では433コンポーネント・151以上のGitHubリポジトリが侵害されたと報告されています。
感染拡大の時系列
なぜコードレビューで発見できないのか
GlassWormの最も厄介な特徴は、不可視Unicode文字(U+FE00〜U+FE0F等の異体字セレクタ)にマルウェアコードを埋め込む点です。エディタ上では何も表示されない文字の中にペイロードが隠されているため、目視のコードレビューでは絶対に発見できません。
さらに恐ろしいのが、C2(コマンド&コントロール)サーバーの仕組みです。
- SolanaブロックチェーンのメモフィールドをC2として利用(5秒ごとにポーリング)
- Googleカレンダーをバックアップのフォールバックとして利用
ブロックチェーンへの書き込みはテイクダウンが事実上不可能で、GoogleカレンダーはほとんどのCorporateファイアウォールで許可されているため、企業ネットワーク内でも通信が遮断されません。従来型のセキュリティ製品が前提としてきた「怪しいドメインへの通信を遮断する」という発想が完全に無効化されています。
感染するとどうなるか
GlassWormが実行できる悪意ある操作は多岐にわたります。
- 暗号通貨ウォレットデータ・SSH鍵・認証トークン・Cookie/セッション情報の窃取
- キーストローク記録・スクリーンショット取得(実質的なRAT+キーロガー)
- 偽ブラウザ拡張のインジェクションによる常時監視
- 盗んだGitHubトークンを使ったforce-pushで他リポジトリへの感染を拡大
- 感染マシンをプロキシノード化して別の攻撃に悪用
自己増殖型ワームとして設計されており、extensionPackやextensionDependenciesのフィールドを悪用してVS Code拡張内で自動拡散します。また、**RDD(Remote Dynamic Dependencies)**という手法により、パッケージ公開時点では無害で、後からペイロードを動的に取得するため、公開時のスキャンでも素通りします。
よくある失敗パターン——「自分は大丈夫」という過信が最大のリスク
弊社が把握している限り、感染ケースの多くには共通したパターンがあります。
失敗パターン①:「有名な拡張機能だから安全」という思い込み
GlassWormは正規の拡張機能に依存関係として紛れ込みます。あなたがインストールした拡張機能自体は本物でも、そのextensionDependenciesとして自動インストールされたものが汚染されている場合があります。
失敗パターン②:npm installの内容を確認しない
package.jsonに明示したパッケージ自体は安全でも、その依存関係ツリーの深い部分に汚染パッケージが混入するケースがあります。タイポスクワッティング(expressをexpresにする等)も第3波以降は組み合わされています。
失敗パターン③:「コードレビューしているから大丈夫」
前述のとおり、不可視Unicode文字はレビュー画面には表示されません。GitHubのdiff画面でも見えません。目視での発見は不可能と割り切って、ツールに頼る姿勢が必要です。
失敗パターン④:感染後のクリーンアップを甘く見る
あるフリーランスエンジニアの方から相談を受けたケースでは、~/init.jsonの削除とNode.jsの再インストールだけで「対処完了」としていましたが、GitHubトークンはすでに使用され、別リポジトリへのforce-pushが行われていました。認証情報は全ローテーション必須です。
今すぐできる検出・対策手順
STEP 1: glassworm-hunterでスキャンする
最も手軽な方法は、afine社が公開しているオープンソースのスキャナー glassworm-hunter を使うことです。
# リポジトリをクローン
git clone https://github.com/afine-com/glassworm-hunter.git
cd glassworm-hunter
# 実行(VS Code拡張のディレクトリを指定)
python3 glassworm_hunter.py --target ~/.vscode/extensions
# npmのnode_modulesをスキャンする場合
python3 glassworm_hunter.py --target ./node_modules
STEP 2: 不可視Unicode文字を検出する(ufoscan)
# ufoscanをインストール
go install github.com/trapdoorlabs/ufoscan@latest
# 現在のプロジェクトをスキャン
ufoscan ./
# VS Code拡張ディレクトリをスキャン(macOS)
ufoscan ~/.vscode/extensions
ufoscanはU+FE00〜U+FE0F等の異体字セレクタやゼロ幅スペースなど、コード中に混入した不可視文字を検出してファイル名と行番号で報告してくれます。
STEP 3: 手動でマーカーを確認する
GlassWormには既知のマーカーがいくつか存在します。以下のコマンドで確認してください。
# マーカー変数の確認(感染ファイルに含まれる文字列)
grep -r "lzcdrtfxyqiplpd" ~/.vscode/extensions/
grep -r "lzcdrtfxyqiplpd" ./node_modules/
# init.jsonの存在確認(感染の痕跡ファイル)
ls -la ~/init.json
# ホームディレクトリへの不審なNode.jsインストール確認
ls -la ~/.nvm/versions/
ls -la ~/node/ # 予期せぬディレクトリがあれば要注意
# i.jsファイルの確認
find ~ -name "i.js" -not -path "*/node_modules/*" 2>/dev/null
# Git履歴の異常確認(force-pushの痕跡)
git log --oneline --all | head -20
git reflog
STEP 4: 感染が疑われた場合の対応フロー
flowchart TD
A[スキャンで異常を検出] --> B[VS Code・エディタを即座に終了]
B --> C[ネットワークを切断]
C --> D[GitHub・npm・クラウドの認証情報を全ローテーション]
D --> E[SSH鍵を無効化・再生成]
E --> F[ブラウザのCookie・セッションを全削除]
F --> G[感染ファイルを隔離・削除]
G --> H[OS・VS Code・拡張機能をクリーンインストール]
H --> I[GitHubのforce-push履歴を確認し影響範囲を特定]
I --> J[チームメンバーへ共有・同様のスキャンを依頼]日常的な予防策
| 対策 | 効果 | 難易度 |
|---|---|---|
| VS Code拡張のインストール元を公式Marketplaceのみに限定 | 高 | 低 |
| 拡張機能のインストール前にGitHubリポジトリのコミット履歴確認 | 中 | 低 |
| npm installに--ignore-scriptsオプションを付与 | 高 | 低 |
| CIにglassworm-hunterを組み込む | 高 | 中 |
| package-lock.jsonをコミットし差分を必ず確認 | 高 | 低 |
| GitHub Fine-grained Personal Access Tokenで権限を最小化 | 高 | 低 |
なお、--ignore-scriptsは即効性の高い対策です。npmのインストールスクリプト経由で実行される初期ペイロードを遮断できます。
# .npmrcに設定すれば全プロジェクトに適用される
echo "ignore-scripts=true" >> ~/.npmrc
ただし、bcryptやnode-sassなどネイティブビルドが必要なパッケージは動作しなくなる場合があります。プロジェクトごとに影響を確認した上で適用してください。
まとめ——開発環境のサプライチェーンは「見えないリスク」
GlassWormが示しているのは、開発者の日常的な行動(拡張機能のインストール、npm install)そのものが攻撃経路になる時代が来たという現実です。不可視文字・ブロックチェーンC2・Googleカレンダーフォールバックという組み合わせは、従来型のセキュリティ対策を意識的に回避するよう設計されています。
まず今日、glassworm-hunterとufoscanを手元の環境で走らせることをお勧めします。弊社でも全開発環境のスキャンを実施しており、クライアント向けの納品物に汚染ライブラリが混入しないよう、CIパイプラインへの組み込みを標準化しています。
「自分のプロジェクトは大丈夫か確認してほしい」「CIへのセキュリティスキャン組み込みを相談したい」という方は、お気軽にFivenine Designまでご相談ください。
サーバー管理、丸ごとお任せください
サーバー保守・運用
監視・障害対応・パフォーマンス改善まで、安定稼働をサポートします
※ 通常1営業日以内にご返信します
今すぐ確認すべきチェックリスト
"icon": "fa-solid fa-shield-halved", "color": "red