
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، الجهة المانحة لمعرّفات CVE)
المتجه (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
نُشرت: 17 يونيو 2026
تحتوي إصدارات Python StateMachine من 3.0.0 وحتى ما قبل 3.2.0 على ثغرة تنفيذ تعليمات برمجية عن بُعد في مسار معالجة SCXML.
يقبل SCXMLProcessor مستندات SCXML ويحتفظ بسمات التعبيرات مثل <data expr="...">. في الإصدارات المتأثرة، تمر سلاسل التعبيرات هذه عبر مسار معالجة نموذج بيانات SCXML لتصل في النهاية إلى دالة eval() المدمجة في Python دون أي عزل (sandboxing).
يمكن للمهاجم الذي يستطيع توفير مستند SCXML أو التأثير فيه أن يضع تعليمات Python البرمجية داخل سمة <data expr="...">. وعندما يقوم التطبيق المستهلك بتحليل ملف SCXML وبدء المعالج، يُقيَّم التعبير في سياق عملية Python المستضيفة.
قد يتمكن المهاجم من تنفيذ تعليمات Python برمجية عشوائية إذا عالج تطبيقٌ متأثرٌ محتوى SCXML يتحكم فيه المهاجم.
قد يكون التعرض عن بُعد أو محليًا اعتمادًا على كيفية تلقّي التطبيق المستهلك لمستندات SCXML. تشمل مسارات الإدخال عالية الخطورة ما يلي:
قد يسمح الاستغلال الناجح بما يلي:
سلسلة الاستدعاء المتأثرة التي أُبلغ عنها إلى VulnCheck هي:
SCXMLProcessor.parse_scxml_file()
SCXMLProcessor.process_definition()
create_datamodel_action_callable()
_create_dataitem_callable()
_eval()
eval()
تُستثار المشكلة عند تقييم عنصر datamodel في SCXML تم تحليله أثناء بدء تشغيل المعالج.
يتضمن مسار التحكم المعرّض للخطر إخفاقين في حدود الثقة:
eval() الخام في Python.يستخدم PoC سمة <data expr="..."> لأن هذا المسار يُنفَّذ أثناء SCXMLProcessor.start(). إن تمرير قاموس globals فارغ إلى eval() لا يعطّل دوال Python المدمجة (builtins)؛ فلا يزال بإمكان Python حقن دوال builtins قابلة للاستخدام في سياق التقييم. ونتيجةً لذلك، يمكن للتعبير الوصول إلى __import__ وتنفيذ شيفرة Python.
يكتب حمولة إثبات غير ضارة ملف علامة محلي:
<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 في دليل PoC هذا.
لا يثبّت 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 المستضيفة.
الحمولة عديمة الضرر عن قصد. فهي تكتب فقط سلسلة العلامة المحلية هذه:
python_statemachine_scxml_data_expr_eval_triggered
لا يقوم بتشغيل صدفة (shell)، ولا يتصل بخدمة شبكية، ولا يقرأ أسرارًا، ولا يحذف بيانات، ولا يعدّل ملفات خارج دليل PoC.
قم بالترقية إلى Python StateMachine 3.2.0 أو أحدث.
ينبغي أن يتجنب الإصلاح الدائم تقييم نص تعبير SCXML الذي يتحكم فيه المهاجم باستخدام eval() الخام في Python. تشمل الأساليب الأكثر أمانًا ما يلي:
eval() الخام بمُقيِّم تعبيرات مقيَّد.إذا لم يكن الترقية الفورية ممكنة:
SCXMLProcessor.| التاريخ | الحدث |
|---|---|
| 22 مايو 2026 | تم تقديم الثغرة إلى VulnCheck |
| 26 مايو 2026 | بدأت VulnCheck الإفصاح؛ تم تخصيص CVE-2026-47103 مبدئيًا |
| 17 يونيو 2026 | تم نشر CVE-2026-47103 |
تم اكتشافها والإبلاغ عنها بواسطة Sai Teja Erukude.
تم تنسيق الإفصاح من خلال VulnCheck.