
RCE в Python StateMachine 3.0.0 < 3.2.0 через небезопасное вычисление <data expr> в SCXML и инъекцию Python eval().
Уровень критичности: Критический, 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 (Improper Neutralization of Directives in Dynamically Evaluated Code, Eval Injection); также относится к CWE-94 (Improper Control of Generation of Code, Code Injection)
Сообщил: Sai Teja Erukude
CNA: VulnCheck
Опубликовано: 17 июня 2026 г.
Версии Python StateMachine 3.0.0 до 3.2.0 содержат уязвимость удалённого выполнения кода в пути обработки SCXML.
SCXMLProcessor принимает документы SCXML и сохраняет атрибуты выражений, такие как <data expr="...">. В уязвимых версиях эти строки выражений проходят через путь обработки модели данных SCXML и в конечном итоге попадают во встроенную функцию Python eval() без песочницы.
Злоумышленник, который может предоставить или повлиять на документ 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()
Проблема возникает, когда проанализированный элемент модели данных SCXML вычисляется во время запуска процессора.
Уязвимый поток управления имеет два нарушения границ доверия:
eval() Python.PoC использует атрибут <data expr="...">, потому что этот путь выполняется во время SCXMLProcessor.start(). Передача пустого словаря globals в eval() не отключает встроенные функции Python; Python всё равно может внедрить используемые встроенные функции в контекст вычисления. В результате выражение может получить доступ к __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
Она не запускает оболочку, не подключается к сетевому сервису, не читает секреты, не удаляет данные и не изменяет файлы за пределами каталога 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.