
CLI-сканер без зависимостей для выявления компрометаций цепочки поставок npm/PyPI. Обнаруживает скомпрометированные пакеты в lock-файлах и системные индикаторы компрометации (IOC) от таких атак, как Mini Shai-Hulud (CVE-2026-45321).
CLI-сканер без зависимостей для выявления компрометаций цепочек поставок npm и PyPI.
11 мая 2026 года самовоспроизводящийся червь цепочки поставок под названием Mini Shai-Hulud (CVE-2026-45321, GHSA-g7cv-rxg3-hmpx) скомпрометировал экосистему npm. Приписываемый группе TeamPCP (также известной как DeadCatx3, PCPcat, ShellForce, CipherForce), вредонос похищал OIDC-токены GitHub Actions для публикации вредоносных пакетов с действительной провенанс-информацией SLSA Build Level 3. Он похищал учётные данные из CI/CD-пайплайнов, облачных провайдеров и криптовалютных кошельков, а также устанавливал хуки персистентности в Claude Code и VS Code. Встроенный предохранительный механизм (dead-man switch) угрожал стереть домашний каталог пользователя, если npm-токены будут отозваны.
Затронутые пакеты включали TanStack router и start-пакеты, SDK Mistral AI, клиент OpenSearch, инструменты UiPath и десятки других. Поскольку атаки на цепочки поставок распространяются быстро, организациям нужен лёгкий и надёжный сканер, который можно запускать где угодно, не добавляя новые зависимости к собственной поверхности атаки.
package-lock.json, pnpm-lock.yaml, yarn.lock, bun.lock, bun.lockb, poetry.lock, Pipfile.lock и requirements.txtfs, 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
# or
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 "Supply chain findings detected"
exit 1
elif [ "$code" -eq 2 ]; then
echo "Scanner error"
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
| Format | Flag | Description |
|---|---|---|
| Text | (default) | Human-readable table of findings with severity, package name, version, and campaign details |
| JSON | --json | Structured JSON array of findings, suitable for ingestion into SIEMs or custom dashboards |
| SARIF | --sarif | OASIS SARIF 2.1.0 format for upload to GitHub Code Scanning, GitLab Secure, or other SARIF consumers |
Пример фрагмента 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"
}
]
| Code | Meaning |
|---|---|
| 0 | No compromised packages or IOCs detected |
| 1 | One or more findings detected |
| 2 | Runtime error (invalid path, unreadable lockfile, etc.) |
Когда обнаруживается новая атака на цепочку поставок, обновите src/db.ts:
CompromisedVersion[] с затронутыми пакетами и версиямиCampaign в массив CAMPAIGNS, включая идентификаторы CVE/GHSA, уровень серьёзности, описание, ссылки и IOC-индикаторыbuildLookup() автоматически пересоберёт карту поиска при следующем запускеПри использовании Bun шаг пересборки не требуется. Изменения в src/db.ts вступают в силу немедленно при запуске bun run src/cli.ts. Для npm-пакета выполните pnpm run build после редактирования.
Ноль зависимостей во время выполнения: сканер использует только встроенные модули Node.js/Bun. Он не загружает и не выполняет сторонний код во время работы, что исключает риск того, что сам сканер станет вектором компрометации.
pnpm в качестве пакетного менеджера: pnpm использует строгие lock-файлы, по умолчанию не выполняет lifecycle-скрипты и поддерживает контентно-адресуемое хранилище. Эти свойства уменьшают поверхность атаки по сравнению с другими пакетными менеджерами.
Рекомендуемые настройки .npmrc: для максимальной защиты при установке пакетов добавьте следующее в ваш проект или глобальный .npmrc:
ignore-scripts=true
engine-strict=true
Без сетевых запросов: shai-scan не отправляет данные наружу, не загружает сигнатуры и не требует API-ключ. Все данные о кампаниях поставляются вместе с пакетом.
Следующие пакеты и версии известны как скомпрометированные в CVE-2026-45321 (Mini Shai-Hulud Wave 4). Это репрезентативная выборка; полный список поддерживается в src/db.ts.