ExternalLink 本地文件内容泄露两个公开的 Keras API — keras.saving.KerasFileEditor 和
keras.saving.load_weights / model.load_weights — 通过直接索引读取 HDF5 组成员,
而未进行链接类型检查。h5py 在索引时会自动解引用 ExternalLink / SoftLink,
因此攻击者提供的仅包含链接的 .weights.h5、.h5 或 .keras 文件会导致 Keras
读取受害者本地文件系统上任意 HDF5 文件的内容。
Keras 已经内置了正确的防护机制(
saving_lib.py中的safe_get_h5_group/safe_get_h5_dataset)— 这两个入口点只是没有调用它。
# keras/src/saving/saving_api.py (load_weights, legacy .h5 branch)
with h5py.File(filepath, "r") as f:
if "layer_names" not in f.attrs and "model_weights" in f:
f = f["model_weights"] # <-- 此处的 ExternalLink 会被 h5py 自动解引用
f["model_weights"](以及 file_editor.py 中类似的 data[key] 遍历)
会透明地跟随链接进入另一个文件。Keras 在其他地方使用的安全模式会先检查链接类型:
# 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 泄露另一个受害者 h5 文件的内容
KERAS_BACKEND=jax python poc/poc_file_editor.py
# PoC 2 — model.load_weights 通过 ExternalLink 加载受害者文件的权重
KERAS_BACKEND=jax python poc/poc_load_weights.py
每个 PoC 都会在系统临时目录下创建自己的临时"受害者"和"攻击者"h5 文件,
演示泄露过程,打印 *** VULNERABILITY CONFIRMED ***,并在运行后自行清理。
已在 keras==3.14.0、Python 3.12.6、JAX 后端上验证通过。
将两个漏洞点都路由到现有的 safe_get_h5_group 辅助函数,或在索引前添加
data.get(key, default=None, getclass=True, getlink=True) 预检查,
以拒绝 (h5py.ExternalLink, h5py.SoftLink)。有关精确的差异补丁,
请参阅公告。
本材料在协调披露和 CVE 分配后发布,仅供防御和教育目的使用。PoC 仅操作 其在临时目录中自行创建的文件。请勿将这些技术用于测试未经授权的系统或数据。
由 Jonathan Paparo 发现并报告(huntr:
jonathan-paparo)。
由 keras-team 维护者 hertschuh 验证。
| CVE | CVE-2026-9335 |
| 受影响版本 | keras-team/keras ≤ 3.14.0 (PyPI) |
| 类型 | 路径遍历 / 信息泄露 (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(中危) |
| 影响 | 泄露受害者可读取的任何本地 HDF5 文件 |
| 攻击向量 | 受害者打开/加载恶意 .weights.h5 / .h5 / .keras 文件 |
| 状态 | 已在 keras 3.15.0 中修复(PR #22899 / #22900);已在 huntr 上验证(2026-05-22,维护者 hertschuh) |
| 报告者 | Jonathan Paparo(jonathan-paparo) |
| 路径 | 说明 |
|---|
advisory/CVE-2026-9335.md | 完整技术报告:根本原因、两个漏洞点、PoC 输出、修复方案 |
poc/poc_file_editor.py | PoC 1 — KerasFileEditor 跟随 ExternalLink 并泄露受害者 h5 文件 |
poc/poc_load_weights.py | PoC 2 — model.load_weights 通过 ExternalLink 拉取受害者的权重 |
poc/requirements.txt | 固定的复现环境 |
docs/timeline.md | 协调披露时间线 |