この記事ではセキュリティに特化して解説します。AIセキュリティ全般は サプライチェーンセキュリティ完全ガイド2026|攻撃手法・防御ツール・実践チェックリスト をご覧ください。
GlassWormとは何か:不可視文字で開発基盤を侵食する新型マルウエア
あなたのコードレビュー画面に表示されている1行のJavaScript。見た目はただのバッククォート2つに挟まれた空文字列。しかし実際には、その「空」の中に大量の不可視マルウェアが隠れている。
GlassWormは、Unicodeの不可視文字(異体字セレクター)を悪用してマルウェアをソースコードに混入させる新型サプライチェーン攻撃です。2026年3月、ベルギーのAikido SecurityやStepSecurity、OpenSourceMalwareコミュニティが相次いで警告を発し、GitHub・npm・Visual Studio Code拡張の433件以上が汚染されていたことが明らかになりました。日経xTECH等も「開発基盤の信頼が揺らぐ」と報じており、開発者コミュニティで衝撃が広がっています。
force-push"] B --> C["不可視Unicodeで
ペイロード埋込"] C --> D["開発者がインストール"] D --> E["認証情報・暗号資産
を窃取"] E -->|"Solana C2で
指令受信"| A
不可視文字(Unicode)を使ったマルウエア混入の仕組み
異体字セレクターの悪用
攻撃の核心は、Unicodeの異体字セレクター(Variation Selector)だ。本来は漢字やアラビア文字の字形を指定するための制御文字で、以下の2つの範囲が悪用されている。
| Unicode範囲 | 名称 | 本来の用途 | 攻撃での役割 |
|---|---|---|---|
U+FE00〜U+FE0F |
Variation Selectors | 絵文字・漢字の字形指定 | 0〜15の値をエンコード |
U+E0100〜U+E01EF |
Variation Selectors Supplement | 拡張字形指定 | 16〜239の値をエンコード |
これらの文字は表示幅がゼロで、GitHub・VS Code・ターミナル・diffビューアのすべてで完全に不可視。テキストエディタのカーソルすら止まらない。
デコーダーの仕組み
攻撃コードは以下のようなデコーダー関数を使い、不可視文字列からバイト列を復元する。
// GlassWormデコーダーパターン(検出用に簡略化)
const decode = v => [...v].map(w => (
w = w.codePointAt(0),
w >= 0xFE00 && w <= 0xFE0F ? w - 0xFE00 :
w >= 0xE0100 && w <= 0xE01EF ? w - 0xE0100 + 16 : null
)).filter(n => n !== null);
// 見た目は空文字列だが、数千の不可視文字が含まれている
eval(Buffer.from(decode(``)).toString('utf-8'));
バッククォートの間に不可視文字が大量に埋め込まれ、eval()で実行される。見た目は1行の空文字列だが、不可視文字として大量のマルウェアコードが隠されている。
Solanaブロックチェーンを使ったC2――テイクダウン不能な指揮統制
従来のマルウェアはC2(Command & Control)サーバーにドメインやIPアドレスを使うため、セキュリティチームがドメインを差し押さえれば無力化できた。GlassWormはSolanaブロックチェーンのウォレットをC2として使う。
ペイロードURL書き込み loop 5秒ごと M->>S: ウォレットの最新
トランザクションを照会 S-->>M: メモフィールドから
C2 URLを取得 end M->>A: 窃取データを送信 Note over A,S: ブロックチェーンは
誰にも削除できない
2025年11月27日から2026年3月13日までの間に、研究者は50回のトランザクションを確認。攻撃者はウォレットのメモフィールドを更新するだけで、マルウェアの接続先を自在に変更できる。
GitHub・npm・Visual Studio Code拡張機能への汚染拡大の全貌
GlassWormは単一のプラットフォームに留まらず、開発エコシステム全体に拡散した。
| プラットフォーム | 汚染数 | 手法 |
|---|---|---|
| GitHub(Pythonリポジトリ) | 数百件 | 盗んだトークンでforce-push |
| GitHub(JS/TSリポジトリ) | 151件 | 不可視Unicodeペイロード |
| VS Code / Open VSX拡張 | 72件 | 悪意ある拡張機能 |
| npmパッケージ | 10件 | 汚染パッケージ |
| 合計 | 433件以上 | — |
影響を受けたプロジェクトには、状態管理ライブラリ「reworm」(1,460スター)、Wasmerの公式サンプルリポジトリ「wasmer-examples」、OpenCode関連の「opencode-bench」などが含まれる。悪意あるVS Code拡張7つの合計ダウンロード数は約35,800回に達していた。
攻撃の拡散メカニズム
(計35,800 DL)"] -->|"開発者の認証情報を窃取"| B["GitHubトークン取得"] B --> C["正規リポジトリに
force-push"] C --> D["LLMで生成した
カバーコミット"] D --> E["ドキュメント修正に偽装
バージョンバンプに偽装"] E --> F["他の開発者が
pullして感染"] F -->|"自己複製ループ"| B
攻撃者はまずVS Code拡張やnpmパッケージから開発者のGitHubトークンを盗み、そのトークンで正規リポジトリにforce-pushする。コミットは「ドキュメント修正」「バージョンアップ」などに偽装され、LLMで生成された自然なコミットメッセージが使われている可能性がある。
攻撃タイムライン
| 時期 | 出来事 |
|---|---|
| 2025年3月 | Aikido Securityが不可視Unicode使用のnpmパッケージを最初に発見 |
| 2025年5月 | Unicodeベースの攻撃リスクに関する研究論文が公開 |
| 2025年10月17日 | Koi SecurityがOpen VSXの汚染拡張を特定 |
| 2025年11月27日 | Solana C2のトランザクション開始 |
| 2026年1月31日 | 追加の悪意あるOpen VSX拡張が発見 |
| 2026年3月3〜9日 | 大規模波:1週間で151以上のGitHubリポジトリが汚染 |
| 2026年3月13日 | 最後に確認されたC2トランザクション更新 |
| 2026年3月16日 | Aikido Security等が詳細レポートを公開 |
| 2026年4月3日 | 複数のセキュリティブログが詳細分析を公開 |
窃取される情報と攻撃者の痕跡
標的データ
マルウェアが狙うのは開発者の資産だ。
- 暗号資産ウォレットのデータ
- GitHubトークン・SSH鍵などの開発者認証情報
- 開発環境のデータ
ロシア語圏の関与
コード分析から、マルウェアはロシア語ロケールが検出された場合に実行をスキップする仕様が確認されている。ロシア語圏の攻撃者が関与している可能性を示唆するが、偽旗工作の可能性もあり、確定的な帰属は困難だ。
影響を受けたプロジェクト数と被害規模:自分のリポジトリを今すぐ確認する
以下のコマンドで感染の兆候をチェックできる。
# 1. GlassWorm特有の変数名を検索
grep -r "lzcdrtfxyqiplpd" --include="*.js" --include="*.ts" .
# 2. 不可視Unicode文字(異体字セレクター範囲)のスキャン
grep -rP '[\x{FE00}-\x{FE0F}]|[\x{E0100}-\x{E01EF}]' --include="*.js" .
# 3. 感染時に作成されるファイルの確認
ls -la ~/init.json ~/node-v22* 2>/dev/null && echo "⚠️ 感染の痕跡あり"
# 4. バッククォート内の不可視文字を検出(Node.js)
node -e "
const fs = require('fs');
const code = fs.readFileSync(process.argv[1], 'utf-8');
const invisible = code.match(/[\uFE00-\uFE0F\u{E0100}-\u{E01EF}]/gu);
if (invisible) console.log('⚠️ 不可視文字検出:', invisible.length, '個');
else console.log('✓ 不可視文字なし');
" target_file.js
Pythonで一括スキャンしたい場合は以下のスクリプトが使える:
#!/usr/bin/env python3
"""GlassWorm不可視Unicode文字スキャナー"""
import sys
import os
# 検出対象のUnicode範囲(GlassWormが悪用する異体字セレクター)
INVISIBLE_RANGES = [
(0xFE00, 0xFE0F), # Variation Selectors
(0xE0100, 0xE01EF), # Variation Selectors Supplement
(0x200B, 0x200F), # ゼロ幅スペース等
]
def is_invisible(cp):
return any(lo <= cp <= hi for lo, hi in INVISIBLE_RANGES)
def scan_file(path):
try:
with open(path, encoding='utf-8', errors='replace') as f:
content = f.read()
except Exception as e:
return []
hits = [(i, hex(ord(c))) for i, c in enumerate(content) if is_invisible(ord(c))]
return hits
def scan_dir(root, exts=('.js', '.ts', '.py', '.sh')):
results = {}
for dirpath, _, files in os.walk(root):
for fname in files:
if fname.endswith(exts):
fpath = os.path.join(dirpath, fname)
hits = scan_file(fpath)
if hits:
results[fpath] = hits
return results
if __name__ == '__main__':
target = sys.argv[1] if len(sys.argv) > 1 else '.'
print(f"スキャン対象: {target}")
results = scan_dir(target)
if results:
print(f"\n⚠️ 不可視文字を検出したファイル: {len(results)}件")
for path, hits in results.items():
print(f" {path}: {len(hits)}個の不可視文字 (例: {hits[0][1]})")
else:
print("✓ 不可視Unicode文字は検出されませんでした")
実行方法:python3 glassworm_scan.py ./your-project
開発者が今すぐやるべき対策
| 対策 | 優先度 | 効果 |
|---|---|---|
| デフォルトブランチへのforce-push禁止 | 最優先 | 不正コミットの注入を防止 |
| ハードウェアキー(YubiKey等)認証 | 最優先 | トークン窃取後の悪用を防止 |
| Unicode制御文字の自動スキャン導入 | 高 | 不可視ペイロードの検出 |
| 依存関係のロック+ハッシュ検証 | 高 | サプライチェーン改ざん検出 |
| VS Code拡張の定期監査 | 中 | 悪意ある拡張の排除 |
Claude Codeのようなコーディングツールを使う場合、感染リポジトリのコードをAIが読み込むと人間のレビューなしにペイロードが実行されるリスクがある点にも注意が必要だ。
開発基盤の信頼を揺るがす理由:GitHubの「修正予定なし」とLLM悪用リスク
専門家が指摘するのは、LLMを使った攻撃の自動化だ。GlassWormでは以下の場面でAIが悪用された可能性がある。
- カバーコミットの自動生成: 正規のコミット履歴に紛れ込む自然な文面
- 多言語・多フレームワーク展開: React、Python、VS Code拡張にまたがる攻撃コードの大量生成
- AIエージェントへの感染: Browser Useなどの自律エージェントが感染ファイルを処理すると、人間の介入なしに攻撃が伝播する可能性
Hacker Newsの議論では、「GitHubはUnicode警告機能を持っているが、バグバウンティ報告者に対して『修正予定なし』と回答した」という情報も共有されている。開発環境のセキュリティを個々の開発者だけに委ねるのは限界があり、プラットフォーム側の対応が問われている。
で、結局どこまで確認されているのか
不可視ペイロード"] F3["Solana C2で50回の
トランザクション確認"] F4["React, Wasmer, OpenCode
が影響"] end subgraph analysis["専門家の分析・推測"] A1["LLMによるカバーコミット
大量生成の可能性"] A2["ロシア語圏の攻撃者が
関与した可能性"] A3["AIエージェントを介した
二次感染リスク"] end subgraph unknown["未確認"] U1["攻撃者の正確な所属・動機"] U2["実際に暗号資産が
窃取された被害額"] U3["GitHub側の対応計画"] end
GlassWormは「サプライチェーン攻撃」の新たな段階を示している。コードの見た目だけを信頼する時代は終わった。
FAQ:GlassWormについてよくある質問
Q. GlassWormとは何か?
UnicodeのVariation Selector(異体字セレクター)をソースコードに埋め込み、人間の目には完全に見えないマルウェアを混入させるサプライチェーン攻撃の総称です。2025年3月に最初の事例が発見され、2026年3月に大規模な汚染(433件以上)が確認されました。
Q. なぜコードレビューで検出できないのか?
攻撃に使われるU+FE00〜U+FE0FやU+E0100〜U+E01EFは表示幅がゼロの制御文字で、GitHub・VS Code・ターミナルのdiffビューアすべてで不可視です。カーソルすら止まらないため、視覚的に発見する方法はありません。
Q. Visual Studio Code拡張機能はなぜ攻撃の起点になるのか?
VS Code拡張はインストール後に任意のコードを実行でき、GitHubトークンなどの認証情報にもアクセス可能です。GlassWormは悪意あるVS Code拡張(72件確認)を使ってトークンを盗み、正規リポジトリへのforce-pushに悪用しました。
Q. npm汚染のリスクはどれほど深刻か?
汚染されたnpmパッケージ(10件確認)はインストール時や実行時にペイロードを実行します。パッケージのバージョンロック(package-lock.jsonのハッシュ検証)と定期的な依存関係監査が対策として有効です。
Q. 自分のプロジェクトが感染しているか確認するには?
上記のbashコマンドまたはPythonスクリプトでスキャンしてください。特に「lzcdrtfxyqiplpd」という変数名の検索と、~/init.json・~/node-v22*の存在確認が即効性があります。
Q. Solanaを使ったC2はなぜテイクダウンできないのか?
ブロックチェーン上のウォレットはどの機関にも削除できません。攻撃者はウォレットのトランザクションメモにC2サーバーURLを書き込み、マルウェアが5秒ごとに照会する仕組みを構築しています。
関連記事: サプライチェーンセキュリティ完全ガイド2026|攻撃手法・防御ツール・実践チェックリスト
参照ソース
- Aikido Security: Glassworm Returns — Invisible Unicode Malware Found in 150+ GitHub Repositories
- BleepingComputer: GlassWorm malware hits 400+ code repos on GitHub, npm, VSCode, OpenVSX
- The Hacker News: GlassWorm Attack Uses Stolen GitHub Tokens to Force-Push Malware Into Python Repos
- Scientific American: GlassWorm malware hides in invisible open-source code
- Codebook: GlassWormマルウェア、GitHub・npm・VSCode・OpenVSXのリポジトリ400件超を侵害
- Qiita: GitHubリポジトリが静かに書き換えられる — GlassWorm
この記事はAI業界の最新動向を速報でお届けする「AI Heartland ニュース」です。