
依存関係のないCLIスキャナーで、npm/PyPIのサプライチェーン侵害を検出します。ロックファイル内の侵害されたパッケージや、Mini Shai-Hulud(CVE-2026-45321)のような攻撃によるシステムレベルのIOCを検出します。
npmおよびPyPIのサプライチェーン侵害をスキャンするゼロ依存CLIツール
2026年5月11日、Mini Shai-Hulud(CVE-2026-45321、GHSA-g7cv-rxg3-hmpx)と名付けられた自己増殖型サプライチェーンワームがnpmエコシステムを侵害しました。TeamPCP(別名DeadCatx3、PCPcat、ShellForce、CipherForce)によるものとされ、このマルウェアはGitHub ActionsのOIDCトークンを乗っ取り、有効なSLSA Build Level 3の出所証明を持つ悪意のあるパッケージを公開しました。CI/CDパイプライン、クラウドプロバイダー、暗号通貨ウォレットから認証情報を盗み、Claude CodeやVS Codeに永続化フックを仕掛けました。また、npmトークンが失効された場合にユーザーのホームディレクトリを消去するデッドマンスイッチが組み込まれていました。
影響を受けたパッケージには、TanStack RouterやStartパッケージ、Mistral AI SDK、OpenSearchクライアント、UiPathツールなど、数十ものパッケージが含まれます。サプライチェーン攻撃は急速に拡散するため、組織は攻撃対象領域を広げることなく、どこでも実行できる軽量で信頼性の高いスキャナーを必要としています。
package-lock.json、pnpm-lock.yaml、yarn.lock、bun.lock、bun.lockb、poetry.lock、Pipfile.lock、requirements.txt内の侵害されたnpmおよびPyPIパッケージを検出fs、path、child_process、os)のみを使用。スキャナー自体がサプライチェーンリスクを増大させることはありません0 = 問題なし、1 = 検出あり、2 = エラー)src/db.tsに個別のキャンペーンとして追加。ファイルを更新して再実行するだけインストールは不要です。お好みのパッケージランナーで直接実行できます:
# npx
npx @digi4care/shai-scan
# bunx
bunx @digi4care/shai-scan
# pnpm dlx
pnpm dlx @digi4care/shai-scan
グローバルインストール(オプション):
npm install -g @digi4care/shai-scan
# または
pnpm add -g @digi4care/shai-scan
ソースから:
git clone https://github.com/digi4care/shai-scan.git
cd shai-scan
pnpm install
bun run src/cli.ts --help # Bun(開発に推奨)
# またはNode.jsでビルドして実行:
pnpm run build && node dist/cli.js --help
npx @digi4care/shai-scan
npx @digi4care/shai-scan ~/projects/my-app
npx @digi4care/shai-scan --json .
npx @digi4care/shai-scan --sarif --sarif-file results.sarif .
#!/bin/bash
npx @digi4care/shai-scan --severity high . || {
code=$?
if [ "$code" -eq 1 ]; then
echo "サプライチェーン上の問題を検出しました"
exit 1
elif [ "$code" -eq 2 ]; then
echo "スキャナーエラー"
exit 2
fi
}
name: Supply Chain Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: pnpm install --frozen-lockfile
- run: npx @digi4care/shai-scan --severity high .
name: Supply Chain Scan SARIF
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: '0 6 * * 1'
jobs:
scan:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: pnpm install --frozen-lockfile
- run: npx @digi4care/shai-scan --sarif --sarif-file results.sarif .
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
| 形式 | フラグ | 説明 |
|---|---|---|
| テキスト | (デフォルト) | 深刻度、パッケージ名、バージョン、キャンペーン詳細を含む人間が読める表形式の結果 |
| JSON | --json |
JSON出力の抜粋:
[
{
"package": "@tanstack/react-router",
"version": "1.169.5",
"ecosystem": "npm",
"severity": "critical",
"campaign": "mini-shai-hulud-wave4",
"cve": "CVE-2026-45321",
"reference": "https://github.com/TanStack/router/security/advisories/GHSA-g7cv-rxg3-hmpx"
}
]
| コード | 意味 |
|---|---|
| 0 | 侵害されたパッケージやIOCは検出されませんでした |
| 1 | 1つ以上の問題が検出されました |
| 2 | 実行時エラー(パスが無効、ロックファイルが読み取れないなど) |
新たなサプライチェーン攻撃が発見された場合は、src/db.tsを更新します:
CompromisedVersion[]配列を追加CampaignオブジェクトをCAMPAIGNS配列に追加buildLookup()関数が次回実行時に自動的にルックアップマップを再構築Bunを使用する場合は再ビルドの必要はありません。src/db.tsへの変更はbun run src/cli.tsですぐに反映されます。npmパッケージの場合は、編集後にpnpm run buildを実行してください。
実行時依存ゼロ:スキャナーはNode.js/Bunの組み込みモジュールのみを使用します。実行時にサードパーティのコードをダウンロードまたは実行しないため、スキャナー自体が侵害ベクターになるリスクを排除します。
pnpmをパッケージマネージャーとして使用:pnpmは厳格なロックファイルを使用し、デフォルトでライフサイクルスクリプトを実行せず、コンテンツアドレス可能ストレージをサポートします。これらの特性により、他のパッケージマネージャーと比較して攻撃対象領域が減少します。
推奨される.npmrc設定:パッケージをインストールする際の最大限の保護のために、プロジェクトまたはグローバルの.npmrcに以下を追加してください:
ignore-scripts=true
engine-strict=true
ネットワーク呼び出しなし:shai-scanは外部に情報を送信せず、署名をダウンロードせず、APIキーも必要としません。すべてのキャンペーンデータはパッケージに同梱されています。
以下のパッケージとバージョンは、CVE-2026-45321(Mini Shai-Hulud Wave 4)で侵害されていることが確認されています。これは代表的なサブセットであり、完全なリストはsrc/db.tsで管理されています。
MIT。詳細はLICENSEをご覧ください。
shai-scanは検出支援ツールであり、包括的なセキュリティ監査、依存関係レビュー、脅威インテリジェンスプラットフォームの代替にはなりません。出荷されたデータベースに基づいて既知の侵害バージョンを識別しますが、新規またはゼロデイのサプライチェーン攻撃はキャンペーンが追加されるまで検出されない可能性があります。常に多層防御を実践してください:依存関係の監査、バージョンの固定、出所の検証、CI/CDパイプラインの監視。
| SIEMやカスタムダッシュボードに取り込むための構造化JSON配列 |
| SARIF | --sarif | GitHub Code Scanning、GitLab Secure、その他のSARIF対応ツールにアップロードするためのOASIS SARIF 2.1.0形式 |
| パッケージ | エコシステム | 侵害されたバージョン |
|---|
@tanstack/react-router | npm | 1.169.5, 1.169.8 |
@tanstack/vue-router | npm | 1.169.5, 1.169.8 |
@tanstack/solid-router | npm | 1.169.5, 1.169.8 |
@tanstack/router-core | npm | 1.169.5, 1.169.8 |
@tanstack/react-start | npm | 1.167.68, 1.167.71 |
@mistralai/mistralai | npm | 2.2.2, 2.2.3, 2.2.4 |
@mistralai/mistralai-azure | npm | 1.7.2, 1.7.3 |
mistralai | pypi | 2.4.6 |
@opensearch-project/opensearch | npm | 3.5.3, 3.6.2, 3.7.0, 3.8.0 |
@uipath/robot | npm | 1.3.4 |
@squawk/airways | npm | 0.4.2, 0.4.3, 0.4.5 |
@draftauth/core | npm | 0.13.1, 0.13.2 |
@tallyui/core | npm | 0.2.1, 0.2.2, 0.2.3 |
safe-action | npm | 0.8.3, 0.8.4 |
cmux-agent-mcp | npm | 0.1.3 - 0.1.8 |
nextmove-mcp | npm | 0.1.3, 0.1.4, 0.1.5, 0.1.7 |
ts-dna | npm | 3.0.1, 3.0.2, 3.0.4 |
cross-stitch | npm | 1.1.3, 1.1.4, 1.1.6 |
git-git-git | npm | 1.0.8 - 1.0.12 |
git-branch-selector | npm | 1.3.3 - 1.3.7 |
agentwork-cli | npm | 0.1.4, 0.1.5 |
wot-api | npm | 0.8.1, 0.8.2, 0.8.4 |
ml-toolkit-ts | npm | 1.0.4, 1.0.5 |
@beproduct/nestjs-auth | npm | 0.1.2 - 0.1.19 |
@dirigible-ai/sdk | npm | 0.6.2, 0.6.3 |
@taskflow-corp/cli | npm | 0.1.24 - 0.1.29 |
@tolka/cli | npm | 1.0.2, 1.0.3, 1.0.4, 1.0.6 |
@supersurkhet/cli | npm | 0.0.2 - 0.0.7 |
guardrails-ai | pypi | 0.10.1 |