
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 (asignada 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
Afectado: 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 corresponde con CWE-94 (Control incorrecto de la generación de código, inyección de código)
Descubierto y reportado por: Sai Teja Erukude
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 según cómo reciba la aplicación consumidora 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 activa cuando un elemento del modelo de datos SCXML analizado se evalúa durante el arranque del procesador.
El flujo de control vulnerable presenta dos fallos de límite de confianza:
eval() nativa de Python.La PoC utiliza un atributo <data expr="..."> porque esta ruta se ejecuta durante SCXMLProcessor.start(). Pasar un diccionario de globals 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 de prueba inofensiva escribe un archivo marcador local:
<data id="x" expr="__import__('pathlib').Path(...).write_text(...)"/>
El marcador se crea solo después de que se analiza el documento SCXML y start() evalúa la expresión del modelo de datos.
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 y 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(), y luego existe después, lo que demuestra que la expresión SCXML se ejecutó dentro del proceso Python anfitrión.
El payload es intencionalmente inofensivo. Solo escribe esta cadena de marcador local:
python_statemachine_scxml_data_expr_eval_triggered
No genera un shell, no se conecta a un servicio de red, no lee secretos, no elimina datos ni modifica archivos fuera del directorio del PoC.
Actualice a Python StateMachine 3.2.0 o posterior.
Una corrección duradera debería evitar la evaluación de texto de expresiones SCXML controlado por el atacante con eval() de Python sin restricciones. Los enfoques más seguros incluyen:
eval() sin restricciones 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.
La divulgación fue coordinada a través de VulnCheck.