
Escáner CLI sin dependencias para compromisos en la cadena de suministro de npm/PyPI. Detecta paquetes comprometidos en lockfiles e IOCs a nivel de sistema de ataques como Mini Shai-Hulud (CVE-2026-45321).
Escáner CLI sin dependencias para compromisos en la cadena de suministro de npm y PyPI.
El 11 de mayo de 2026, un gusano de cadena de suministro autopropagante denominado Mini Shai-Hulud (CVE-2026-45321, GHSA-g7cv-rxg3-hmpx) comprometió el ecosistema de npm. Atribuido a TeamPCP (también conocido como DeadCatx3, PCPcat, ShellForce, CipherForce), el malware secuestró tokens OIDC de GitHub Actions para publicar paquetes maliciosos con procedencia válida de SLSA Build Level 3. Robó credenciales de pipelines CI/CD, proveedores de nube y billeteras de criptomonedas, e instaló hooks de persistencia en Claude Code y VS Code. Un interruptor de seguridad incorporado amenazaba con borrar el directorio home del usuario si los tokens npm eran revocados.
Los paquetes afectados incluyeron TanStack router y start packages, Mistral AI SDKs, OpenSearch client, UiPath tooling y decenas de otros. Debido a que los ataques a la cadena de suministro avanzan rápido, las organizaciones necesitan un escáner ligero y confiable que puedan ejecutar en cualquier lugar sin agregar nuevas dependencias a su propia superficie de ataque.
package-lock.json, pnpm-lock.yaml, yarn.lock, bun.lock, bun.lockb, poetry.lock, Pipfile.lock y requirements.txtfs, path, child_process, os). El escáner no aumenta el riesgo de su cadena de suministroNo se requiere instalación. Ejecute directamente con su gestor de paquetes preferido:
# npx
npx @digi4care/shai-scan
# bunx
bunx @digi4care/shai-scan
# pnpm dlx
pnpm dlx @digi4care/shai-scan
Instalación global (opcional):
npm install -g @digi4care/shai-scan
# o
pnpm add -g @digi4care/shai-scan
Desde el código fuente:
git clone https://github.com/digi4care/shai-scan.git
cd shai-scan
pnpm install
bun run src/cli.ts --help # Bun (recomendado para desarrollo)
# o compile y ejecute con 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 "Hallazgos en la cadena de suministro detectados"
exit 1
elif [ "$code" -eq 2 ]; then
echo "Error del escáner"
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
| Formato | Bandera | Descripción |
|---|---|---|
Ejemplo de extracto 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"
}
]
| Código | Significado |
|---|---|
| 0 | No se detectaron paquetes comprometidos ni IOC |
| 1 | Se detectaron uno o más hallazgos |
| 2 | Error en tiempo de ejecución (ruta inválida, lockfile ilegible, etc.) |
Cuando se descubra un nuevo ataque a la cadena de suministro, actualice src/db.ts:
CompromisedVersion[] con los paquetes y versiones afectadosCampaign al arreglo CAMPAIGNS, incluyendo identificadores CVE/GHSA, gravedad, descripción, URL de referencia e indicadores IOCbuildLookup() reconstruye automáticamente el mapa de búsqueda en la siguiente ejecuciónNo se requiere un paso de recompilación cuando se usa Bun. Los cambios en src/db.ts surten efecto inmediatamente con bun run src/cli.ts. Para el paquete npm, ejecute pnpm run build después de editar.
Cero dependencias en tiempo de ejecución: El escáner utiliza solo módulos incorporados de Node.js/Bun. No descarga ni ejecuta código de terceros en tiempo de ejecución, eliminando el riesgo de que el propio escáner se convierta en un vector de compromiso.
pnpm como gestor de paquetes: pnpm utiliza lockfiles estrictos, no ejecuta scripts de ciclo de vida por defecto y admite almacenamiento direccionable por contenido. Estas propiedades reducen la superficie de ataque en comparación con otros gestores de paquetes.
Configuración recomendada de .npmrc: Para máxima protección al instalar paquetes, agregue lo siguiente a su .npmrc de proyecto o global:
ignore-scripts=true
engine-strict=true
Sin llamadas de red: shai-scan no se comunica con servidores externos, no descarga firmas ni requiere una clave API. Todos los datos de campaña se distribuyen con el paquete.
Se sabe que los siguientes paquetes y versiones están comprometidos en CVE-2026-45321 (Mini Shai-Hulud Wave 4). Esta es un subconjunto representativo; la lista completa se mantiene en src/db.ts.
MIT. Consulte LICENSE para más detalles.
shai-scan es una ayuda de detección, no un sustituto de auditorías de seguridad integrales, revisión de dependencias o plataformas de inteligencia de amenazas. Identifica versiones comprometidas conocidas basándose en la base de datos incluida; los ataques nuevos o de día cero a la cadena de suministro pueden no ser detectados hasta que se agregue una campaña. Practique siempre la defensa en profundidad: audite dependencias, fije versiones, verifique la procedencia y supervise los pipelines CI/CD.
0 = limpio, 1 = hallazgos, 2 = error)src/db.ts; actualice el archivo y vuelva a ejecutar| Texto |
| (predeterminado) |
| Tabla legible para humanos con gravedad, nombre del paquete, versión y detalles de la campaña |
| JSON | --json | Arreglo JSON estructurado de hallazgos, adecuado para ingestión en SIEM o paneles personalizados |
| SARIF | --sarif | Formato OASIS SARIF 2.1.0 para carga en GitHub Code Scanning, GitLab Secure u otros consumidores SARIF |
| Paquete | Ecosistema | Versiones comprometidas |
|---|
@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 |