
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 (Improper Neutralization of Directives in Dynamically Evaluated Code, Eval Injection); ordnet sich außerdem CWE-94 zu (Improper Control of Generation of Code, Code Injection)
Entdeckt und gemeldet von: Sai Teja Erukude
Veröffentlicht: 17. Juni 2026
Python StateMachine-Versionen 3.0.0 vor 3.2.0 enthalten eine Remote-Code-Execution-Schwachstelle im SCXML-Verarbeitungspfad.
Der SCXMLProcessor akzeptiert SCXML-Dokumente und übernimmt Ausdrucksattribute wie <data expr="...">. In anfälligen Versionen durchlaufen diese Ausdruckszeichenketten den SCXML-Datamodel-Verarbeitungspfad und erreichen schließlich Pythons eingebaute eval()-Funktion ohne Sandboxing.
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 vom Angreifer kontrollierte SCXML-Inhalte verarbeitet.
Die Exposition kann remote oder lokal sein, je nachdem, wie die konsumierende Anwendung SCXML-Dokumente empfängt. Riskante Eingabepfade umfassen:
Eine erfolgreiche Ausnutzung kann 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-Datamodel-Element während des Prozessorstarts ausgewertet wird.
Der anfällige Kontrollfluss weist zwei Trust-Boundary-Fehler auf:
eval() ausgewertet.Das PoC verwendet ein <data expr="...">-Attribut, da dieser Pfad während SCXMLProcessor.start() ausgeführt wird. Die Übergabe eines leeren Globals-Dictionarys an eval() deaktiviert die Python-Builtins nicht; Python kann weiterhin nutzbare Builtins in den Auswertungskontext injizieren. Infolgedessen kann ein Ausdruck auf __import__ zugreifen und Python-Code ausführen.
Eine harmlose Proof-Payload schreibt eine lokale Marker-Datei:
<data id="x" expr="__import__('pathlib').Path(...).write_text(...)"/>
Die Markierung wird erst erstellt, nachdem das SCXML-Dokument geparst wurde und start() den Datamodel-Ausdruck auswertet.
package_builder.py erzeugt eine lokale, vom Angreifer kontrollierte SCXML-Datei unter malicious-charts/data_expr_start.scxml. Die erzeugte Datei enthält eine harmlose <data expr>-Payload, die marker.txt in diesem PoC-Verzeichnis schreibt.
run_poc.py installiert keine Hooks und verändert 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 den Nachweis der Markierung vor/nach 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 wichtige Verhalten besteht darin, dass marker.txt vor start() nicht existiert und danach existiert, was beweist, dass der SCXML-Ausdruck innerhalb des hostenden Python-Prozesses ausgeführt wurde.
Die Payload ist absichtlich harmlos. Sie schreibt lediglich diese lokale Marker-Zeichenkette:
python_statemachine_scxml_data_expr_eval_triggered
Es startet keine Shell, verbindet sich mit keinem Netzwerkdienst, liest keine Secrets, löscht keine Daten und ändert keine Dateien außerhalb des PoC-Verzeichnisses.
Aktualisieren Sie auf Python StateMachine 3.2.0 oder höher.
Eine dauerhafte Lösung sollte vermeiden, vom Angreifer kontrollierten SCXML-Ausdruckstext mit rohem Python-eval() auszuwerten. Sicherere Ansätze umfassen:
eval() durch einen eingeschränkten Ausdrucksauswerter.Wenn ein sofortiges Upgrade nicht möglich ist:
SCXMLProcessor erreichen.| Datum | Ereignis |
|---|---|
| 22. Mai 2026 | Schwachstelle bei VulnCheck eingereicht |
| 26. Mai 2026 | VulnCheck leitete die Offenlegung ein; CVE-2026-47103 vorläufig zugewiesen |
| 17. Juni 2026 | CVE-2026-47103 veröffentlicht |
Entdeckt und gemeldet von Sai Teja Erukude.
Die Offenlegung wurde über VulnCheck koordiniert.