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のコードレビュー画面で表示幅ゼロとして扱われます。つまり、コード上に存在していても人間の目には完全に見えません。

攻撃フロー

攻撃は以下のステップで進行します。

  1. 侵入: 攻撃者がリポジトリのアカウントを侵害し、バージョンアップやドキュメント更新に紛れて悪意あるコードを注入
  2. 隠蔽: マルウェアのペイロードを不可視Unicode文字にエンコード。JavaScriptのテンプレートリテラル(バッククォート文字列)内に配置すると、見た目は空文字列
  3. デコードと実行: ランタイムがコードを処理する際、デコーダ関数が不可視文字をバイト値に変換し、eval()で実行
  4. C2接続: デコードされたペイロードがSolanaブロックチェーン上のウォレットアドレスを参照し、そこからC2(コマンド&コントロール)サーバーのURLを取得
  5. 情報窃取: 第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への不可視文字検出の組み込み、依存パッケージの監査、サプライチェーン保護ツールの導入が急務

開発基盤の「信頼」が揺らぐ時代に入っています。「目に見えるコードだけが実行される」という前提は、もはや通用しません。

ソース