
CVE-2026-9335: KerasFileEditor und load_weights folgen h5py-ExternalLinks und legen so beliebige lokale HDF5-Dateiinhalte in keras ≤ 3.14.0 offen. Advisory + verifizierte PoCs.
ExternalLink Offenlegung lokaler DateiinhalteZwei öffentliche Keras-APIs — keras.saving.KerasFileEditor und
keras.saving.load_weights / — lesen HDF5-Gruppenmitglieder per
ohne Linktyp-Prüfung. h5py
/ beim Indizieren, sodass eine vom Angreifer bereitgestellte
-, - oder -Datei, die nur einen Link enthält, Keras dazu
veranlasst, die Inhalte
zu lesen.
model.load_weightsExternalLinkSoftLink.weights.h5.h5.kerasKeras enthält bereits den korrekten Schutz (
safe_get_h5_group/safe_get_h5_datasetinsaving_lib.py) — diese beiden Einstiegspunkte rufen ihn lediglich nicht auf.
| CVE | CVE-2026-9335 |
| Betroffen | keras-team/keras ≤ 3.14.0 (PyPI) |
| Typ | Pfad-Traversal / Informationsoffenlegung (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 (Mittel) |
| Auswirkung | Offenlegung beliebiger lokaler HDF5-Dateien, die das Opfer lesen kann |
| Vektor | Opfer öffnet/lädt eine bösartige .weights.h5- / .h5- / .keras-Datei |
| Status | Behoben in keras 3.15.0 (PR #22899 / #22900); validiert auf huntr (22.05.2026, Maintainer hertschuh) |
| Melder | Jonathan Paparo (jonathan-paparo) |
| Pfad | Was es ist |
|---|---|
advisory/CVE-2026-9335.md | Vollständige technische Dokumentation: Grundursache, beide Stellen, PoC-Ausgabe, Fix |
poc/poc_file_editor.py | PoC 1 — KerasFileEditor folgt einem ExternalLink und gibt eine Opfer-h5-Datei preis |
poc/poc_load_weights.py | PoC 2 — model.load_weights zieht Gewichte eines Opfers über ExternalLink |
poc/requirements.txt | Fixierte Reproduktionsumgebung |
docs/timeline.md | Zeitplan der koordinierten Offenlegung |
# keras/src/saving/saving_api.py (load_weights, legacy .h5 branch)
with h5py.File(filepath, "r") as f:
if "layer_names" not in f.attrs and "model_weights" in f:
f = f["model_weights"] # <-- ExternalLink hier wird von h5py automatisch dereferenziert
f["model_weights"] (und der analoge data[key]-Durchlauf in file_editor.py)
folgt transparent einem Link in eine andere Datei. Das sichere Muster, das Keras
anderswo verwendet, prüft den Linktyp zuerst:
# 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 gibt die Inhalte einer separaten Opfer-h5-Datei preis
KERAS_BACKEND=jax python poc/poc_file_editor.py
# PoC 2 — model.load_weights lädt die Gewichte einer Opferdatei über einen ExternalLink
KERAS_BACKEND=jax python poc/poc_load_weights.py
Jeder PoC erstellt seine eigenen Wegwerf-„Opfer“- und „Angreifer“-h5-Dateien im
System-Temp-Verzeichnis, demonstriert das Leck, gibt
*** VULNERABILITY CONFIRMED *** aus und räumt anschließend selbst auf. Verifiziert mit
keras==3.14.0, Python 3.12.6, JAX-Backend.
Leiten Sie beide Stellen durch den vorhandenen safe_get_h5_group-Helfer oder fügen
Sie eine data.get(key, default=None, getclass=True, getlink=True)-Vorprüfung hinzu,
die (h5py.ExternalLink, h5py.SoftLink) vor dem Indizieren ablehnt. Siehe die
Advisory für exakte Diffs.
Dieses Material wird nach koordinierter Offenlegung und CVE-Zuweisung zu defensiven und Bildungszwecken veröffentlicht. Die PoCs arbeiten nur mit Dateien, die sie selbst in einem Temp-Verzeichnis erstellen. Verwenden Sie diese Techniken nicht gegen Systeme oder Daten, deren Test Sie nicht autorisiert sind.
Entdeckt und gemeldet von Jonathan Paparo (huntr:
jonathan-paparo). Validiert vom
keras-team-Maintainer hertschuh.