
リアルタイム npm/PyPI サプライチェーン脅威検出。動作チェーン分析、ASTスキャン、IOCフィード、複合スコアリングエンジン。
インストール | 使い方 | 機能 | VS Code | CI/CD
npm と PyPI のサプライチェーン攻撃が急増しています。Shai-Hulud は 2025 年に 25,000 以上のリポジトリを侵害しました。既存のツールは脅威を検出しますが、対応には役立ちません。
MUAD'DIB は、22 の並列スキャナー(278 の検出ルール)、難読化解除エンジン、モジュール間データフロー解析、複合スコアリング(21 の複合ルール)、および gVisor/Docker サンドボックスを組み合わせて、npm および PyPI パッケージの既知の脅威と疑わしい動作パターンを検出します。XGBoost 分類器がコードベースに存在しますが、現在は無効です(評価 を参照)。
MUAD'DIB は、npm と PyPI 向けの無料・オープン・完全監査可能なサプライチェーンスキャナーです。既知の脅威(225,000 以上の IOC)、インストール時 RCE、認証情報窃取後の外部送信フロー、難読化されたペイロード、その他の疑わしい動作パターンを、テレメトリなしでローカルに検出します。
AGPL-3.0 ライセンスで提供されています。プロプライエタリ製品への組み込みや、クローズドなホステッドサービスとして実行する必要がある組織向けに、商用ライセンスも利用可能です(ライセンス を参照)。
意図的にすべてを網羅しようとはしていません。何を検出し、何を検出しないかの正確な範囲は スコープ を参照してください。
検出対象(npm & PyPI):既知の悪意のあるパッケージ(名前 + SHA256 IOC マッチ)、タイポスクワッティング、インストール時 RCE(ライフサイクル preinstall/postinstall、curl | sh、Python インポート時、binding.gyp)、認証情報読み取り後のネットワーク外部送信(ファイル内およびファイル間)、難読化 / 高エントロピー / スタブローダーペイロード、バイナリドロッパー(chmod +x + exec/spawn)、および分析回避の痕跡。
対象外:ブラウザのみの攻撃(DOM/window、Node.js API なし)、ネイティブバイナリ / WASM の内容(バイナリ解析なし)、ゼロデイ未知パッケージ(IOC フィードは事後対応型)、および npm/PyPI 以外のエコシステム(RubyGems、Maven、Go)。意図的なアンチサンドボックスフィンガープリンティングや多段階リモートペイロードは、既知の偽陰性リスクです。詳細:脅威モデル。
テレメトリなし。 コードとスキャン結果がマシンから出ることはありません。MUAD'DIB は脅威インテルフィードのダウンロード(muaddib update)と、スコアリングのための公開 npm レジストリメタデータの読み取りのみを行います。Webhook アラートはオプトインです。
npm install -g muaddib-scanner
git clone https://github.com/DNSZLSK/muad-dib
cd muad-dib
npm install
npm link
muaddib scan .
muaddib scan /path/to/project
npm(package.json、node_modules)と Python(requirements.txt、setup.py、pyproject.toml)の両方の依存関係をスキャンします。
muaddib
muaddib install <package>
muaddib install lodash axios --save-dev
muaddib install suspicious-pkg --force # 脅威があっても強制インストール
インストール前にパッケージの脅威をスキャンします。既知の悪意のあるパッケージをブロックします。
各スキャンで 0〜100 のリスクスコアが表示されます:
[SCORE] 58/100 [***********---------] HIGH
muaddib scan . --explain
各検出について、ルール ID、MITRE ATT&CK 手法、参照、対応プレイブックを表示します。
muaddib scan . --json > results.json # JSON
muaddib scan . --html report.html # HTML
muaddib scan . --sarif results.sarif # SARIF(GitHub Security)
muaddib scan . --fail-on critical # CRITICAL のみで失敗
muaddib scan . --fail-on high # HIGH と CRITICAL で失敗(デフォルト)
muaddib scan . --paranoid
許容度を低くした超厳格な検出。ネットワークアクセス、サブプロセス実行、動的コード評価、機密ファイルアクセスをすべて検出します。
muaddib scan . --webhook "https://discord.com/api/webhooks/..."
厳格なフィルタリング(v2.1.2):IOC マッチ、サンドボックスで確認された脅威、またはカナリアトークンの外部送信のみアラートを送信します。優先トリアージ(v2.10.21):P1(赤、IOC/サンドボックス/カナリア)、P2(オレンジ、高スコア/複合)、P3(黄、その他)。
muaddib scan . --temporal-full # 4 つの時間的特徴すべて
muaddib scan . --temporal # 突発的なライフサイクルスクリプト検出
muaddib scan . --temporal-ast # バージョン間の AST 差分
muaddib scan . --temporal-publish # 公開頻度の異常
muaddib scan . --temporal-maintainer # メンテナー変更の検出
パッケージバージョン間の変更を分析することで、IOC データベースに登場する前にサプライチェーン攻撃を検出します。詳細は 評価方法論 を参照してください。
muaddib sandbox <package-name>
muaddib sandbox <package-name> --strict
分離された Docker コンテナでの動的解析:strace、tcpdump、ファイルシステム差分、カナリアトークン、CI 認識環境、タイムボム検出のためのモンキーパッチプリロード([0h、72h、7d] オフセットでの複数回実行)。
muaddib watch . # リアルタイム監視
muaddib daemon # デーモンモード(npm install を自動スキャン)
muaddib update # IOC の更新(高速、約 5 秒)
muaddib scrape # 完全な IOC リフレッシュ(約 5 分)
muaddib diff HEAD~1 # 前回のコミットと脅威を比較
muaddib init-hooks # プリコミットフック(husky/pre-commit/git)
muaddib scan . --breakdown # 説明可能なスコア分解
muaddib replay # グラウンドトゥルース検証(90/94 TPR@3、v2.11.48)
すべてのルール(273 RULES + 5 PARANOID)は MITRE ATT&CK 手法にマッピングされています。完全なルールリファレンスは SECURITY.md を参照してください。
VS Code 拡張機能が npm プロジェクトを自動的にスキャンします。
code --install-extension dnszlsk.muaddib-vscode
MUAD'DIB: Scan Project - プロジェクト全体をスキャンMUAD'DIB: Scan Current File - 現在のファイルをスキャンmuaddib.autoScan、muaddib.webhookUrl、muaddib.failLevel完全なドキュメントは vscode-extension/README.md を参照してください。
最小構成(HIGH 以上の脅威でビルドを失敗させる、単一スキャン):
name: Security Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: DNSZLSK/[email protected] # リリースされたタグに固定
with:
fail-on: 'high'
SARIF を Security タブにアップロードする場合(security-events: write が必要。SARIF を生成するために 2 回目のパスを実行):
jobs:
scan:
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@v4
- uses: DNSZLSK/[email protected]
with:
path: '.'
fail-on: 'high'
sarif: 'results.sarif'
入力
出力(後続のステップで steps.<id>.outputs.* を使用して利用)
muaddib init-hooks # 自動検出(husky/pre-commit/git)
muaddib init-hooks --type husky # husky を強制
muaddib init-hooks --mode diff # 新しい脅威のみをブロック
pre-commit フレームワークの場合:
repos:
- repo: https://github.com/DNSZLSK/muad-dib
rev: v2.11.139
hooks:
- id: muaddib-scan
最終測定 v2.11.48(2026-05-26)、ルールのみ(ML 分類器は無効 — 下記参照)。グラウンドトゥルース:スコープ内の実世界攻撃 94 件 + ランダム npm 200 件 + PyPI 124 件 + 敵対的/ホールドアウト 107 件。
ML 分類器:無効。 XGBoost モデルが src/ml/ に存在しますが、muaddib scan には配線されておらず、2026-04-08 以降モニターで LOG-ONLY として実行されています(トレーニング済みモデルが崩壊し、再トレーニング待ち)。上記の数値はすべてルールのみです。
完全なプロトコル、トラック別履歴、PyPI cap-35 の注意点、運用(GHSA ベース)カバレッジ、ML 再トレーニング方法論:評価方法論。
iocs/ 内の YAML ファイルを編集します:
- id: NEW-MALWARE-001
name: "malicious-package"
version: "*"
severity: critical
confidence: high
source: community
description: "Threat description"
references:
- https://example.com/article
mitre: T1195.002
git clone https://github.com/DNSZLSK/muad-dib
cd muad-dib
npm install
npm test
MUAD'DIB は GNU Affero General Public License v3.0 only(AGPL-3.0-only)でライセンスされています — LICENSE および NOTICE を参照してください。
派生作品およびネットワーク展開された変更が同じライセンスでリリースされることを条件に、ネットワーク経由を含め、自由に使用、研究、変更、再配布できます。
商用ライセンス: MUAD'DIB をプロプライエタリ / クローズドソース製品に組み込む場合、または AGPL のソース開示義務なしにホステッドサービスとして提供する場合は、別途商用ライセンスが利用可能です。Issue を開くか、作者(DNSZLSK)に連絡してください。
Copyright (C) 2026 DNSZLSK.
The spice must flow. The worms must die.
| スキャナー | 検出 |
|---|
| AST パース(acorn) | eval、Function、認証情報窃取、バイナリドロッパー、プロトタイプフック |
| パターンマッチング | シェルコマンド、リバースシェル、デッドマンズスイッチ |
| データフロー解析 | 認証情報読み取り + ネットワーク送信(ファイル内およびファイル間) |
| 難読化検出 | JS 難読化パターン(.min.js をスキップ) |
| 難読化解除前処理 | 文字列連結、charcode、base64、16 進配列、定数伝播 |
| モジュール間データフロー | ファイル間の汚染伝播(3 ホップチェーン、クラスメソッド) |
| 意図整合性 | ファイル内のソース・シンクペアリング(認証情報 + eval/ネットワーク) |
| タイポスクワッティング | npm + PyPI(レーベンシュタイン距離) |
| Python スキャナー | requirements.txt、setup.py、pyproject.toml、14,000 以上の PyPI IOC |
| シャノンエントロピー | 高エントロピー文字列(5.5 ビット + 最小 50 文字) |
| AI 設定スキャナー | .cursorrules、CLAUDE.md、copilot-instructions.md インジェクション |
| パッケージ/依存関係 | ライフサイクルスクリプト、IOC マッチング(225,000 以上のパッケージ) |
| GitHub Actions | Shai-Hulud バックドア検出 |
| ハッシュスキャナー | 既知の悪意のあるファイルハッシュ |
| IOC 文字列(intel-triage P1.1) | YARA スタイルの文字列マッチング(Axios 2026、TeamPCP、GlassWorm、CanisterSprawl) |
| アンチフォレンジック AST(intel-triage P1.2) | XOR ループ + 自己削除 + デコイ書き込み複合(csec autodelete) |
| スタブパッケージ(intel-triage P1.3) | 小さなメインファイル + 外部依存 URL + ライフサイクルフック(ltidi チェーン) |
| モノレポスキャナー | Lerna/pnpm-workspace/turbo 検出(Sprint 1 監査 MR-C2 修正) |
| 信頼済み依存差分(オプトイン) | レジストリからの信頼済み依存 tarball との差分(v2.10.x) |
| Python ソース(PYSRC) | __init__.py / setup.py のインポート時 / インストール時 RCE パターン(v2.11.41 — TrapDoor PyPI ギャップを解消) |
| Python AST(PYAST) | 汚染認識検出器を備えた Tree-sitter-Python AST(v2.11.42+) |
| アンチスキャナーインジェクション(ASI) | LLM コードレビュアーにクリーンな判定を強制したり、難読化されたペイロードをスキップさせたりするコメント/文字列内のプロンプトインジェクションテキスト(ASI-001..004、Hades キャンペーン 2026-06) |
| キャンペーン | ステータス |
|---|
| GlassWorm(2026、433 以上のパッケージ) | 検出済み |
| Shai-Hulud v1/v2/v3(2025) | 検出済み |
| event-stream(2018) | 検出済み |
| eslint-scope(2018) | 検出済み |
| Protestware(node-ipc、colors、faker) | 検出済み |
| タイポスクワット(crossenv、mongose、babelcli) | 検出済み |
| 入力 | 説明 | デフォルト |
|---|
path | スキャンするパス | . |
fail-on | 失敗する最小重大度(critical/high/medium/low/none) | high |
sarif | SARIF 出力ファイルパス — 設定すると Security タブにもアップロード | |
paranoid | 超厳格な検出(FPR が高くなる) | false |
version | インストールする muaddib-scanner npm バージョン | latest |
| 出力 | 説明 |
|---|
risk-score | リスクスコア 0〜100 |
risk-level | SAFE / LOW / MEDIUM / HIGH / CRITICAL |
threats-count | 検出された脅威の総数 |
critical-count / high-count | 重大度別の脅威数 |
exit-code | 0 = fail-on ゲートを通過、それ以外は非ゼロ |
sarif-file | SARIF ファイルへのパス(sarif が設定されていない場合は空) |
| 指標 | 結果 |
|---|
| 検出率(TPR@3) | 95.74%(90/94) |
| アラート率(TPR@20) | 88.30%(83/94) |
| FPR — キュレーション済み npm(548) | 1.10%(6/545) |
| FPR — ランダム npm(200) | 2.50%(5/200) |
| FPR — PyPI(132) | 9.68%(12/124) |
| ADR — 敵対的 + ホールドアウト | 96.26%(103/107) |
| ワイルド TPR(Datadog 17K) | 92.8%(13,538/14,587) |