<= 5.20.0rc1 explore 操作系统命令注入严重性: 高,CVSS 3.1 8.8
向量: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
受影响: 所有 Frictionless 版本 <= 5.20.0rc1
组件: frictionless.console.commands.explore
CWE: CWE-78(操作系统命令注入),CWE-20(输入验证不当)
报告者: Sai Teja Erukude
Frictionless 版本至 5.20.0rc1 预发布版(含)在 frictionless explore CLI 命令中存在操作系统命令注入漏洞。
该命令加载用户提供的 Data Package 描述符,收集资源路径,推导 resource.normpath,将这些路径拼接为单个命令字符串,并将该字符串直接传递给 :
os.systempaths = [resource.normpath for resource in resources if resource.normpath]
os.system(f"vd {' '.join(paths)}")
由于 resources[*].path 是来自 datapackage.json 的由描述符控制的元数据,攻击者可以在资源路径中包含 shell 元字符。当受害者对恶意描述符运行 frictionless explore 时,shell 会解释这些元字符并执行注入的命令。
攻击者可以在运行 frictionless explore 的用户的安全上下文中执行任意命令。
这可能影响用户检查、验证或探索来自不受信任项目、归档、仓库或共享数据集的 Data Package 描述符的工作流程。
根据本地环境,这可能允许:
存在漏洞的路径是 explore 命令:
frictionless explore <package>
-> Package.from_descriptor(...)
-> Resource.list()
-> resource.normpath
-> os.system(f"vd {' '.join(paths)}")
PoC 生成一个 Data Package 描述符,其中 resources[0].path 包含一个无害的标记文件写入载荷。
在 Windows 上,生成的路径使用 & 命令分隔符:
data.csv & echo frictionless_explore_command_injection_triggered>"...\marker.txt" & rem
在 POSIX 系统上,生成的路径使用分号命令分隔符:
data.csv; printf %s frictionless_explore_command_injection_triggered > .../marker.txt; #
运行器从已安装的包中调用真实的 frictionless explore 命令。它为子进程清空 PATH,以便预期的 vd 查看器不会以交互方式启动,但当 shell 解析构造的命令字符串时,注入的命令仍会执行。
package_builder.py 创建攻击者控制的 Data Package 描述符和一个良性 CSV 文件。
run_poc.py 验证描述符,调用 frictionless explore,并打印执行证据。
仅在本地测试环境中运行:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
包含的 requirements.txt 固定了 frictionless==5.20.0rc1,这是此范围内最新确认存在漏洞的预发布版。
在存在漏洞的版本上的预期证据:
frictionless_version : 5.20.0rc1
installed_package : True
descriptor_valid : True
listed_resource_count : 1
raw_path_contains_payload : True
normpath_contains_payload : True
explore_returncode : 0
viewer_launch_disabled : True
marker_exists : True
marker_contents
frictionless_explore_command_injection_triggered
success : True
重要的证据是恶意描述符有效,由描述符控制的路径保留到 resource.normpath 中,并且在 frictionless explore 运行后创建了 marker.txt。
该载荷故意设计为无害。它仅写入此本地标记字符串:
frictionless_explore_command_injection_triggered
它不会生成 shell 会话、连接网络服务、读取机密、删除数据或修改 PoC 目录之外的文件。
避免将描述符控制的路径传递给 shell。
将基于 shell 的调用替换为使用参数向量的 subprocess.run:
subprocess.run(["vd", *paths], check=False)
这会将每个资源路径作为字面参数传递给 vd。路径中的 shell 元字符在该单个 argv 条目中仍为普通字符,不会被解释执行。
将特定路径字符列入黑名单的做法较弱,因为 shell 语法因平台和 shell 而异。命令调用边界是根本原因,因此持久的修复应避免 shell 解释。
有关建议的补丁,请参见 fix.md。
由 Sai Teja Erukude 发现并报告,通过 VulnCheck 协调。
exploit_walkthrough.mdfix.md