
CVE-2026-9335: KerasFileEditor e load_weights seguem ExternalLinks do h5py, divulgando conteúdos arbitrários de arquivos HDF5 locais no keras ≤ 3.14.0. Aviso + PoCs verificados.
ExternalLink no KerasDuas APIs públicas do Keras — keras.saving.KerasFileEditor e
keras.saving.load_weights / — leem membros de grupos HDF5 por
sem verificação do tipo de link. O h5py
/ na indexação, portanto um arquivo ,
ou fornecido por um atacante contendo apenas um link faz com que o Keras leia o conteúdo
de .
model.load_weightsExternalLinkSoftLink.weights.h5.h5.kerasO Keras já inclui a proteção correta (
safe_get_h5_group/safe_get_h5_datasetemsaving_lib.py) — estes dois pontos de entrada simplesmente não a chamam.
| CVE | CVE-2026-9335 |
| Afetado | keras-team/keras ≤ 3.14.0 (PyPI) |
| Tipo | Path Traversal / Exposição de Informações (CWE-22, CWE-200) |
| CVSS 3.1 | AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N → 6.5 (Médio) |
| Impacto | Divulgação de qualquer arquivo HDF5 local que a vítima possa ler |
| Vetor | A vítima abre/carrega um arquivo malicioso .weights.h5 / .h5 / .keras |
| Status | Corrigido no keras 3.15.0 (PR #22899 / #22900); validado no huntr (2026-05-22, mantenedor hertschuh) |
| Relator | Jonathan Paparo (jonathan-paparo) |
| Caminho | O que é |
|---|---|
advisory/CVE-2026-9335.md | Documentação técnica completa: causa raiz, ambos os locais, saída do PoC, correção |
poc/poc_file_editor.py | PoC 1 — KerasFileEditor segue um ExternalLink e vaza um h5 da vítima |
poc/poc_load_weights.py | PoC 2 — model.load_weights puxa os pesos da vítima via ExternalLink |
poc/requirements.txt | Ambiente de reprodução fixado |
docs/timeline.md | Linha do tempo da divulgação coordenada |
# keras/src/saving/saving_api.py (load_weights, branch legado .h5)
with h5py.File(filepath, "r") as f:
if "layer_names" not in f.attrs and "model_weights" in f:
f = f["model_weights"] # <-- ExternalLink aqui é desreferenciado automaticamente pelo h5py
f["model_weights"] (e a varredura análoga data[key] em file_editor.py)
segue de forma transparente um link para outro arquivo. O padrão seguro que o Keras usa
em outros lugares verifica previamente o tipo de link:
# keras/src/saving/saving_lib.py (safe_get_h5_group)
group_type = parent.get(name, default=None, getclass=True, getlink=True)
if group_type in (h5py.ExternalLink, h5py.SoftLink):
raise ValueError(f"Not allowed: H5 file with {group_type.__name__}")
python -m pip install -r poc/requirements.txt
# PoC 1 — KerasFileEditor vaza o conteúdo de um arquivo h5 separado da vítima
KERAS_BACKEND=jax python poc/poc_file_editor.py
# PoC 2 — model.load_weights carrega os pesos de um arquivo da vítima via um ExternalLink
KERAS_BACKEND=jax python poc/poc_load_weights.py
Cada PoC cria seus próprios arquivos h5 descartáveis de "vítima" e "atacante" no
diretório temporário do sistema, demonstra o vazamento, imprime
*** VULNERABILITY CONFIRMED *** e se limpa ao final. Verificado em
keras==3.14.0, Python 3.12.6, backend JAX.
Direcione ambos os locais através do helper existente safe_get_h5_group, ou adicione uma
pré-verificação data.get(key, default=None, getclass=True, getlink=True) que rejeite
(h5py.ExternalLink, h5py.SoftLink) antes da indexação. Consulte o
advisory para os diffs exatos.
Este material é publicado para fins defensivos e educacionais após divulgação coordenada e atribuição de CVE. Os PoCs operam apenas em arquivos que eles mesmos criam em um diretório temporário. Não use estas técnicas contra sistemas ou dados que você não está autorizado a testar.
Descoberto e relatado por Jonathan Paparo (huntr:
jonathan-paparo). Validado pelo
mantenedor do keras-team hertschuh.