
glassworm-hunter v1.0.4
GlassWormのサプライチェーン攻撃ペイロードを検出します。VS Code拡張機能、npm/PyPIパッケージ、gitリポジトリをスキャンし、不可視のUnicodeペイロード、デコーダパターン、C2マーカー、既知の悪意あるIOCを検出します。
glassworm-hunter

あなたのマシン上で GlassWorm サプライチェーン攻撃のペイロードを検出します。VS Code 拡張機能、npm パッケージ、Python パッケージ、git リポジトリをスキャンします。
このスキャナーは攻撃手法そのものを検出します。すなわち、不可視の Unicode バリエーションセレクターペイロード、GlassWorm デコーダーパターン、C2 インジケーター、認証情報収集コードなどです。
インストール
pip install glassworm-hunter
または pipx を使用:
pipx install glassworm-hunter
クイックスタート
カレントディレクトリを VS Code/Cursor 拡張機能をスキャンせずにスキャン:
glassworm-hunter scan --no-extensions
特定のプロジェクトをスキャン:
glassworm-hunter scan /path/to/project
検出内容
手法の検出(未知の亜種も捕捉)
- 不可視の Unicode ペイロード — バリエーションセレクター文字(U+FE00-FE0F、U+E0100-E01EF)を使用して隠しコードをエンコード。正当な用途は絵文字の 1~2 文字。GlassWorm は数千文字を使用。
- GlassWorm デコーダーパターン — codePointAt とバリエーションセレクター範囲の算術演算で不可視ペイロードをデコードするパターン。
- 双方向オーバーライド文字 — Trojan Source 攻撃(CVE-2021-42574)
- ハングルフィラー — 不可視の有効な JavaScript 識別子(U+3164)
- 動的コンテンツを含む eval/Function — デコードされた文字列が供給される実行シンク
- 認証情報へのアクセス — .npmrc、.gitcredentials、SSH キー、トークン環境変数を読み取るコード
- C2 通信パターン — 不適切なコンテキストでの Solana RPC 呼び出し、Google Calendar URL、WebRTC データチャネル
既知の IOC マッチング(補足)
- 21 個の既知の悪意のある VS Code/OpenVSX 拡張機能 ID(全 5 波)
- 4 個の既知の悪意のある npm パッケージ
- 14 個の既知の C2 IP アドレス
- 3 個の既知の Solana C2 ウォレットアドレス
- 攻撃者のメールアドレスやビルドパスのアーティファクト
深刻度レベル
| レベル | 意味 |
|---|---|
| CRITICAL | アクティブな GlassWorm ペイロードを検出(コード内の不可視 Unicode クラスター、デコーダーパターン) |
| HIGH | 既知の悪意のある IOC に一致(C2 IP、ウォレット、既知のマルウェアへの拡張機能依存関係) |
| MEDIUM | 確認すべき疑わしいパターン(動的コンテンツを含む eval、認証情報アクセス、Trojan Source) |
| LOW | 情報提供(異常なゼロ幅文字密度、不審なインストールスクリプト) |
CLI オプション
glassworm-hunter scan [OPTIONS] [PATHS...]
| オプション | デフォルト | 説明 |
|---|---|---|
--extensions / --no-extensions | on | VS Code/Cursor/Codium 拡張機能をスキャン |
--npm-scan / --no-npm-scan | on | node_modules をスキャン |
--pip-scan / --no-pip-scan | off | Python site-packages をスキャン |
--git / --no-git | on | git リポジトリをスキャン |
--format [console|json|sarif] | console | 出力形式 |
--output FILE | stdout | レポートをファイルに書き込み |
--severity [critical|high|medium|low] | low | 報告する最小の深刻度 |
--max-file-size SIZE | 10MB | これより大きいファイルをスキップ |
--include-hidden | off | 隠しファイル/ディレクトリをスキャン |
--quiet | off | 進捗出力を抑制 |
--verbose | off | スキャンしている全ファイルを表示 |
--exclude PATTERN | — | 除外するグロブパターン(繰り返し可) |
--disable-rule RULE_ID | — | 特定の検出ルールを抑制(繰り返し可) |
--ioc-file FILE | — | 追加の IOC インジケーターを JSON ファイルから読み込み |
スキャン中は、stderr に Rich プログレスバーが表示されます。--quiet または --verbose を指定すると自動的に抑制されます。スキャン完了後、常にサマリー行(スキャンしたファイル数、検出結果、出力先)が stderr に出力されます。
その他のコマンド
# すべての検出ルール ID を一覧表示(--disable-rule で使用)
glassworm-hunter rules
# ローカルの IOC データベースを GitHub から更新(デフォルトソース:
# https://raw.githubusercontent.com/afine-com/glassworm-hunter/main/data/ioc.json)
glassworm-hunter update
# カスタムソースから更新(例: 内部脅威インテリジェンスサーバー)
glassworm-hunter update --source https://internal.corp/ioc.json
# 既存のローカル IOC データベースを強制的に上書き
glassworm-hunter update --force
# バージョン表示
glassworm-hunter version
終了コード
| コード | 意味 |
|---|---|
| 0 | 検出結果なし |
| 1 | 検出結果あり |
| 2 | スキャナーエラー |
何か見つかった場合
- パニックにならないでください。 スキャナーが検出したのはインジケーターであり、確定した侵害ではありません。一部の検出は誤検知である可能性があります。私たちのチームは継続的に誤検知を減らし、検出精度を向上させるよう取り組んでいます。
- フラグが立ったコードは実行しないでください。 問題が解決されるまで、影響を受けたプロジェクトの実行、ビルド、テストを行わないでください。
- CRITICAL 検出: 拡張機能/パッケージを直ちにアンインストールしてください。マシン上の NPM トークン、GitHub トークン、SSH キー、その他の認証情報をローテーションしてください。
- HIGH 検出: フラグが立ったファイルを調査してください。明示的にインストールしていない依存関係にある場合は削除してください。
- MEDIUM 検出: コードを確認してください。これらのパターンは疑わしいですが、状況によっては正当な場合もあります。
CI/CD 統合
自動処理用の JSON 出力:
glassworm-hunter scan . --format json --output report.json --no-extensions
GitHub Code Scanning 用の SARIF:
glassworm-hunter scan . --format sarif --output results.sarif --no-extensions
SARIF を GitHub にアップロード:
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
CI で終了コードを使用:
glassworm-hunter scan . --severity critical --no-extensions || exit 1
ビルド成果物やベンダーコードを除外:
glassworm-hunter scan . --exclude "dist/**" --exclude "*.min.js" --no-extensions
ネットワークアクセス不要
このスキャナーはデフォルトで完全にオフラインです。ローカルファイルのみを読み取ります。テレメトリ、ホームコール、自動更新チェックは一切行いません。IOC データベースはパッケージにバンドルされています。
ネットワークリクエストを行う唯一のコマンドは glassworm-hunter update で、これは GitHub(またはカスタムの --source URL)から最新の IOC データベースを取得します。自動的に呼び出されることはありません。
設定ファイル
プロジェクトルートに .glassworm.yml を配置してデフォルト値を設定:
exclude:
- "*.min.js"
- "vendor/**"
- "dist/**"
disable_rules:
- zero-width-chars
severity: medium
CLI フラグは設定ファイルの値を上書きします。
カスタム IOC ファイル
--ioc-file を使用して、JSON ファイルから追加のインジケーターを読み込みます。チーム固有の脅威インテリジェンスや内部の脅威情報に便利です:
glassworm-hunter scan /path --ioc-file /path/to/team_ioc.json
ファイルは data/ioc.json と同じスキーマに従う必要があります:
{
"schema_version": "1.0",
"extensions": [{"id": "publisher.name"}],
"npm_packages": [{"name": "pkg", "malicious_versions": "1.0.0"}],
"c2_ips": [{"ip": "1.2.3.4"}],
"c2_wallets": [{"address": "..."}],
"attacker_artifacts": [{"type": "email", "value": "[email protected]"}]
}
カスタムファイルは他のすべての IOC レイヤー(ハードコード → バンドル → ユーザー ~/.glassworm/ioc.json → --ioc-file)の上にマージされます。
IOC データベースのレイヤー
スキャナーは 3+1 レイヤーの IOC システムを使用します(各レイヤーは前のレイヤーの上にマージされ、削除は行われません):
- ハードコード — Python ソースに組み込まれており、常に利用可能
- バンドル — パッケージに同梱されている
data/ioc.json - ユーザー —
~/.glassworm/ioc.json、glassworm-hunter updateで更新 - カスタム —
--ioc-fileフラグ、最優先
クレジット
- Koi Security — GlassWorm の初発見(2025 年 10 月)および複数の波にわたる継続的な追跡(OpenVSX/VSCode キャンペーン、Rust バイナリピボット、macOS ピボットを含む)。本スキャナー内の IOC データは同社の公開研究に基づいています。
- Aikido Security — GitHub リポジトリと npm パッケージを標的とした 2026 年 3 月の GlassWorm 波の解析。Socket、Step Security、OpenSourceMalware コミュニティと協力。
- AFINE — 本スキャナー。詳細な研究はこちら: Hunting GlassWorm: Open-Source Detection for Invisible Supply Chain Payloads
Windows
スキャナーは Windows でも動作します。管理者(Administrator)権限のコマンドプロンプトで実行しない場合、4 つのテストが失敗します。
ライセンス
MIT