标准库安全公告 (CVE-2024-24576)

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

Rust 安全响应工作组收到通知,Rust 标准库在使用 Command API 在 Windows 上调用批处理文件(扩展名为 batcmd)时,未能正确转义参数。能够控制传递给生成进程的参数的攻击者可以通过绕过转义来执行任意 shell 命令。

如果您在 Windows 上使用不受信任的参数调用批处理文件,则此漏洞的严重性为危急。其他平台或使用方式不受影响。

此漏洞的标识符为 CVE-2024-24576。

概述

Command::argCommand::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 方法来绕过标准库的转义逻辑。

受影响的版本

如果您的代码或您的某个依赖项使用不受信任的参数执行批处理文件,则所有 Windows 上的 1.77.2 之前的 Rust 版本都会受到影响。其他平台或 Windows 上的其他用途不受影响。

致谢

我们要感谢 RyotaK 根据 Rust 安全策略 负责任地向我们披露此事,并感谢 Simon Sawicki (Grub4K) 识别出我们在修复中采用的一些转义规则。

我们还要感谢 Rust 项目的成员,他们帮助我们披露此漏洞:Chris Denton 开发了修复程序;Mara Bos 审查了修复程序;Pietro Albini 撰写了此公告;Pietro Albini、Manish Goregaokar 和 Josh Stone 协调了此次披露;Amanieu d'Antras 在披露期间提供了建议。