ExternalLinkSoftLinkExternalLink.weights.h5.h5.kerasKeras にはすでに正しいガード(
saving_lib.pyのsafe_get_h5_group/safe_get_h5_dataset)が同梱されています — これらの2つのエントリポイントは単にそれを呼び出していないだけです。
| 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 (Medium) |
| 影響 | 被害者が読み取り可能な任意のローカル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 | 協調開示のタイムライン |
# 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 ヘルパー経由でルーティングするか、インデックス前に
(h5py.ExternalLink, h5py.SoftLink) を拒否する data.get(key, default=None, getclass=True, getlink=True)
事前チェックを追加します。正確な差分については advisory を参照してください。
この資料は、協調開示とCVE割り当ての後、防御的および教育的目的で公開されています。 PoCは、一時ディレクトリ内で自分自身が作成したファイルに対してのみ動作します。 テストを許可されていないシステムやデータに対してこれらの技術を使用しないでください。
Jonathan Paparo によって発見・報告されました(huntr:
jonathan-paparo)。keras-team メンテナ
hertschuh によって検証されました。