
Python StateMachine 3.0.0 < 3.2.0 RCE عبر تقييم SCXML غير الآمن <data expr> وحقن eval() في Python.
درجة الخطورة: حرجة، CVSS 4.0 9.3، CVSS 3.1 9.8 (مخصصة من قِبل VulnCheck، CNA)
المتجه (v4.0): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
المتجه (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
المتأثر: Python StateMachine >= 3.0.0, < 3.2.0
تم الإصلاح في: 3.2.0
CWE: CWE-95 (تحييد غير صحيح للتوجيهات في الكود المُقيَّم ديناميكيًا، حقن Eval)؛ ويتوافق أيضًا مع CWE-94 (تحكم غير صحيح في توليد الكود، حقن الكود)
قدّم التقرير: Sai Teja Erukude
CNA: VulnCheck
نُشر: 17 يونيو 2026
تحتوي إصدارات Python StateMachine 3.0.0 قبل 3.2.0 على ثغرة تنفيذ تعليمات برمجية عن بُعد في مسار معالجة SCXML.
يقبل SCXMLProcessor مستندات SCXML ويحتفظ بسمات التعبيرات مثل <data expr="...">. في الإصدارات المعرضة للخطر، تمر سلاسل التعبيرات هذه عبر مسار معالجة نموذج بيانات SCXML وتصل في النهاية إلى دالة eval() المدمجة في بايثون دون أي عزل.
يمكن للمهاجم الذي يمكنه توفير مستند SCXML أو التأثير عليه وضع كود بايثون داخل سمة <data expr="...">. وعندما يوزّع التطبيق المستهلك ملف SCXML ويشغّل المعالج، يتم تقييم التعبير في سياق عملية بايثون المستضيفة.
يمكن للمهاجم تنفيذ كود بايثون تعسفي إذا قام تطبيق معرض للخطر بمعالجة محتوى SCXML يتحكم فيه المهاجم.
يمكن أن يكون التعرض عن بُعد أو محليًا اعتمادًا على كيفية استلام التطبيق المستهلك لمستندات SCXML. تتضمن مسارات الإدخال الخطرة:
يمكن أن يسمح الاستغلال الناجح بما يلي:
سلسلة الاستدعاءات المعرضة للخطر المبلّغة إلى VulnCheck هي:
SCXMLProcessor.parse_scxml_file()
SCXMLProcessor.process_definition()
create_datamodel_action_callable()
_create_dataitem_callable()
_eval()
eval()
تحدث المشكلة عند تقييم عنصر نموذج بيانات SCXML مُحلَّل أثناء بدء تشغيل المعالج.
يحتوي تدفق التحكم المعرض للخطر على فشلين في حدود الثقة:
eval() الخام في بايثون.يستخدم إثبات المفهوم سمة <data expr="..."> لأن هذا المسار يُنفَّذ أثناء SCXMLProcessor.start(). إن تمرير قاموس globals فارغ إلى eval() لا يعطل الدوال المدمجة في بايثون؛ فلا يزال بإمكان بايثون حقن دوال مدمجة قابلة للاستخدام في سياق التقييم. ونتيجة لذلك، يمكن للتعبير الوصول إلى __import__ وتنفيذ كود بايثون.
يكتب حمولة إثبات غير ضارة ملف علامة محليًا:
<data id="x" expr="__import__('pathlib').Path(...).write_text(...)"/>
يتم إنشاء العلامة فقط بعد تحليل مستند SCXML وتقييم start() لتعبير نموذج البيانات.
يُنشئ package_builder.py ملف SCXML محليًا يتحكم فيه المهاجم في malicious-charts/data_expr_start.scxml. يحتوي الملف المُنشأ على حمولة <data expr> غير ضارة تكتب marker.txt في دليل إثبات المفهوم هذا.
لا يُثبّت run_poc.py أي خطافات ولا يعدّل الحزمة المستهدفة. فهو يستورد الحزمة المنشورة python-statemachine==3.1.2، ويوزّع ملف SCXML المُنشأ باستخدام SCXMLProcessor.parse_scxml_file(...)، ويشغّل المعالج، ويطبع أدلة العلامة قبل/بعد.
شغّل في بيئة اختبار محلية فقط:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python run_poc.py
الأدلة المتوقعة على الإصدارات المعرضة للخطر:
statemachine_version: 3.1.2
installed_package: True
data_marker_before_start: False
data_marker_after_start: True
marker_contents:
python_statemachine_scxml_data_expr_eval_triggered
success: True
السلوك المهم هو أن marker.txt غير موجود قبل start()، ثم يصبح موجودًا بعد ذلك، مما يثبت أن تعبير SCXML نُفِّذ داخل عملية بايثون المستضيفة.
الحمولة غير ضارة عمدًا. فهي تكتب سلسلة العلامة المحلية هذه فقط:
python_statemachine_scxml_data_expr_eval_triggered
وهي لا تشغّل صدفة، ولا تتصل بخدمة شبكة، ولا تقرأ أسرارًا، ولا تحذف بيانات، ولا تعدّل ملفات خارج دليل إثبات المفهوم.
قم بالترقية إلى Python StateMachine 3.2.0 أو أحدث.
يجب أن يتجنب الإصلاح الدائم تقييم نص تعبير SCXML الذي يتحكم فيه المهاجم باستخدام دالة eval() الخام في بايثون. تشمل الأساليب الأكثر أمانًا:
eval() الخام بمُقيِّم تعبيرات مقيد.إذا لم يكن الترقية الفورية ممكنة:
SCXMLProcessor.| التاريخ | الحدث |
|---|---|
| 22 مايو 2026 | إرسال الثغرة إلى VulnCheck |
| 26 مايو 2026 | بدأت VulnCheck الإفصاح؛ تم التخصيص المؤقت لـ CVE-2026-47103 |
| 17 يونيو 2026 | نُشر CVE-2026-47103 |
اكتشف وقدّم التقرير Sai Teja Erukude، بتنسيق عبر VulnCheck.