
CVE-2026-9335 : KerasFileEditor et load_weights suivent les ExternalLinks de h5py, divulguant le contenu arbitraire de fichiers HDF5 locaux dans keras ≤ 3.14.0. Avis + PoCs vérifiés.
ExternalLink HDF5 dans KerasDeux API publiques de Keras — keras.saving.KerasFileEditor et
keras.saving.load_weights / — lisent les membres de groupes HDF5 par
sans vérification du type de lien. h5py
les / lors de l'indexation, de sorte qu'un fichier ,
ou fourni par un attaquant et ne contenant qu'un lien amène Keras à lire le contenu
de .
model.load_weightsExternalLinkSoftLink.weights.h5.h5.kerasKeras fournit déjà la protection correcte (
safe_get_h5_group/safe_get_h5_datasetdanssaving_lib.py) — ces deux points d'entrée ne l'appellent simplement pas.
| CVE | CVE-2026-9335 |
| Versions affectées | keras-team/keras ≤ 3.14.0 (PyPI) |
| Type | Traversée de chemin / Exposition d'informations (CWE-22, CWE-200) |
| CVSS 3.1 | AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N → 6.5 (Moyen) |
| Impact | Divulgation de tout fichier HDF5 local que la victime peut lire |
| Vecteur | La victime ouvre/charge un fichier .weights.h5 / .h5 / .keras malveillant |
| Statut | Corrigé dans keras 3.15.0 (PR #22899 / #22900) ; validé sur huntr (2026-05-22, mainteneur hertschuh) |
| Signaleur | Jonathan Paparo (jonathan-paparo) |
| Chemin | Description |
|---|---|
advisory/CVE-2026-9335.md | Analyse technique complète : cause racine, les deux sites, sortie du PoC, correctif |
poc/poc_file_editor.py | PoC 1 — KerasFileEditor suit un ExternalLink et divulgue un h5 de la victime |
poc/poc_load_weights.py | PoC 2 — model.load_weights récupère les poids d'une victime via ExternalLink |
poc/requirements.txt | Environnement de reproduction épinglé |
docs/timeline.md | Chronologie de la divulgation coordonnée |
# keras/src/saving/saving_api.py (load_weights, branche .h5 héritée)
with h5py.File(filepath, "r") as f:
if "layer_names" not in f.attrs and "model_weights" in f:
f = f["model_weights"] # <-- Un ExternalLink ici est automatiquement déréférencé par h5py
f["model_weights"] (et la traversée analogue data[key] dans file_editor.py)
suit de manière transparente un lien vers un autre fichier. Le modèle sûr que Keras utilise
ailleurs vérifie d'abord le type de lien :
# keras/src/saving/saving_lib.py (safe_get_h5_group)
group_type = parent.get(name, default=None, getclass=True, getlink=True)
if group_type in (h5py.ExternalLink, h5py.SoftLink):
raise ValueError(f"Not allowed: H5 file with {group_type.__name__}")
python -m pip install -r poc/requirements.txt
# PoC 1 — KerasFileEditor divulgue le contenu d'un fichier h5 séparé de la victime
KERAS_BACKEND=jax python poc/poc_file_editor.py
# PoC 2 — model.load_weights charge les poids d'un fichier de la victime via un ExternalLink
KERAS_BACKEND=jax python poc/poc_load_weights.py
Chaque PoC crée ses propres fichiers h5 jetables « victime » et « attaquant » dans le
répertoire temporaire du système, démontre la fuite, affiche
*** VULNERABILITY CONFIRMED ***, puis se nettoie. Vérifié avec
keras==3.14.0, Python 3.12.6, backend JAX.
Acheminer les deux sites via l'assistant existant safe_get_h5_group, ou ajouter une
vérification préalable data.get(key, default=None, getclass=True, getlink=True) qui rejette
(h5py.ExternalLink, h5py.SoftLink) avant l'indexation. Voir
l'advisory pour les diffs exacts.
Ce matériel est publié à des fins défensives et éducatives après divulgation coordonnée et attribution du CVE. Les PoC n'opèrent que sur des fichiers qu'ils créent eux-mêmes dans un répertoire temporaire. N'utilisez pas ces techniques contre des systèmes ou des données que vous n'êtes pas autorisé à tester.
Découvert et signalé par Jonathan Paparo (huntr :
jonathan-paparo). Validé par
le mainteneur de keras-team hertschuh.