标准库安全通告 (CVE-2024-43402)

2024 年 9 月 4 日 · Rust 安全响应工作组

2024 年 4 月 9 日,Rust 安全响应工作组披露了 CVE-2024-24576,其中 std::process::Command 在 Windows 上调用批处理文件时错误地转义了参数。我们收到通知,得知我们对该漏洞的修复不完整,当批处理文件名包含尾随空格或句点(Windows 会忽略并删除这些字符)时,可以绕过该修复。

不完整修复的严重性为,因为需要特定的罕见条件才能触发。请注意,计算 CVSS 分数可能会为此分配更高的严重性,但这并未考虑触发不完整修复所需的条件。

该不完整修复的标识符为 CVE-2024-43402。

概述

有关原始漏洞的详细信息,请参阅 CVE-2024-24576 的通告

为了确定是否应用 cmd.exe 转义规则,该漏洞的原始修复检查了命令名称是否以 `.bat` 或 `.cmd` 结尾。当时这似乎已足够,因为我们拒绝调用没有文件扩展名的批处理脚本。

不幸的是,Windows 在解析文件路径时会删除尾随空格和句点。例如,`.bat. .` 会被 Windows 解释为 `.bat`,但我们的原始修复并未对此进行检查。

缓解措施

如果您受到此问题影响,并且您正在使用 Rust 1.77.2 或更高版本,您可以从批处理文件名中移除尾随空格(ASCII 0x20)和尾随句点(ASCII 0x2E),以绕过不完整修复并启用缓解措施。

Rust 1.81.0 定于 2024 年 9 月 5 日发布,它将更新标准库,以便对所有批处理文件调用应用 CVE-2024-24576 的缓解措施,无论文件名中是否有尾随字符。

受影响的版本

如果您的代码或您的某个依赖项在 Windows 上调用批处理脚本时,其名称中包含尾随空格或尾随句点,并且将不受信任的参数传递给它,那么所有早于 1.81.0 的 Rust 版本都会受到影响。

致谢

我们感谢 Kainan Zhang (@4xpl0r3r) 按照 Rust 安全政策 负责任地向我们披露了此问题。

我们还要感谢协助我们披露此不完整修复的 Rust 项目成员:Chris Denton 开发了该修复,Amanieu D'Antras 审阅了该修复;Pietro Albini 撰写了此通告;Pietro Albini、Manish Goregaokar 和 Josh Stone 协调了此披露。