
CVE-2026-9335: KerasFileEditor와 load_weights가 h5py ExternalLinks를 따라가며, keras ≤ 3.14.0에서 임의의 로컬 HDF5 파일 내용을 노출합니다. 권고 및 검증된 PoC 포함.
ExternalLinkSoftLink.weights.h5.h5.kerasKeras에는 이미 올바른 가드(
saving_lib.py의safe_get_h5_group/safe_get_h5_dataset)가 포함되어 있습니다 — 이 두 진입점은 단순히 이를 호출하지 않습니다.
| 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, 레거시 .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는 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) 사전 검사를 추가합니다.
정확한 diff는 advisory를 참조하세요.
이 자료는 조율된 공개 및 CVE 지정 이후 방어 및 교육 목적으로 게시되었습니다. PoC는 임시 디렉터리에서 스스로 생성한 파일에만 작동합니다. 테스트 권한이 없는 시스템이나 데이터에 이러한 기법을 사용하지 마십시오.
Jonathan Paparo가 발견 및 제보했습니다 (huntr:
jonathan-paparo). keras-team
유지관리자 hertschuh가 검증했습니다.