
Python StateMachine 3.0.0 < 3.2.0 RCE através de avaliação insegura de SCXML <data expr> e injeção de Python eval().
Severidade: Crítica, CVSS 4.0 9.3, CVSS 3.1 9.8 (atribuída pela VulnCheck, a CNA)
Vetor (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
Vetor (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Afetados: Python StateMachine >= 3.0.0, < 3.2.0
Corrigido em: 3.2.0
CWE: CWE-95 (Neutralização Incorreta de Diretivas em Código Avaliado Dinamicamente, Injeção de Eval); também mapeia para CWE-94 (Controle Incorreto da Geração de Código, Injeção de Código)
Relatado por: Sai Teja Erukude
CNA: VulnCheck
Publicado: 17 de junho de 2026
As versões do Python StateMachine 3.0.0 anteriores à 3.2.0 contêm uma vulnerabilidade de execução remota de código no caminho de processamento de SCXML.
O SCXMLProcessor aceita documentos SCXML e preserva atributos de expressão como <data expr="...">. Em versões vulneráveis, essas strings de expressão passam pelo caminho de processamento do datamodel SCXML e, eventualmente, chegam ao eval() embutido do Python sem sandboxing.
Um atacante que possa fornecer ou influenciar um documento SCXML pode colocar código Python dentro de um atributo <data expr="...">. Quando o aplicativo consumidor analisa o arquivo SCXML e inicia o processador, a expressão é avaliada no contexto do processo Python hospedeiro.
Um atacante pode executar código Python arbitrário se um aplicativo vulnerável processar conteúdo SCXML controlado pelo atacante.
A exposição pode ser remota ou local, dependendo de como o aplicativo consumidor recebe os documentos SCXML. Caminhos de entrada arriscados incluem:
A exploração bem-sucedida pode permitir:
A cadeia de chamadas vulnerável relatada à VulnCheck é:
SCXMLProcessor.parse_scxml_file()
SCXMLProcessor.process_definition()
create_datamodel_action_callable()
_create_dataitem_callable()
_eval()
eval()
O problema é acionado quando um item do datamodel SCXML analisado é avaliado durante a inicialização do processador.
O fluxo de controle vulnerável tem duas falhas de limite de confiança:
eval() puro do Python.O PoC usa um atributo <data expr="..."> porque esse caminho é executado durante SCXMLProcessor.start(). Passar um dicionário globals vazio para eval() não desativa os builtins do Python; o Python ainda pode injetar builtins utilizáveis no contexto de avaliação. Como resultado, uma expressão pode acessar __import__ e executar código Python.
Um payload de prova inofensivo grava um arquivo marcador local:
<data id="x" expr="__import__('pathlib').Path(...).write_text(...)"/>
O marcador é criado somente após o documento SCXML ser analisado e start() avaliar a expressão do datamodel.
package_builder.py gera um arquivo SCXML local controlado pelo atacante em malicious-charts/data_expr_start.scxml. O arquivo gerado contém um payload benigno <data expr> que grava marker.txt neste diretório do PoC.
run_poc.py não instala hooks e não modifica o pacote alvo. Ele importa o pacote publicado python-statemachine==3.1.2, analisa o arquivo SCXML gerado com SCXMLProcessor.parse_scxml_file(...), inicia o processador e imprime as evidências do marcador antes/depois.
Execute somente em um ambiente de teste local:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python run_poc.py
Evidência esperada em versões vulneráveis:
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
O comportamento importante é que marker.txt não existe antes de start(), mas existe depois, provando que a expressão SCXML foi executada dentro do processo Python hospedeiro.
O payload é intencionalmente inofensivo. Ele apenas grava esta string de marcador local:
python_statemachine_scxml_data_expr_eval_triggered
Ele não abre um shell, não se conecta a um serviço de rede, não lê segredos, não exclui dados nem modifica arquivos fora do diretório do PoC.
Atualize para o Python StateMachine 3.2.0 ou posterior.
Uma correção duradoura deve evitar avaliar texto de expressão SCXML controlado pelo atacante com o eval() puro do Python. Abordagens mais seguras incluem:
eval() puro por um avaliador de expressões restrito.Se a atualização imediata não for possível:
SCXMLProcessor.| Data | Evento |
|---|---|
| 22 de maio de 2026 | Vulnerabilidade submetida à VulnCheck |
| 26 de maio de 2026 | VulnCheck iniciou a divulgação; CVE-2026-47103 foi alocado provisoriamente |
| 17 de junho de 2026 | CVE-2026-47103 publicado |
Descoberta e relatada por Sai Teja Erukude, com coordenação por meio da VulnCheck.