严重性: 严重,CVSS 4.0 9.3,CVSS 3.1 9.8(由 CNA VulnCheck 指定)
向量(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
向量(v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
受影响版本: Python StateMachine >= 3.0.0, < 3.2.0
修复版本: 3.2.0
CWE: CWE-95(动态求值代码中指令的不当中和,Eval 注入);同时映射到 CWE-94(代码生成控制不当,代码注入)
报告者: Sai Teja Erukude
CNA: VulnCheck
发布时间: 2026 年 6 月 17 日
Python StateMachine 的 3.0.0 至 3.2.0(不含)版本在 SCXML 处理路径中存在一个远程代码执行漏洞。
SCXMLProcessor 接受 SCXML 文档并保留 <data expr="..."> 等表达式属性。在受影响版本中,这些表达式字符串会经过 SCXML 数据模型处理路径,最终在无沙箱保护的情况下进入 Python 内置的 eval()。
能够提供或影响 SCXML 文档的攻击者可以在 <data expr="..."> 属性中放置 Python 代码。当使用该库的应用程序解析 SCXML 文件并启动处理器时,该表达式将在宿主 Python 进程的上下文中被求值。
如果易受攻击的应用程序处理了攻击者控制的 SCXML 内容,攻击者可能执行任意 Python 代码。
根据使用方应用程序接收 SCXML 文档的方式,该风险可能来自远程或本地。存在风险的输入路径包括:
成功利用可能允许:
报告给 VulnCheck 的漏洞调用链为:
SCXMLProcessor.parse_scxml_file()
SCXMLProcessor.process_definition()
create_datamodel_action_callable()
_create_dataitem_callable()
_eval()
eval()
当解析后的 SCXML 数据模型项在处理器启动期间被求值时,即会触发该问题。
该漏洞的控制流存在两个信任边界缺陷:
eval() 进行求值。PoC 使用 <data expr="..."> 属性,因为该路径会在 SCXMLProcessor.start() 期间执行。向 eval() 传递空的 globals 字典并不会禁用 Python 内置函数;Python 仍然可以向求值上下文注入可用的内置函数。因此,表达式可以访问 __import__ 并执行 Python 代码。
一个无害的 PoC 载荷会写入一个本地标记文件:
<data id="x" expr="__import__('pathlib').Path(...).write_text(...)"/>
只有在 SCXML 文档被解析且 start() 对数据模型表达式求值之后,才会创建该标记文件。
package_builder.py 会在 malicious-charts/data_expr_start.scxml 处生成一个本地攻击者控制的 SCXML 文件。生成的文件包含一个良性的 <data expr> 载荷,用于在本 PoC 目录中写入 marker.txt。
run_poc.py 不安装任何钩子,也不会修改目标包。它会导入已发布的 python-statemachine==3.1.2 包,使用 SCXMLProcessor.parse_scxml_file(...) 解析生成的 SCXML 文件,启动处理器,并打印标记文件的前后对比证据。
仅在本地测试环境中运行:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python run_poc.py
在受影响版本上预期看到的证据:
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
关键行为在于 marker.txt 在 start() 之前并不存在,之后才出现,从而证明 SCXML 表达式已在宿主 Python 进程内执行。
该载荷是有意保持无害的。它只会写入以下本地标记字符串:
python_statemachine_scxml_data_expr_eval_triggered
它不会启动 shell、连接网络服务、读取机密信息、删除数据,也不会修改 PoC 目录之外的文件。
升级到 Python StateMachine 3.2.0 或更高版本。
持久的修复应避免使用原始 Python eval() 对攻击者控制的 SCXML 表达式文本进行求值。更安全的方法包括:
eval()。如果无法立即升级:
SCXMLProcessor 之前对其进行验证。| 日期 | 事件 |
|---|---|
| 2026 年 5 月 22 日 | 漏洞已提交至 VulnCheck |
| 2026 年 5 月 26 日 | VulnCheck 启动披露流程;CVE-2026-47103 临时分配 |
| 2026 年 6 月 17 日 | CVE-2026-47103 发布 |
由 Sai Teja Erukude 发现并报告,通过 VulnCheck 协调。