
CVE-2025-62518: TARmageddon

Ce dépôt démontre un bogue critique dans tokio-tar et les bibliothèques Rust asynchrones tar associées, où les surcharges de taille des en-têtes étendus PAX ne sont pas appliquées avant de calculer la position de l'en-tête suivant.
Cause racine : lors du traitement de fichiers tar avec des en-têtes étendus PAX qui surchargent la taille du fichier, la bibliothèque utilise le champ de taille octal (souvent zéro) au lieu de la surcharge PAX pour les calculs de position.
Impact : cela amène l'analyseur à sauter dans le contenu du fichier et à le confondre avec des en-têtes tar, ce qui entraîne l'extraction de fichiers erronés.
Bibliothèques affectées connues :
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# Prérequis : CMake, Rust/Cargo, compilateur C++, commande système tar
cmake -S . -B build
cmake --build build --target generate_report
Cela va :
build/output/├── disclosure/ # Arborescence des documents de divulgation de sécurité
│ └── blast_radius/ # Enregistrement des projets dépendant des variantes de tokio-tar
├── repro_generator/ # Outil C++ pour générer un fichier tar de cas de reproduction
├── tar-bug-detector/ # Outil Rust comparant les bibliothèques tar
├── tarwalk/ # Analyseur C++ correct
│ ├── tarwalk.cpp # Gère PAX correctement
│ └── tarwalk_bad.cpp # Reproduit le même bogue
├── CMakeLists.txt # Système de construction
├── generate_report.cmake # Génération de rapport
└── README.md # Ce fichier
En-tête -> Contenu (taille du champ octal) -> En-tête suivant
En-tête PAX (taille=1024) -> En-tête de fichier (taille octale=0) -> Contenu (1024 octets) -> En-tête suivant
En-tête PAX (taille=1024) -> En-tête de fichier (taille octale=0) -> Contenu (0 octets) -> MAUVAISE POSITION
↓
Lecture du contenu comme des en-têtes !
docker save crée des fichiers tar avec :
etc/, usr/)pax_bug_compact.tar - Cas de reproduction minimalBibliothèques correctes (GNU tar, crate tar synchrone) :
normal.txt -> blob.bin -> marker.txt
Bibliothèques buggées (tokio-tar) :
normal.txt -> blob.bin -> INNER_FILE -> marker.txt
L'apparition de INNER_FILE indique le bogue - la bibliothèque a sauté dans le contenu de blob.bin et a confondu un faux en-tête tar avec une entrée réelle.
La correction nécessite d'appliquer les surcharges PAX avant les calculs de position :
// Lire l'en-tête
let mut file_size = header.size();
// Appliquer les surcharges PAX AVANT de calculer la position suivante
if let Some(pax_size) = pending_pax.get("size") {
file_size = pax_size.parse().unwrap();
}
// Calculer maintenant la position du prochain en-tête en utilisant la taille effective
let next_pos = current_pos + 512 + pad_to_512(file_size);
Ce code de reproduction est fourni à des fins de recherche en sécurité et de divulgation responsable.
Voir COPYING pour la licence du code source original.