
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
Afetado: Python StateMachine >= 3.0.0, < 3.2.0
Corrigido em: 3.2.0
CWE: CWE-95 (Neutralização Imprópria de Diretivas em Código Avaliado Dinamicamente, Injeção de Eval); também mapeia para CWE-94 (Controle Impróprio da Geração de Código, Injeção de Código)
Descoberto e reportado por: Sai Teja Erukude
Publicado: 17 de junho de 2026
As versões 3.0.0 até antes de 3.2.0 do Python StateMachine 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() nativo do Python sem sandbox.
Um atacante que consiga fornecer ou influenciar um documento SCXML pode inserir código Python dentro de um atributo <data expr="...">. Quando a aplicação consumidora 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 uma aplicação vulnerável processar conteúdo SCXML controlado pelo atacante.
A exposição pode ser remota ou local, dependendo de como a aplicação consumidora recebe documentos SCXML. Caminhos de entrada de risco incluem:
A exploração bem-sucedida pode permitir:
A cadeia de chamadas vulnerável reportada à VulnCheck é:
SCXMLProcessor.parse_scxml_file()
SCXMLProcessor.process_definition()
create_datamodel_action_callable()
_create_dataitem_callable()
_eval()
eval()
O problema é acionado quando um item de datamodel SCXML analisado é avaliado durante a inicialização do processador.
O fluxo de controle vulnerável apresenta duas falhas de limite de confiança:
eval() bruto 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 apenas depois que o documento SCXML é analisado e start() avalia 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 a evidência do marcador antes/depois.
Execute apenas 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 passa a existir 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, conecta-se a um serviço de rede, lê segredos, exclui dados ou 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() bruto do Python. Abordagens mais seguras incluem:
eval() bruto 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 enviada ao VulnCheck |
| 26 de maio de 2026 | VulnCheck iniciou a divulgação; CVE-2026-47103 alocado provisoriamente |
| 17 de junho de 2026 | CVE-2026-47103 publicado |
Descoberto e reportado por Sai Teja Erukude.
A divulgação foi coordenada pelo VulnCheck.