
Python StateMachine 3.0.0 < 3.2.0 RCE durch unsichere Auswertung von SCXML-<data-expr> und Injektion in Python eval().
Schweregrad: Kritisch, CVSS 4.0 9.3, CVSS 3.1 9.8 (vergeben von VulnCheck, der CNA)
Vektor (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
Vektor (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Betroffen: Python StateMachine >= 3.0.0, < 3.2.0
Behoben in: 3.2.0
CWE: CWE-95 (Unzureichende Neutralisierung von Direktiven in dynamisch ausgewertetem Code, Eval Injection); bildet ebenfalls auf CWE-94 ab (Unzureichende Kontrolle der Codegenerierung, Code Injection)
Gemeldet von: Sai Teja Erukude
CNA: VulnCheck
Veröffentlicht: 17. Juni 2026
Python StateMachine-Versionen 3.0.0 vor 3.2.0 enthalten eine Schwachstelle zur Remotecodeausführung im SCXML-Verarbeitungspfad.
Der SCXMLProcessor akzeptiert SCXML-Dokumente und bewahrt Ausdrucksattribute wie <data expr="...">. In anfälligen Versionen durchlaufen diese Ausdruckszeichenfolgen den Verarbeitungspfad des SCXML-Datenmodells und erreichen schließlich ohne Sandboxing Pythons eingebaute eval()-Funktion.
Ein Angreifer, der ein SCXML-Dokument bereitstellen oder beeinflussen kann, kann Python-Code in einem <data expr="...">-Attribut platzieren. Wenn die konsumierende Anwendung die SCXML-Datei parst und den Prozessor startet, wird der Ausdruck im Kontext des hostenden Python-Prozesses ausgewertet.
Ein Angreifer kann beliebigen Python-Code ausführen, wenn eine anfällige Anwendung angreiferkontrollierte SCXML-Inhalte verarbeitet.
Die Ausnutzbarkeit kann remote oder lokal sein, je nachdem, wie die konsumierende Anwendung SCXML-Dokumente erhält. Zu den riskanten Eingabepfaden gehören:
Eine erfolgreiche Ausnutzung kann Folgendes ermöglichen:
Die an VulnCheck gemeldete anfällige Aufrufkette lautet:
SCXMLProcessor.parse_scxml_file()
SCXMLProcessor.process_definition()
create_datamodel_action_callable()
_create_dataitem_callable()
_eval()
eval()
Das Problem wird ausgelöst, wenn ein geparstes SCXML-Datenmodellelement beim Start des Prozessors ausgewertet wird.
Der anfällige Kontrollfluss weist zwei Verstöße gegen Vertrauensgrenzen auf:
eval() ausgewertet.Der PoC verwendet ein <data expr="...">-Attribut, da dieser Pfad während SCXMLProcessor.start() ausgeführt wird. Die Übergabe eines leeren globals-Wörterbuchs an eval() deaktiviert die eingebauten Funktionen von Python nicht; Python kann weiterhin nutzbare eingebaute Funktionen in den Auswertungskontext injizieren. Dadurch kann ein Ausdruck auf __import__ zugreifen und Python-Code ausführen.
Ein harmloses Proof-of-Concept-Payload schreibt eine lokale Markierungsdatei:
<data id="x" expr="__import__('pathlib').Path(...).write_text(...)"/>
Die Markierung wird erst erstellt, nachdem das SCXML-Dokument geparst wurde und start() den Datenmodellausdruck ausgewertet hat.
package_builder.py erzeugt eine lokale, angreiferkontrollierte SCXML-Datei unter malicious-charts/data_expr_start.scxml. Die erzeugte Datei enthält ein harmloses <data expr>-Payload, das marker.txt in diesem PoC-Verzeichnis schreibt.
run_poc.py installiert keine Hooks und modifiziert das Zielpaket nicht. Es importiert das veröffentlichte Paket python-statemachine==3.1.2, parst die erzeugte SCXML-Datei mit SCXMLProcessor.parse_scxml_file(...), startet den Prozessor und gibt die Marker-Nachweise vorher/nachher aus.
Nur in einer lokalen Testumgebung ausführen:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python run_poc.py
Erwartete Nachweise bei anfälligen Versionen:
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
Das wesentliche Verhalten ist, dass marker.txt vor start() nicht existiert und danach existiert, was beweist, dass der SCXML-Ausdruck innerhalb des hostenden Python-Prozesses ausgeführt wurde.
Das Payload ist absichtlich harmlos. Es schreibt nur diese lokale Markierungszeichenfolge:
python_statemachine_scxml_data_expr_eval_triggered
Es startet keine Shell, verbindet sich nicht mit einem Netzwerkdienst, liest keine Geheimnisse, löscht keine Daten und ändert keine Dateien außerhalb des PoC-Verzeichnisses.
Aktualisieren Sie auf Python StateMachine 3.2.0 oder neuer.
Ein dauerhafter Fix sollte vermeiden, angreiferkontrollierten SCXML-Ausdruckstext mit der rohen Python-Funktion eval() auszuwerten. Sicherere Ansätze sind:
eval() durch einen eingeschränkten Ausdrucks-Evaluator.Falls eine sofortige Aktualisierung nicht möglich ist:
SCXMLProcessor erreichen.| Datum | Ereignis |
|---|---|
| 22. Mai 2026 | Schwachstelle bei VulnCheck eingereicht |
| 26. Mai 2026 | VulnCheck hat die Offenlegung eingeleitet; CVE-2026-47103 vorläufig vergeben |
| 17. Juni 2026 | CVE-2026-47103 veröffentlicht |
Entdeckt und gemeldet von Sai Teja Erukude, koordiniert über VulnCheck.