严重程度: 严重,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
发布日期: 2026 年 6 月 17 日
Python StateMachine 3.0.0 至 3.2.0 之前的版本在 SCXML 处理路径中存在远程代码执行漏洞。
SCXMLProcessor 接受 SCXML 文档,并保留诸如 <data expr="..."> 之类的表达式属性。在受影响版本中,这些表达式字符串会经过 SCXML 数据模型处理路径,最终在未经沙箱隔离的情况下到达 Python 内置的 eval()。
能够提供或影响 SCXML 文档的攻击者可以将 Python 代码放入 <data expr="..."> 属性中。当使用该库的应用程序解析 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 代码。
一个无害的验证载荷会写入本地标记文件:
<data id="x" expr="__import__('pathlib').Path(...).write_text(...)"/>
标记仅在 SCXML 文档被解析且 start() 求值 datamodel 表达式之后才会创建。
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 协调完成。