Ce qui se passe
CVE-2026-69112 vise Hugging Face Accelerate jusqu'à la 1.14.0 incluse.
Un modèle volumineux est livré en morceaux, et un fichier d'index —
model.safetensors.index.json ou pytorch_model.bin.index.json — décrit dans
sa table weight_map quel fichier contient quel tenseur.
Accelerate transmet ces noms de fichiers à l'ouverture sans les canoniser ni
vérifier qu'ils restent sous le dossier du checkpoint. Une valeur comme
../../../../etc/passwd est donc ouverte, et son contenu chargé comme s'il
s'agissait de poids. Un chemin absolu fonctionne également.
Les deux points d'entrée concernés sont load_checkpoint_in_model et
load_checkpoint_and_dispatch, c'est-à-dire les deux fonctions par
lesquelles passe le chargement d'un checkpoint découpé.
Second vecteur, plus discret : un tube nommé (FIFO). Sous Linux, l'ouverture
d'un FIFO bloque jusqu'à l'arrivée d'un écrivain. Une entrée weight_map qui
pointe vers un tube suspend indéfiniment le chargement — déni de service sans
aucune élévation de privilège.
Pourquoi ça compte
Accelerate n'est pas une bibliothèque de niche : elle s'intercale entre PyTorch et Transformers pour l'entraînement multi-GPU, la précision mixte et le découpage de modèle, et pèse environ 27 millions de téléchargements PyPI par mois. Elle est présente par transitivité dans quantité de piles où personne ne l'a installée volontairement.
Les situations réellement exposées sont celles où l'index vient d'ailleurs :
- serveurs d'inférence qui chargent un modèle depuis une URL ou un dépôt fourni par l'utilisateur ;
- chaînes d'intégration continue qui chargent un checkpoint produit par un artefact de pull request ;
- plateformes d'entraînement acceptant des modèles affinés par des contributeurs extérieurs.
Autrement dit : partout où le chemin du checkpoint n'est pas entièrement sous contrôle de l'application.
Ce qu'il faut faire
Vérifier d'abord la version installée :
pip show accelerateAucune version corrigée n'est publiée à ce jour. La validation est donc à écrire soi-même, en amont de l'appel à Accelerate :
import json
from pathlib import Path
def valider_index(chemin_index):
with open(chemin_index) as f:
index = json.load(f)
base = Path(chemin_index).resolve().parent
for tenseur, fichier in index.get("weight_map", {}).items():
cible = (base / fichier).resolve()
if not str(cible).startswith(str(base)):
raise ValueError(f"chemin hors du checkpoint : {tenseur} -> {fichier}")
return indexLe point important est resolve() : c'est lui qui écrase les .. avant la
comparaison. Un filtre sur la chaîne brute se contourne par encodage.
Source : HOL — CVE-2026-69112