
Demonstração do CVE-2025-62518: uma vulnerabilidade crítica de substituição do tamanho do cabeçalho estendido PAX em tokio-tar e bibliotecas tar assíncronas em Rust, com ferramentas de reprodução e análise do raio de impacto.

Este repositório demonstra um bug crítico em tokio-tar e bibliotecas Rust async relacionadas de tar, onde as substituições de size do cabeçalho estendido PAX não são aplicadas antes de calcular a posição do próximo cabeçalho.
Causa raiz: Ao processar arquivos tar com cabeçalhos estendidos PAX que substituem o tamanho do arquivo, a biblioteca usa o campo de tamanho octal (frequentemente zero) em vez da substituição PAX para cálculos de posição.
Impacto: Isso faz com que o analisador salte para o conteúdo do arquivo e o confunda com cabeçalhos tar, levando à extração de arquivos errados.
Bibliotecas afetadas conhecidas:
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
Isso irá:
build/output/├── disclosure/ # Security disclosure documentation tree
│ └── blast_radius/ # Record of projects depending on tokio-tar variants
├── repro_generator/ # C++ tool to generate a repro case tar file
├── tar-bug-detector/ # Rust tool comparing tar libraries
├── tarwalk/ # Correct C++ tar parser
│ ├── tarwalk.cpp # Handles PAX correctly
│ └── tarwalk_bad.cpp # Reproduces the same bug
├── CMakeLists.txt # Build system
├── generate_report.cmake # Report generation
└── README.md # This file
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!
O Docker save cria arquivos tar com:
etc/, usr/)pax_bug_compact.tar - Caso de reprodução mínimoBibliotecas corretas (GNU tar, crate tar síncrono):
normal.txt -> blob.bin -> marker.txt
Bibliotecas com bug (tokio-tar):
normal.txt -> blob.bin -> INNER_FILE -> marker.txt
O aparecimento de INNER_FILE indica o bug - a biblioteca saltou para o conteúdo de blob.bin e confundiu um cabeçalho tar falso com uma entrada real.
A correção exige aplicar as substituições PAX antes dos cálculos de posição:
// 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);
Este código de reprodução é fornecido para fins de pesquisa em segurança e divulgação responsável.
Consulte COPYING para a licença do código-fonte original.