严重程度: 高,CVSS 4.0 8.5,CVSS 3.1 7.8(由 CNA 机构 VulnCheck 评定)
向量(v4.0): CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
向量(v3.1): CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
受影响版本: uproot <= 5.7.4
修复版本: 5.7.5 / 提交 c045c28
CWE: CWE-94(代码生成控制不当,代码注入);次要 CWE-95(Eval 注入)
发现并报告者: Sai Teja Erukude
发布日期: 2026 年 7 月 18 日
uproot 5.7.4 及更早版本会根据 ROOT TStreamerInfo 元数据动态生成 Python 类源代码,并在运行时编译。
部分由文件控制的 streamer 元数据字段在未进行安全引号处理的情况下被插入到生成的 Python 源代码中。能够提供特制 ROOT 文件的攻击者可以将破坏 Python 表达式的注入内容(例如特制的元素名称)注入到 streamer 元数据中。
当受影响的应用程序打开特制的 ROOT 文件,且 uproot 生成并调用相应的读取方法时,注入的 Python 表达式可在宿主进程的上下文中执行。
在打开或处理攻击者控制的 ROOT 文件、且使用受影响 uproot 代码路径的应用程序中,攻击者可能执行任意 Python 代码。
视应用程序而定,这可能允许:
该问题位于 uproot 针对 ROOT streamer 元数据的生成源代码路径中。
PoC 创建了一个 ROOT 文件,其中包含针对 ExploitTarget 类的特制 TStreamerInfo 元数据。特制的 streamer 元素名称突破了生成的表达式,并注入了一个无害的 pathlib 调用。
报告的行为如下:
TStreamerInfo 元数据。ExploitTarget 生成 Python 类源代码。read_members 方法会执行注入的表达式。root_file_builder.py 创建带有特制 streamer 元数据的 malicious_tstreamerinfo.root。
run_poc.py 使用 uproot 打开该文件,强制生成由文件支持的 ExploitTarget 类,调用生成的 read_members 方法,并验证标记文件证据。
仅在本地测试环境中运行:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
在易受攻击版本上预期的证据:
uproot_version: 5.7.4
file_backed_element_name_contains_payload: True
class_code_contains_injected_pathlib_call: True
expected_exception: True
exception_type: DeserializationError
marker_exists: True
marker_contents:
executed through uproot generated read_members
success: True
该载荷有意保持无害。它只会写入这个本地标记字符串:
executed through uproot generated read_members
它不会启动 shell、连接网络服务、读取机密、删除数据,也不会修改 PoC 目录之外的文件。
升级到 uproot 5.7.5 或更高版本。
如果无法立即升级:
TStreamerInfo 元数据。| 日期 | 事件 |
|---|---|
| 2026 年 5 月 20 日 | 漏洞提交至 VulnCheck |
| 2026 年 5 月 20 日 | VulnCheck 启动外联;CVE-2026-9147 被临时分配 |
| 2026 年 7 月 5 日 | uproot 5.7.5 发布并包含补丁 |
| 2026 年 7 月 18 日 | CVE-2026-9147 发布 |
由 Sai Teja Erukude 发现并报告。
披露工作通过 VulnCheck 协调完成。