
Demostración de CVE-2025-62518: un fallo crítico de anulación del tamaño de la cabecera extendida PAX en tokio-tar y las bibliotecas tar asíncronas de Rust, con herramientas de reproducción y análisis del radio de impacto.

Este repositorio demuestra un error crítico en tokio-tar y en bibliotecas Rust asíncronas de tar relacionadas, donde las sobrescrituras de size en las cabeceras extendidas PAX no se aplican antes de calcular la posición de la siguiente cabecera.
Causa raíz: Al procesar archivos tar con cabeceras extendidas PAX que sobrescriben el tamaño del archivo, la biblioteca utiliza el campo de tamaño octal (a menudo cero) en lugar de la sobrescritura PAX para los cálculos de posición.
Impacto: Esto provoca que el analizador salte al contenido del archivo y lo confunda con cabeceras tar, lo que lleva a la extracción de archivos incorrectos.
Bibliotecas afectadas conocidas:
async-tar https://github.com/dignifiedquire/async-tartokio-tar https://github.com/vorot93/tokio-tarkrata-tokio-tar astral-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
Esto:
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!
Docker save crea archivos tar con:
etc/, usr/)pax_bug_compact.tar - Caso de reproducción mínimoBibliotecas correctas (GNU tar, crate tar síncrono):
normal.txt -> blob.bin -> marker.txt
Bibliotecas con el error (tokio-tar):
normal.txt -> blob.bin -> INNER_FILE -> marker.txt
La aparición de INNER_FILE indica el error: la biblioteca saltó al contenido de blob.bin y confundió una cabecera tar falsa con una entrada real.
La corrección requiere aplicar las sobrescrituras PAX antes de los cálculos de posición:
// 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 reproducción se proporciona con fines de investigación de seguridad y divulgación responsable.
Consulte COPYING para conocer la licencia del código fuente original.