
Alocação de recursos sem limites ou limitação de taxa no componente de carregamento de pesos HDF5 no Google Keras 3.0.0 até 3.13.0 em todas as plataformas permite que um atacante remoto cause uma Negação de Serviço (DoS) por meio de esgotamento de memória e uma falha do interpretador Python via um arquivo .keras maliciosamente criado.
| Campo | Detalhes |
|---|---|
| ID do CVE | CVE-2026-0897 |
| Pacote | keras (Google Keras) |
| Registro | PyPI |
| Versões Afetadas | 3.0.0 a 3.13.0 (inclusive) |
| Tipo de Vulnerabilidade | CWE-770: Alocação de Recursos Sem Limites ou Regulação |
| Pontuação CVSS | 7.1 Alta (CVSS 4.0, CNA: Google Inc.) |
| Vetor 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 |
| Vetor de Ataque | Rede |
| Complexidade do Ataque | Baixa |
| Privilégios Necessários | Nenhum |
| Interação do Usuário | Passiva (a vítima carrega um arquivo de modelo) |
| Impacto na Disponibilidade | Alto |
| Impacto na Confidencialidade | Nenhum |
| Impacto na Integridade | Nenhum |
| Publicado no NVD | 15 de janeiro de 2026 |
| Última Modificação no NVD | 23 de janeiro de 2026 |
| Fonte / CNA | Google Inc. |
| Relatado Por | HyperPS (Sarvesh Patil) via huntr.dev / GHSA |
| Status da Correção | Mesclado — PR #21880 |
Existe uma vulnerabilidade de Negação de Serviço no componente de carregamento de pesos HDF5 do Google Keras versões 3.0.0 a 3.13.0 em todas as plataformas. A vulnerabilidade é causada pela ausência de qualquer validação ou limitação ao processar metadados de forma de datasets HDF5 declarados dentro de um arquivo .keras.
O formato HDF5 permite que datasets declarem sua forma (dimensões do tensor) como metadados. Quando o Keras carrega pesos de modelo de um arquivo .keras, ele lê essa forma declarada e tenta alocar um bloco de memória correspondente antes que qualquer dado seja transferido. Como o Keras não realiza nenhuma verificação de limites na forma declarada antes da alocação, um atacante pode criar um arquivo model.weights.h5 que declara uma forma astronomicamente grande — por exemplo (1000000, 1000000, 1000000) — fazendo com que o Keras tente uma alocação de memória na escala de petabytes. Isso esgota toda a memória disponível do sistema e derruba o interpretador Python.
Nenhuma inferência ou interação adicional é necessária após o carregamento do modelo. O ataque é totalmente acionado no momento do carregamento.
| Arquivo | Descrição |
|---|---|
keras/src/saving/file_editor.py | KerasFileEditor._extract_weights_from_store() — lê a forma do dataset HDF5 e aloca memória sem validação de tamanho ou limitação |
A vulnerabilidade está localizada especificamente na classe KerasFileEditor, que é responsável por desserializar tensores de pesos de modelo a partir de armazenamentos HDF5 embutidos em arquivos .keras.
| Métrica | Valor | Significado |
|---|---|---|
| Vetor de Ataque (AV) | Rede | Explorável remotamente por meio de um arquivo de modelo distribuído |
| Complexidade do Ataque (AC) | Baixa | Nenhuma condição especial ou condição de corrida necessária |
| Requisitos de Ataque (AT) | Nenhum | Nenhuma configuração de implantação prévia necessária |
| Privilégios Necessários (PR) | Nenhum | Nenhuma autenticação ou conta necessária |
| Interação do Usuário (UI) | Passiva | A vítima deve carregar o arquivo .keras malicioso |
| Disponibilidade do Sistema Vulnerável (VA) | Alta | O interpretador Python falha; o serviço fica completamente indisponível |
| Confidencialidade do Sistema Vulnerável (VC) | Nenhum | Nenhuma divulgação de dados |
| Integridade do Sistema Vulnerável (VI) | Nenhum | Nenhuma modificação de dados |
| Impacto em Sistemas Subsequentes (SC/SI/SA) | Nenhum | O impacto está contido no processo de carregamento |
.keras de fontes não confiáveis ou fornecidas por usuários está vulnerável| Contexto | Risco |
|---|---|
APIs públicas de serviço de modelos que aceitam arquivos .keras enviados por usuários | O atacante derruba o serviço de inferência com uma única solicitação |
| Plataformas de ML que hospedam downloads comunitários de modelos (ex.: Hugging Face) | Um modelo envenenado causa DoS para qualquer pesquisador que o baixe e carregue |
| Ambientes de aprendizado federado | Um participante malicioso distribui um arquivo de pesos criado sob medida para derrubar o coordenador ou os nós pares |
| Pipelines de CI/CD que carregam checkpoints de modelo | Um checkpoint comprometido ou substituído causa falha e indisponibilidade do pipeline |
| Chatbots ou serviços de PLN que recarregam modelos em tempo de execução | Uma única solicitação maliciosa de recarga derruba o serviço |
O formato de arquivo HDF5 armazena metadados de tensor — incluindo declarações de forma — separadamente dos bytes de dados reais. Quando KerasFileEditor._extract_weights_from_store() encontra uma entrada de dataset, ele lê a forma declarada e chama o NumPy para pré-alocar um array com as dimensões correspondentes antes de ler qualquer dado do disco.
Como a forma é um metadado, um arquivo HDF5 mínimo pode declarar uma forma que exigiria petabytes de memória enquanto o próprio arquivo permanece com apenas alguns kilobytes de tamanho. A proporção entre o tamanho do arquivo e o tamanho da alocação torna isso um ataque de amplificação altamente eficaz.
Uma forma como (1000000, 1000000, 1000000) com um dtype float de 32 bits solicitaria aproximadamente 4.000 petabytes de memória. O out-of-memory killer do sistema operacional ou o alocador do Python derrubará o processo quase que instantaneamente.
# 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
A ausência de qualquer verificação em shape antes de chamar np.zeros() é a causa raiz.
Esta informação é fornecida apenas para fins educacionais e de defesa. Não teste em sistemas que você não possui ou para os quais não tem autorização explícita para testar.
.keras Malicioso# generate_shape_bomb.py
import h5py
import zipfile
import json
import os