
Выделение ресурсов без ограничений или регулирования в компоненте загрузки весов HDF5 в Google Keras 3.0.0–3.13.0 на всех платформах позволяет удалённому злоумышленнику вызвать отказ в обслуживании (DoS) через исчерпание памяти и сбой интерпретатора Python с помощью специально созданного файла .keras
| Поле | Детали |
|---|---|
| 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) через huntr.dev / GHSA |
| Статус исправления | Объединено — PR #21880 |
Уязвимость типа «отказ в обслуживании» существует в компоненте загрузки весов HDF5 в Google Keras версий 3.0.0–3.13.0 на всех платформах. Уязвимость вызвана отсутствием какой-либо проверки или регулирования при обработке метаданных формы наборов данных HDF5, объявленных внутри архива .keras.
Формат 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, который отвечает за десериализацию тензоров весов модели из хранилищ HDF5, встроенных в архивы .keras.
| Метрика | Значение | Смысл |
|---|---|---|
| Attack Vector (AV) | Сетевой | Эксплуатируется удалённо через распространяемый файл модели |
| Attack Complexity (AC) | Низкая | Не требуются особые условия или состояния гонки |
| Attack Requirements (AT) | Нет | Не требуется предварительной конфигурации развёртывания |
| Privileges Required (PR) | Нет | Не требуется аутентификация или учётная запись |
| User Interaction (UI) | Пассивное | Жертва должна загрузить вредоносный архив .keras |
| Vulnerable System Availability (VA) | Высокий | Интерпретатор Python аварийно завершается; сервис становится полностью недоступным |
| Vulnerable System Confidentiality (VC) | Нет | Утечки данных нет |
| Vulnerable System Integrity (VI) | Нет | Изменения данных нет |
| Subsequent System Impact (SC/SI/SA) | Нет | Воздействие ограничено процессом загрузки |
.keras из недоверенных источников или источников, предоставленных пользователями| Контекст | Риск |
|---|---|
Публичные API обслуживания моделей, принимающие загружаемые пользователями файлы .keras | Атакующий обрушивает сервис инференса одним запросом |
| ML-платформы, размещающие загрузки моделей от сообщества (например, Hugging Face) | Отравленная модель вызывает DoS для любого исследователя, который скачает и загрузит её |
| Среды федеративного обучения | Злоумышленный участник распространяет специально созданный файл весов, чтобы обрушить координатор или узлы-пиры |
| CI/CD-конвейеры, загружающие контрольные точки моделей | Скомпрометированная или подменённая контрольная точка вызывает сбой конвейера и его недоступность |
| Чат-боты или NLP-сервисы, выполняющие горячую перезагрузку моделей во время выполнения | Один вредоносный запрос на перезагрузку выводит сервис из строя |
Формат файлов HDF5 хранит метаданные тензоров — включая объявления формы — отдельно от фактических байтов данных. Когда KerasFileEditor._extract_weights_from_store() встречает запись набора данных, он считывает объявленную форму и вызывает NumPy для предварительного выделения массива соответствующих размерностей, прежде чем считывать какие-либо данные с диска.
Поскольку форма является метаданными, минимальный файл HDF5 может объявлять форму, которая потребует петабайты памяти, при этом сам файл остаётся размером всего в несколько килобайт. Соотношение размера файла к размеру выделяемой памяти делает это высокоэффективной атакой с усилением.
Форма, такая как (1000000, 1000000, 1000000) с типом данных 32-разрядного float, потребовала бы приблизительно 4000 петабайт памяти. OS out-of-memory killer или аллокатор 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
Отсутствие какой-либо проверки shape перед вызовом np.zeros() является корневой причиной.
Эта информация предоставлена исключительно в образовательных и защитных целях. Не проводите тестирование против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
.keras# generate_shape_bomb.py
import h5py
import zipfile
import json
import os