
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
Versioni interessate: Python StateMachine >= 3.0.0, < 3.2.0
Corretto in: 3.2.0
CWE: CWE-95 (Neutralizzazione impropria delle direttive nel codice valutato dinamicamente, iniezione eval); corrisponde anche a CWE-94 (Controllo improprio della generazione di codice, iniezione di codice)
Segnalato da: Sai Teja Erukude
CNA: VulnCheck
Pubblicato: 17 giugno 2026
Le versioni di Python StateMachine dalla 3.0.0 alla 3.2.0 (esclusa) contengono una vulnerabilità di esecuzione di codice in remoto nel percorso di elaborazione SCXML.
SCXMLProcessor accetta documenti SCXML e conserva attributi di espressione come <data expr="...">. Nelle versioni vulnerabili, queste stringhe di espressione attraversano il percorso di elaborazione del datamodel SCXML e alla fine raggiungono la funzione eval() integrata di Python senza sandbox.
Un attaccante che può fornire o influenzare un documento SCXML può inserire codice Python all'interno di un attributo <data expr="...">. Quando l'applicazione che consuma il documento SCXML analizza il file 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 riceve i documenti SCXML. I percorsi di input rischiosi includono:
Uno sfruttamento riuscito può consentire:
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 violazioni del confine di fiducia:
eval() Python diretto.La PoC utilizza un attributo <data expr="..."> perché questo percorso viene eseguito durante SCXMLProcessor.start(). Passare un dizionario globals vuoto a eval() non disabilita i built-in di Python; Python può comunque iniettare built-in 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 benigno <data expr> che scrive marker.txt in questa directory PoC.
run_poc.py non installa hook e non modifica il pacchetto target. 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 nelle 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(), mentre esiste dopo, dimostrando che l'espressione SCXML è stata eseguita all'interno del processo Python ospitante.
Il payload è intenzionalmente innocuo. Scrive solo questa stringa marcatore locale:
python_statemachine_scxml_data_expr_eval_triggered
Non avvia una shell, non si connette a un servizio di rete, non legge segreti, non elimina dati e non modifica file al di fuori della directory PoC.
Aggiornare a Python StateMachine 3.2.0 o versioni successive.
Una correzione duratura dovrebbe evitare di valutare il testo delle espressioni SCXML controllato dall'attaccante con eval() Python diretto. Gli approcci più sicuri includono:
eval() diretto con un valutatore di espressioni vincolato.Se un 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 assegnata in via provvisoria |
| 17 giugno 2026 | CVE-2026-47103 pubblicata |
Scoperta e segnalata da Sai Teja Erukude, coordinata tramite VulnCheck.