CVE-2024-24576
Rust 的 std::process::Command 在 Windows 上未正确转义批处理文件的参数
- 已发布
- 2024年4月9日
- 已更新
- 2025年11月4日
- 分配 CNA
- GitHub_M
- 观察到的证据
- 2026年8月8日
初级CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H中 · 未来 30 天
- 百分位
- 97.4%
- 型号日期
- 2026年9月21日
EPSS 是统计估计,而不是确定性或影响衡量标准。将其与 CVSS、KEV 状态、暴露程度和您的环境相结合。
总结
Rust 是一种编程语言。Rust 安全响应工作组(Rust Security Response WG)获悉,1.77.2 之前的 Rust 标准库在使用 `Command` 于 Windows 上调用批处理文件(扩展名为 `bat` 和 `cmd`)时,未能正确转义参数。能够控制传给派生进程参数的攻击者,可通过绕过转义来执行任意 shell 命令。对于在 Windows 上使用不可信参数调用批处理文件的用户而言,此漏洞的严重性为严重。其他平台或用途不受影响。`Command::arg` 和 `Command::args` API 在其文档中声明,参数将按原样传递给派生进程,无论参数内容如何,都不会被 shell 求值。这意味着将不可信输入作为参数传递应当是安全的。在 Windows 上,此功能的实现比其他平台更为复杂,因为 Windows API 只为派生进程提供一个包含所有参数的单一字符串,具体如何拆分由派生进程自己决定。大多数程序使用标准 C 运行时的 argv,这实际上使得参数拆分方式基本一致。不过,`cmd.exe`(除其他用途外,还用于执行批处理文件)是一个例外,它有自己的参数拆分逻辑。这迫使标准库为传递给批处理文件的参数实现自定义转义。遗憾的是,据报告,我们的转义逻辑不够严谨,可能传入恶意参数从而导致任意 shell 执行。由于 `cmd.exe` 的复杂性,我们未能找到能在所有情况下正确转义参数的解决方案。为维持我们的 API 保证,我们改进了转义代码的健壮性,并将 `Command` API 改为在无法安全转义参数时返回 `InvalidInput` 错误。该错误将在生成进程时发出。修复已包含在 Rust 1.77.2 中。请注意,针对批处理文件的新转义逻辑偏于保守,可能会拒绝合法参数。那些自行实现转义或仅在 Windows 上处理可信输入的用户,也可以使用 `CommandExt::raw_arg` 方法来绕过标准库的转义逻辑。
来源
7针对 Rust 在 Windows 上的 CVE-2024-24576 命令注入漏洞的概念验证(PoC),使用 Julia 实现。
CVE-2024-24576 概念验证
负责任的使用
仅在您拥有或有权测试的系统上使用漏洞信息。 Kitploit 链接到公共研究元数据,并且不存储漏洞代码或恶意负载。