
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 (Ненадлежащая нейтрализация директив в динамически вычисляемом коде, инъекция eval); также соответствует CWE-94 (Ненадлежащий контроль генерации кода, инъекция кода)
Обнаружено и сообщено: Sai Teja Erukude
Опубликовано: 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()
Проблема возникает, когда элемент datamodel разобранного SCXML вычисляется во время запуска процессора.
Уязвимый поток управления содержит два нарушения границы доверия:
eval().PoC использует атрибут <data expr="...">, поскольку этот путь выполняется во время SCXMLProcessor.start(). Передача пустого словаря globals в eval() не отключает встроенные функции Python; Python по-прежнему может внедрять пригодные для использования встроенные функции в контекст вычисления. В результате выражение может получить доступ к __import__ и выполнить код Python.
Безвредная демонстрационная полезная нагрузка записывает локальный файл-маркер:
<data id="x" expr="__import__('pathlib').Path(...).write_text(...)"/>
Маркер создаётся только после того, как документ SCXML разобран и start() вычисляет выражение datamodel.
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-выражений, контролируемых злоумышленником, с помощью необработанного Python eval(). Более безопасные подходы включают:
eval() на ограниченный вычислитель выражений.Если немедленное обновление невозможно:
SCXMLProcessor.| Дата | Событие |
|---|---|
| 22 мая 2026 г. | Уязвимость передана в VulnCheck |
| 26 мая 2026 г. | VulnCheck инициировал раскрытие; предварительно назначен CVE-2026-47103 |
| 17 июня 2026 г. | CVE-2026-47103 опубликован |
Обнаружено и сообщено Sai Teja Erukude.
Раскрытие координировалось через VulnCheck.