
Python StateMachine 3.0.0 < 3.2.0 RCE tramite valutazione non sicura di SCXML <data expr> e iniezione in Python eval().
Gravità: Critica, CVSS 4.0 9.3, CVSS 3.1 9.8 (assegnata da VulnCheck, il CNA)
Vettore (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
Vettore (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Interessato: Python StateMachine >= 3.0.0, < 3.2.0
Corretto in: 3.2.0
CWE: CWE-95 (Neutralizzazione impropria delle direttive nel codice valutato dinamicamente, Eval Injection); corrisponde anche a CWE-94 (Controllo improprio della generazione di codice, Code Injection)
Scoperta e segnalata da: Sai Teja Erukude
Pubblicata: 17 giugno 2026
Le versioni di Python StateMachine dalla 3.0.0 precedente alla 3.2.0 contengono una vulnerabilità di esecuzione di codice remoto nel percorso di elaborazione SCXML.
SCXMLProcessor accetta documenti SCXML e preserva gli attributi di espressione come <data expr="...">. Nelle versioni vulnerabili, queste stringhe di espressione passano attraverso il percorso di elaborazione del datamodel SCXML e raggiungono infine la funzione built-in eval() di Python senza sandboxing.
Un attaccante in grado di fornire o influenzare un documento SCXML può inserire codice Python all'interno di un attributo <data expr="...">. Quando l'applicazione che consuma il file analizza il documento SCXML e avvia il processore, l'espressione viene valutata nel contesto del processo Python ospitante.
Un attaccante può eseguire codice Python arbitrario se un'applicazione vulnerabile elabora contenuti SCXML controllati dall'attaccante.
L'esposizione può essere remota o locale a seconda di come l'applicazione che consuma riceve i documenti SCXML. I percorsi di input a rischio includono:
Un'exploitazione riuscita può consentire di:
La catena di chiamate vulnerabile segnalata a VulnCheck è:
SCXMLProcessor.parse_scxml_file()
SCXMLProcessor.process_definition()
create_datamodel_action_callable()
_create_dataitem_callable()
_eval()
eval()
Il problema viene attivato quando un elemento del datamodel SCXML analizzato viene valutato durante l'avvio del processore.
Il flusso di controllo vulnerabile presenta due fallimenti del confine di fiducia:
eval().Il PoC utilizza un attributo <data expr="..."> perché questo percorso viene eseguito durante SCXMLProcessor.start(). Passare un dizionario globals vuoto a eval() non disabilita i builtin di Python; Python può comunque iniettare builtin utilizzabili nel contesto di valutazione. Di conseguenza, un'espressione può accedere a __import__ ed eseguire codice Python.
Un payload di prova innocuo scrive un file marcatore locale:
<data id="x" expr="__import__('pathlib').Path(...).write_text(...)"/>
Il marker viene creato solo dopo che il documento SCXML è stato analizzato e start() valuta l'espressione del datamodel.
package_builder.py genera un file SCXML locale controllato dall'attaccante in malicious-charts/data_expr_start.scxml. Il file generato contiene un payload <data expr> benigno che scrive marker.txt in questa directory PoC.
run_poc.py non installa hook e non modifica il pacchetto di destinazione. Importa il pacchetto pubblicato python-statemachine==3.1.2, analizza il file SCXML generato con SCXMLProcessor.parse_scxml_file(...), avvia il processore e stampa le prove del marker prima/dopo.
Eseguire solo in un ambiente di test locale:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python run_poc.py
Evidenza attesa sulle versioni vulnerabili:
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
Il comportamento importante è che marker.txt non esiste prima di start(), poi esiste dopo, dimostrando che l'espressione SCXML è stata eseguita all'interno del processo Python ospitante.
Il payload è intenzionalmente innocuo. Scrive solo questa stringa di marcatore locale:
python_statemachine_scxml_data_expr_eval_triggered
Non genera una shell, non si connette a un servizio di rete, non legge segreti, non elimina dati né modifica file al di fuori della directory del PoC.
Eseguire l'aggiornamento a Python StateMachine 3.2.0 o versione successiva.
Una correzione duratura dovrebbe evitare di valutare il testo delle espressioni SCXML controllato dall'attaccante con la eval() nativa di Python. Approcci più sicuri includono:
eval() nativa con un valutatore di espressioni vincolato.Se l'aggiornamento immediato non è possibile:
SCXMLProcessor.| Data | Evento |
|---|---|
| 22 maggio 2026 | Vulnerabilità inviata a VulnCheck |
| 26 maggio 2026 | VulnCheck ha avviato la divulgazione; CVE-2026-47103 assegnato in via provvisoria |
| 17 giugno 2026 | CVE-2026-47103 pubblicato |
Scoperta e segnalata da Sai Teja Erukude.
La divulgazione è stata coordinata tramite VulnCheck.