
CVE-2025-62518: TARmageddon

이 저장소는 tokio-tar 및 관련 async Rust tar 라이브러리에서 PAX 확장 헤더의 size 재정의가 다음 헤더 위치를 계산하기 전에 적용되지 않는 치명적인 버그를 보여줍니다.
근본 원인: 파일 크기를 재정의하는 PAX 확장 헤더가 포함된 tar 파일을 처리할 때, 라이브러리는 위치 계산을 위해 PAX 재정의 대신 8진수 크기 필드(주로 0)를 사용합니다.
영향: 이로 인해 파서가 파일 내용으로 점프하여 이를 tar 헤더로 오인하게 되어 잘못된 파일이 추출됩니다.
알려진 영향 라이브러리:
async-tar https://github.com/dignifiedquire/async-tartokio-tar https://github.com/vorot93/tokio-tarkrata-tokio-tar https://github.com/edera-dev/tokio-tarastral-tokio-tar https://github.com/astral-sh/tokio-tar# Requirements: CMake, Rust/Cargo, C++ compiler, system tar command
cmake -S . -B build
cmake --build build --target generate_report
다음 작업을 수행합니다:
build/output/에 상세 보고서 생성├── disclosure/ # 보안 공개 문서 트리
│ └── blast_radius/ # tokio-tar 변형에 의존하는 프로젝트 기록
├── repro_generator/ # 재현 케이스 tar 파일을 생성하는 C++ 도구
├── tar-bug-detector/ # tar 라이브러리를 비교하는 Rust 도구
├── tarwalk/ # 올바른 C++ tar 파서
│ ├── tarwalk.cpp # PAX를 올바르게 처리
│ └── tarwalk_bad.cpp # 동일한 버그 재현
├── CMakeLists.txt # 빌드 시스템
├── generate_report.cmake # 보고서 생성
└── README.md # 이 파일
Header -> Content (size from octal field) -> Next Header
PAX Header (size=1024) -> File Header (octal size=0) -> Content (1024 bytes) -> Next Header
PAX Header (size=1024) -> File Header (octal size=0) -> Content (0 bytes) -> WRONG POSITION
↓
Reading content as headers!
Docker save는 다음과 같은 tar 파일을 생성합니다:
etc/, usr/)로 시작하는 레이어 콘텐츠pax_bug_compact.tar - 최소 재현 케이스올바른 라이브러리 (GNU tar, sync tar crate):
normal.txt -> blob.bin -> marker.txt
버그 있는 라이브러리 (tokio-tar):
normal.txt -> blob.bin -> INNER_FILE -> marker.txt
INNER_FILE의 출현은 버그를 나타냅니다. 라이브러리가 blob.bin 콘텐츠로 점프하여 가짜 tar 헤더를 실제 항목으로 오인한 것입니다.
수정 사항은 위치 계산 전에 PAX 재정의를 적용해야 합니다:
// Read header
let mut file_size = header.size();
// Apply PAX overrides BEFORE calculating next position
if let Some(pax_size) = pending_pax.get("size") {
file_size = pax_size.parse().unwrap();
}
// Now calculate next header position using effective size
let next_pos = current_pos + 512 + pad_to_512(file_size);
이 재현 코드는 보안 연구 및 책임 있는 공개 목적으로 제공됩니다.
원본 소스 코드 라이선스는 COPYING을 참조하십시오.