
CVE-2026-9335: KerasFileEditor e load_weights seguono gli ExternalLinks di h5py, divulgando il contenuto arbitrario di file HDF5 locali in keras ≤ 3.14.0. Advisory + PoC verificati.
ExternalLink in KerasDue API pubbliche di Keras — keras.saving.KerasFileEditor e
keras.saving.load_weights / — leggono i membri dei gruppi HDF5 tramite
senza un controllo del tipo di link. h5py
/ durante l'indicizzazione, quindi un file ,
o fornito da un attaccante e contenente solo un link induce Keras a leggere il contenuto di
.
model.load_weightsExternalLinkSoftLink.weights.h5.h5.kerasKeras include già il controllo corretto (
safe_get_h5_group/safe_get_h5_datasetinsaving_lib.py) — questi due punti di ingresso semplicemente non lo chiamano.
| CVE | CVE-2026-9335 |
| Versioni affette | keras-team/keras ≤ 3.14.0 (PyPI) |
| Tipo | Path Traversal / Esposizione di informazioni (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 (Medio) |
| Impatto | Divulgazione di qualsiasi file HDF5 locale che la vittima può leggere |
| Vettore | La vittima apre/carica un file .weights.h5 / .h5 / .keras dannoso |
| Stato | Corretto in keras 3.15.0 (PR #22899 / #22900); validato su huntr (2026-05-22, manutentore hertschuh) |
| Segnalatore | Jonathan Paparo (jonathan-paparo) |
| Percorso | Descrizione |
|---|---|
advisory/CVE-2026-9335.md | Documentazione tecnica completa: causa principale, entrambi i punti, output del PoC, correzione |
poc/poc_file_editor.py | PoC 1 — KerasFileEditor segue un ExternalLink e divulga un h5 della vittima |
poc/poc_load_weights.py | PoC 2 — model.load_weights recupera i pesi di una vittima tramite ExternalLink |
poc/requirements.txt | Ambiente di riproduzione con versioni bloccate |
docs/timeline.md | Cronologia della divulgazione coordinata |
# keras/src/saving/saving_api.py (load_weights, ramo legacy .h5)
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 qui viene dereferenziato automaticamente da h5py
f["model_weights"] (e l'analoga scansione data[key] in file_editor.py)
segue in modo trasparente un link verso un altro file. Il pattern sicuro che Keras usa
altrove verifica prima il tipo di link:
# 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 divulga il contenuto di un file h5 separato della vittima
KERAS_BACKEND=jax python poc/poc_file_editor.py
# PoC 2 — model.load_weights carica i pesi di un file della vittima tramite un ExternalLink
KERAS_BACKEND=jax python poc/poc_load_weights.py
Ogni PoC crea i propri file h5 "vittima" e "attaccante" usa-e-getta nella directory
temporanea di sistema, dimostra la divulgazione, stampa
*** VULNERABILITY CONFIRMED *** e si pulisce da solo. Verificato su
keras==3.14.0, Python 3.12.6, backend JAX.
Instradare entrambi i punti attraverso l'helper esistente safe_get_h5_group, oppure aggiungere
un pre-controllo data.get(key, default=None, getclass=True, getlink=True) che rifiuti
(h5py.ExternalLink, h5py.SoftLink) prima dell'indicizzazione. Consultare la
documentazione per i diff esatti.
Questo materiale è pubblicato per scopi difensivi ed educativi dopo la divulgazione coordinata e l'assegnazione del CVE. I PoC operano solo su file che creano essi stessi in una directory temporanea. Non utilizzare queste tecniche contro sistemi o dati che non sei autorizzato a testare.
Scoperto e segnalato da Jonathan Paparo (huntr:
jonathan-paparo). Validato dal
manutentore di keras-team hertschuh.