
Python StateMachine 3.0.0 < 3.2.0 RCE mediante evaluación insegura de <data expr> de SCXML e inyección de eval() de Python.
Gravedad: Crítica, CVSS 4.0 9.3, CVSS 3.1 9.8 (asignado por VulnCheck, el CNA)
Vector (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
Vector (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Versiones afectadas: Python StateMachine >= 3.0.0, < 3.2.0
Corregido en: 3.2.0
CWE: CWE-95 (Neutralización incorrecta de directivas en código evaluado dinámicamente, inyección de eval()); también se asigna a CWE-94 (Control incorrecto de generación de código, inyección de código)
Reportado por: Sai Teja Erukude
CNA: VulnCheck
Publicado: 17 de junio de 2026
Las versiones de Python StateMachine 3.0.0 anteriores a 3.2.0 contienen una vulnerabilidad de ejecución remota de código en la ruta de procesamiento de SCXML.
El SCXMLProcessor acepta documentos SCXML y conserva atributos de expresión como <data expr="...">. En las versiones vulnerables, esas cadenas de expresión pasan por la ruta de procesamiento del modelo de datos SCXML y finalmente llegan al eval() integrado de Python sin sandboxing.
Un atacante que pueda proporcionar o influir en un documento SCXML puede colocar código Python dentro de un atributo <data expr="...">. Cuando la aplicación consumidora analiza el archivo SCXML e inicia el procesador, la expresión se evalúa en el contexto del proceso Python anfitrión.
Un atacante puede ejecutar código Python arbitrario si una aplicación vulnerable procesa contenido SCXML controlado por el atacante.
La exposición puede ser remota o local dependiendo de cómo la aplicación consumidora recibe los documentos SCXML. Las rutas de entrada de riesgo incluyen:
Una explotación exitosa puede permitir:
La cadena de llamadas vulnerable reportada a VulnCheck es:
SCXMLProcessor.parse_scxml_file()
SCXMLProcessor.process_definition()
create_datamodel_action_callable()
_create_dataitem_callable()
_eval()
eval()
El problema se desencadena cuando un elemento del modelo de datos SCXML analizado se evalúa durante el inicio del procesador.
El flujo de control vulnerable tiene dos fallas de límite de confianza:
eval() de Python sin procesar.La PoC utiliza un atributo <data expr="..."> porque esta ruta se ejecuta durante SCXMLProcessor.start(). Pasar un diccionario de globales vacío a eval() no desactiva los builtins de Python; Python aún puede inyectar builtins utilizables en el contexto de evaluación. Como resultado, una expresión puede acceder a __import__ y ejecutar código Python.
Una carga útil de prueba inofensiva escribe un archivo marcador local:
<data id="x" expr="__import__('pathlib').Path(...).write_text(...)"/>
package_builder.py genera un archivo SCXML local controlado por el atacante en malicious-charts/data_expr_start.scxml. El archivo generado contiene una carga útil benigna <data expr> que escribe marker.txt en este directorio de PoC.
run_poc.py no instala hooks ni modifica el paquete objetivo. Importa el paquete publicado python-statemachine==3.1.2, analiza el archivo SCXML generado con SCXMLProcessor.parse_scxml_file(...), inicia el procesador e imprime la evidencia del marcador antes/después.
Ejecutar solo en un entorno de prueba local:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python run_poc.py
Evidencia esperada en versiones vulnerables:
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
El comportamiento importante es que marker.txt no existe antes de start(), pero existe después, lo que demuestra que la expresión SCXML se ejecutó dentro del proceso Python anfitrión.
La carga útil es intencionalmente inofensiva. Solo escribe esta cadena marcadora local:
python_statemachine_scxml_data_expr_eval_triggered
No lanza un shell, no se conecta a un servicio de red, no lee secretos, no elimina datos ni modifica archivos fuera del directorio de la PoC.
Actualice a Python StateMachine 3.2.0 o posterior.
Una corrección duradera debería evitar evaluar texto de expresión SCXML controlado por el atacante con eval() de Python sin procesar. Los enfoques más seguros incluyen:
eval() sin procesar por un evaluador de expresiones restringido.Si no es posible una actualización inmediata:
SCXMLProcessor.| Fecha | Evento |
|---|---|
| 22 de mayo de 2026 | Vulnerabilidad enviada a VulnCheck |
| 26 de mayo de 2026 | VulnCheck inició la divulgación; CVE-2026-47103 asignado provisionalmente |
| 17 de junio de 2026 | CVE-2026-47103 publicado |
Descubierto y reportado por Sai Teja Erukude, coordinado a través de VulnCheck.