
CVE-2026-9335: KerasFileEditor وload_weights يتبعان روابط h5py الخارجية، مما يكشف عن محتويات ملفات HDF5 المحلية التعسفية في keras ≤ 3.14.0. استشارة أمنية + براهين مفهوم تم التحقق منها.
ExternalLink في Kerasواجهتا برمجة عامتان في Keras — keras.saving.KerasFileEditor و
keras.saving.load_weights / — تقرآن أعضاء مجموعة HDF5 عبر
دون التحقق من نوع الرابط. يقوم h5py
لـ / عند الفهرسة، لذا فإن ملف أو أو مقدم من المهاجم ويحتوي فقط على رابط يؤدي إلى قراءة Keras لمحتويات
.
model.load_weightsExternalLinkSoftLink.weights.h5.h5.kerasتشحن Keras بالفعل الحارس الصحيح (
safe_get_h5_group/safe_get_h5_datasetفيsaving_lib.py) — نقطتا الدخول هاتان ببساطة لا تستدعيانها.
| 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 | الجدول الزمني للكشف المنسق |
# 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"] (والمسح المماثل data[key] في file_editor.py)
يتبع بشفافية رابطًا إلى ملف آخر. النمط الآمن الذي تستخدمه 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 ملفات "ضحية" و"مهاجم" مؤقتة خاصة به تحت
دليل النظام المؤقت، ويوضح الكشف، ويطبع
*** 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. تعمل PoCs فقط على الملفات التي تنشئها بنفسها في دليل مؤقت. لا تستخدم هذه التقنيات ضد أنظمة أو بيانات غير مصرح لك باختبارها.
اكتشفه وأبلغ عنه Jonathan Paparo (huntr:
jonathan-paparo). تم التحقق منه بواسطة
مشرف keras-team hertschuh.