
Detección de amenazas en la cadena de suministro de npm/PyPI en tiempo real. Análisis de cadenas de comportamiento, escaneo de AST, fuentes de IOC y motor de puntuación compuesta.
Instalación | Uso | Características | VS Code | CI/CD
Los ataques a la cadena de suministro de npm y PyPI se están disparando. Shai-Hulud comprometió más de 25 000 repositorios en 2025. Las herramientas existentes detectan amenazas, pero no te ayudan a responder.
MUAD'DIB combina 22 escáneres en paralelo (277 reglas de detección), un motor de desofuscación, análisis de flujo de datos entre módulos, puntuación compuesta (21 reglas compuestas) y un sandbox gVisor/Docker para detectar amenazas conocidas y patrones de comportamiento sospechosos en paquetes npm y PyPI. En el código base existe un clasificador XGBoost, pero actualmente está inactivo (consulta Evaluación).
MUAD'DIB es un escáner de cadena de suministro gratuito, abierto y totalmente auditable para npm y PyPI. Detecta amenazas conocidas (más de 225 000 IOCs), RCE en tiempo de instalación, flujos de exfiltración tras robo de credenciales, payloads ofuscados y otros patrones de comportamiento sospechosos — localmente, sin telemetría.
Está licenciado bajo AGPL-3.0; hay una licencia comercial disponible para organizaciones que necesiten integrarlo en un producto propietario o ejecutarlo como un servicio alojado cerrado (consulta Licencia).
Deliberadamente no intenta hacerlo todo — consulta Alcance para ver exactamente qué detecta y qué no.
Detecta (npm y PyPI): paquetes maliciosos conocidos (coincidencia de IOC por nombre + SHA256), typosquatting, RCE en tiempo de instalación (scripts de ciclo de vida preinstall/postinstall, curl | sh, en el momento del import en Python, binding.gyp), lectura de credenciales y posterior exfiltración por red (dentro y entre archivos), payloads ofuscados / de alta entropía / de stub loaders, droppers binarios (chmod +x + exec/spawn) y marcadores de evasión anti-análisis.
Fuera del alcance: ataques solo de navegador (DOM/window, sin API de Node.js), el contenido de binarios nativos / WASM (sin análisis binario), paquetes desconocidos de día cero (el feed de IOCs es reactivo) y ecosistemas que no son npm/PyPI (RubyGems, Maven, Go). Un fingerprinting anti-sandbox determinado y los payloads remotos de múltiples etapas son riesgos conocidos de falsos negativos. Detalle completo: Modelo de amenazas.
Sin telemetría. Tu código y los resultados de los escaneos nunca salen de tu máquina — MUAD'DIB solo descarga feeds de inteligencia de amenazas (muaddib update) y, para la puntuación, lee metadatos públicos del registro de npm. Las alertas por webhook son opcionales (opt-in).
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
Escanea las dependencias tanto de npm (package.json, node_modules) como de Python (requirements.txt, setup.py, pyproject.toml).
muaddib
muaddib install <package>
muaddib install lodash axios --save-dev
muaddib install suspicious-pkg --force # Force install despite threats
Escanea los paquetes en busca de amenazas ANTES de instalarlos. Bloquea paquetes maliciosos conocidos.
Cada escaneo muestra una puntuación de riesgo de 0 a 100:
[SCORE] 58/100 [***********---------] HIGH
muaddib scan . --explain
Muestra el ID de la regla, la técnica MITRE ATT&CK, las referencias y el manual de respuesta para cada detección.
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 # Fail only on CRITICAL
muaddib scan . --fail-on high # Fail on HIGH and CRITICAL (default)
muaddib scan . --paranoid
Detección ultraestricta con menor tolerancia. Detecta cualquier acceso a la red, ejecución de subprocesos, evaluación dinámica de código y acceso a archivos sensibles.
muaddib scan . --webhook "https://discord.com/api/webhooks/..."
Filtrado estricto (v2.1.2): alertas solo para coincidencias de IOC, amenazas confirmadas por sandbox o exfiltración de tokens canary. Triaje por prioridad (v2.10.21): P1 (rojo, IOC/sandbox/canary), P2 (naranja, puntuación alta/compuestos), P3 (amarillo, el resto).
muaddib scan . --temporal-full # All 4 temporal features
muaddib scan . --temporal # Sudden lifecycle script detection
muaddib scan . --temporal-ast # AST diff between versions
muaddib scan . --temporal-publish # Publish frequency anomaly
muaddib scan . --temporal-maintainer # Maintainer change detection
Detecta ataques a la cadena de suministro antes de que aparezcan en las bases de datos de IOCs mediante el análisis de los cambios entre versiones de paquetes. Consulta Metodología de evaluación para más detalles.
muaddib sandbox <package-name>
muaddib sandbox <package-name> --strict
Análisis dinámico en un contenedor Docker aislado: strace, tcpdump, diff del sistema de archivos, tokens canary, entorno consciente de CI y precarga mediante monkey-patching para la detección de bombas de tiempo (múltiples ejecuciones en desplazamientos de [0h, 72h, 7d]).
muaddib watch . # Real-time monitoring
muaddib daemon # Daemon mode (auto-scan npm install)
muaddib update # Update IOCs (fast, ~5s)
muaddib scrape # Full IOC refresh (~5min)
muaddib diff HEAD~1 # Compare threats with previous commit
muaddib init-hooks # Pre-commit hooks (husky/pre-commit/git)
muaddib scan . --breakdown # Explainable score decomposition
muaddib replay # Ground truth validation (90/94 TPR@3, v2.11.48)
Todas las reglas (272 REGLAS + 5 PARANOID) están mapeadas a técnicas de MITRE ATT&CK. Consulta SECURITY.md para la referencia completa de reglas.
La extensión de VS Code escanea automáticamente tus proyectos npm.
code --install-extension dnszlsk.muaddib-vscode
MUAD'DIB: Scan Project - Escanear todo el proyectoMUAD'DIB: Scan Current File - Escanear el archivo actualmuaddib.autoScan, muaddib.webhookUrl, muaddib.failLevelConsulta vscode-extension/README.md para la documentación completa.
name: Security Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
permissions:
security-events: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: DNSZLSK/muad-dib@v1
with:
path: '.'
fail-on: 'high'
sarif: 'results.sarif'
muaddib init-hooks # Auto-detect (husky/pre-commit/git)
muaddib init-hooks --type husky # Force husky
muaddib init-hooks --mode diff # Only block NEW threats
Con el framework pre-commit:
repos:
- repo: https://github.com/DNSZLSK/muad-dib
rev: v2.11.139
hooks:
- id: muaddib-scan
Última medición: v2.11.48 (2026-05-26), solo reglas (el clasificador ML está inactivo — ver más abajo). Verdad fundamental: 94 ataques reales dentro del alcance + 200 npm aleatorios + 124 PyPI + 107 adversariales/holdout.
Clasificador ML: inactivo. Hay un modelo XGBoost en src/ml/, pero nunca está conectado a muaddib scan y, desde 2026-04-08, se ejecuta en modo LOG-ONLY en el monitor (el modelo entrenado colapsó y está pendiente de reentrenamiento). Todos los números anteriores corresponden solo a reglas.
Protocolo completo, historial por pista, la advertencia del límite de 35 en PyPI, la cobertura operativa (denominada en GHSA) y la metodología de reentrenamiento del ML: Metodología de evaluación.
Edita los archivos YAML en iocs/:
- 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 está licenciado bajo GNU Affero General Public License v3.0 only (AGPL-3.0-only) — consulta LICENSE y NOTICE.
Eres libre de usarlo, estudiarlo, modificarlo y redistribuirlo — incluso a través de una red — siempre que las obras derivadas y las modificaciones desplegadas en red se publiquen bajo la misma licencia.
Licencia comercial: para integrar MUAD'DIB en un producto propietario / de código cerrado, u ofrecerlo como un servicio alojado sin las obligaciones de divulgación del código fuente del AGPL, hay disponible una licencia comercial independiente. Abre un issue o ponte en contacto con el autor (DNSZLSK).
Copyright (C) 2026 DNSZLSK.
La especia debe fluir. Los gusanos deben morir.
| Escáner | Detección |
|---|
| Análisis AST (acorn) | eval, Function, robo de credenciales, droppers binarios, hooks de prototipo |
| Coincidencia de patrones | Comandos de shell, reverse shells, interruptor de hombre muerto |
| Análisis de flujo de datos | Lectura de credenciales + envío por red (dentro y entre archivos) |
| Detección de ofuscación | Patrones de ofuscación JS (omitir .min.js) |
| Preprocesamiento de desofuscación | Concatenación de strings, charcode, base64, array hexadecimal, propagación de constantes |
| Flujo de datos entre módulos | Propagación de taint entre archivos (cadenas de 3 saltos, métodos de clase) |
| Coherencia de intención | Emparejamiento fuente-sumidero dentro del archivo (credenciales + eval/red) |
| Typosquatting | npm + PyPI (distancia de Levenshtein) |
| Escáner de Python | requirements.txt, setup.py, pyproject.toml, más de 14 000 IOCs de PyPI |
| Entropía de Shannon | Strings de alta entropía (mínimo 5.5 bits + 50 caracteres) |
| Escáner de configuración de IA | Inyección en .cursorrules, CLAUDE.md, copilot-instructions.md |
| Paquetes/Dependencias | Scripts de ciclo de vida, coincidencia de IOCs (más de 225 000 paquetes) |
| Acciones de GitHub | Detección de backdoors de Shai-Hulud |
| Escáner de hashes | Hashes de archivos maliciosos conocidos |
| Strings de IOC (intel-triage P1.1) | Coincidencia de strings estilo YARA (Axios 2026, TeamPCP, GlassWorm, CanisterSprawl) |
| AST anti-forense (intel-triage P1.2) | Compuesto de bucle XOR + autoborrado + escritura señuelo (autoborrado csec) |
| Paquete stub (intel-triage P1.3) | Archivo principal diminuto + URL de dependencia externa + hook de ciclo de vida (cadena ltidi) |
| Escáner de monorepos | Detección de Lerna/pnpm-workspace/turbo (corrección MR-C2 de la auditoría del Sprint 1) |
| Diff de dependencias de confianza (opt-in) | Diff contra tarballs de dependencias de confianza del registro (v2.10.x) |
| Código fuente de Python (PYSRC) | Patrones de RCE en tiempo de import/instalación en __init__.py / setup.py (v2.11.41 — cierra la brecha de TrapDoor en PyPI) |
| AST de Python (PYAST) | AST de Tree-sitter-Python con detectores conscientes de taint (v2.11.42+) |
| Inyección anti-escáner (ASI) | Texto de inyección de prompts en comentarios/strings que coacciona a un revisor de código LLM para que dé un veredicto limpio u omita un payload ofuscado (ASI-001..004, campaña Hades 2026-06) |
| Campaña | Estado |
|---|
| GlassWorm (2026, más de 433 paquetes) | Detectada |
| Shai-Hulud v1/v2/v3 (2025) | Detectada |
| event-stream (2018) | Detectada |
| eslint-scope (2018) | Detectada |
| Protestware (node-ipc, colors, faker) | Detectada |
| Typosquats (crossenv, mongose, babelcli) | Detectada |
| Entrada | Descripción | Valor por defecto |
|---|
path | Ruta a escanear | . |
fail-on | Severidad mínima para fallar | high |
sarif | Ruta del archivo de salida SARIF | |
paranoid | Detección ultraestricta | false |
| Métrica | Resultado |
|---|
| Tasa de detección (TPR@3) | 95.74% (90/94) |
| Tasa de alertas (TPR@20) | 88.30% (83/94) |
| FPR — npm seleccionado (548) | 1.10% (6/545) |
| FPR — npm aleatorio (200) | 2.50% (5/200) |
| FPR — PyPI (132) | 9.68% (12/124) |
| ADR — adversarial + holdout | 96.26% (103/107) |
| TPR en el mundo real (Datadog 17K) | 92.8% (13,538/14,587) |