GlassWorm攻撃とは — 不可視Unicode文字でGitHubに潜むマルウェアの仕組みと対策
はじめに
「コードレビューで目に見えないコードが実行される」——そんなSFのような攻撃が現実に広がっています。GlassWormと呼ばれるサプライチェーン攻撃が、GitHub・npm・VS Code拡張の3つのエコシステムにまたがって汚染を拡大中です。この攻撃はUnicodeの不可視文字を悪用し、エディタやコードレビュー画面では完全に「見えない」マルウェアをコードに埋め込みます。本記事では、GlassWormの技術的な仕組みから、エンジニアが今すぐ取るべき対策までを解説します。
GlassWorm攻撃の全貌 — 433以上のコンポーネントが汚染
被害の規模
セキュリティ企業Aikido、Socket、StepSecurityらの調査により、2026年3月時点で433以上のリポジトリやパッケージが汚染されていることが判明しました。内訳は以下の通りです。
- GitHub: 151以上のリポジトリ(2026年3月3日〜9日の1週間で集中的に汚染)
- Open VSX / VS Code: 72以上の拡張機能(うち1つは35,000ダウンロード超)
- npm: 複数の悪意あるパッケージ
汚染されたリポジトリには、1,460スターを持つpedronauck/rewormや、WebAssemblyランタイムWasmerの関連リポジトリなど、実際に利用者のいるプロジェクトが含まれています。
タイムライン
GlassWormは突然現れたわけではありません。2025年3月に最初の悪意あるnpmパッケージが発見され、同年10月にはVS Code拡張への侵入が確認されました。そして2026年3月、GitHub・npm・VS Codeを横断する大規模な攻撃波が発生し、現在も進行中です。
技術解説 — なぜ「見えない」マルウェアが可能なのか
不可視文字のトリック
GlassWormが悪用するのは、UnicodeのVariation Selectorsと呼ばれる文字範囲です。
U+FE00〜U+FE0F(Variation Selectors): 値0〜15にマッピングU+E0100〜U+E01EF(Variation Selectors Supplement): 値16〜239にマッピング
これらの文字は本来、漢字の字体バリエーションなどを制御するために定義されたものですが、あらゆるエディタ・ターミナル・GitHubのコードレビュー画面で表示幅ゼロとして扱われます。つまり、コード上に存在していても人間の目には完全に見えません。
攻撃フロー
攻撃は以下のステップで進行します。
- 侵入: 攻撃者がリポジトリのアカウントを侵害し、バージョンアップやドキュメント更新に紛れて悪意あるコードを注入
- 隠蔽: マルウェアのペイロードを不可視Unicode文字にエンコード。JavaScriptのテンプレートリテラル(バッククォート文字列)内に配置すると、見た目は空文字列
- デコードと実行: ランタイムがコードを処理する際、デコーダ関数が不可視文字をバイト値に変換し、
eval()で実行 - C2接続: デコードされたペイロードがSolanaブロックチェーン上のウォレットアドレスを参照し、そこからC2(コマンド&コントロール)サーバーのURLを取得
- 情報窃取: 第2段階のスクリプトが暗号通貨トークン、認証情報、シークレットを窃取
特筆すべきは、C2インフラにSolanaブロックチェーンを使っている点です。ブロックチェーン上のデータは検閲が困難なため、従来のドメインテイクダウンによる対策が効きません。
LLMで「もっともらしいコード」を大量生成
日経XTECHの報道では、攻撃者がLLM(大規模言語モデル)を使って**「貢献がありそうなもっともらしいコード」を大量に生成している可能性**が指摘されています。1つの見かけ上の正常なコード行の中に、約18,000行分の不可視コードが埋め込まれていた事例も確認されました。AIが生成した自然なコードの中に不可視マルウェアが潜むという、AI時代ならではの攻撃手法です。
エンジニアが今すぐ取るべき対策
1. 依存パッケージの監査
# npmの場合、npm auditで既知の脆弱性をチェック
npm audit
# lockfileの差分を必ず確認する
git diff package-lock.json
新しい依存を追加する際は、パッケージの公開日・メンテナー・ダウンロード数を確認し、公開直後のパッケージには特に注意してください。
2. 不可視文字の検出をCIに組み込む
従来の静的解析ツールやコードレビューでは、この攻撃を検出できません。CIパイプラインにUnicode不可視文字の検出ステップを追加することが有効です。
# PUA範囲の不可視文字を検出する例(grep + Perl正規表現)
grep -rP '[\x{FE00}-\x{FE0F}\x{E0100}-\x{E01EF}]' src/
3. VS Code拡張の棚卸し
Open VSXで配布された72以上の悪意ある拡張が確認されています。インストール済みの拡張を定期的に確認し、不要なものは削除しましょう。
4. サプライチェーン保護ツールの導入
- Aikido Safe Chain: npm/yarnのラッパーとして動作し、インストール前にサプライチェーンリスクをブロック
- Socket: パッケージの振る舞い解析でゼロデイサプライチェーン攻撃を検出
- CELのcooldown period: 公開直後のパッケージをブロックするポリシーを設定可能(本日のダイジェストで別途紹介)
まとめ
- GlassWormは不可視Unicode文字を使い、目視・エディタ・従来のツールでは検出困難なマルウェアをコードに埋め込むサプライチェーン攻撃
- GitHub・npm・VS Code拡張の3エコシステムで433以上のコンポーネントが汚染済み
- SolanaブロックチェーンをC2インフラに利用し、従来のテイクダウン対策が効きにくい
- CIへの不可視文字検出の組み込み、依存パッケージの監査、サプライチェーン保護ツールの導入が急務
開発基盤の「信頼」が揺らぐ時代に入っています。「目に見えるコードだけが実行される」という前提は、もはや通用しません。