Rust 发布了 1.77.2 版本,属于小版本更新,最主要升级是发布了一个重要的标准库安全补丁,本次升级 Blog 由 The Rust Security Response WG(安全响应工作组团队)发布,以往都是 The Rust Release Team(发布团队),可见端倪。
关于CVE-2024-24576 漏洞:
Rust 最主要的优势就是安全,但这并不代表该编程语言就没有漏洞。安全专家近日发现了追踪编号为 CVE-2024-24576 的漏洞,攻击者可以利用 Rust 标准库中的漏洞通过命令注入攻击 Windows 系统。 该漏洞是由于操作系统命令和参数注入缺陷造成的,攻击者可在操作系统上执行潜在的恶意命令。
GitHub 已将此漏洞评为"严重",最高 CVSS 基线得分为 10/10。未经身份验证的攻击者可以在无需用户交互的情况下以低复杂度的攻击远程利用此漏洞。
Rust 安全响应工作组获悉,1.77.2 版之前的 Rust 标准库在使用"Command"在 Windows 上调用批处理文件(带有"bat"和"cmd"扩展名)时,无法正确转义参数。能够控制传递给生成进程的参数的攻击者可以通过绕过转义来执行任意 shell 命令。对于那些在 Windows 上使用不受信任的参数调用批处理文件的人来说,此漏洞的严重性至关重要。但不影响其他平台或使用。
Command::arg
和Command::args
API 在其文档中声明,无论参数的内容如何,参数都将按原样传递给生成的进程,并且不会由 shell 进行评估。这意味着将不受信任的输入作为参数传递应该是安全的。在 Windows 上,其实现比其他平台更复杂,因为 Windows API 仅提供一个包含派生进程的所有参数的单个字符串,并且由派生进程来分割它们。大多数程序使用标准 C 运行时 argv参数,这实际上会导致参数分割方式基本一致。但一个例外是"cmd.exe"(用于执行批处理文件),它有自己的参数分割逻辑。这迫使标准库对传递给批处理文件的参数实现自定义转义。不幸的是,Rust 的转义逻辑不够彻底,有可能传递恶意参数,导致任意的 shell 命令可以执行。由于"cmd.exe"的复杂性,Rust 团队暂时没有找到在所有情况下都能正确转义参数的解决方案。因此,他们必须提高失控代码的可靠性并修改 Command API。如果命令 API 在创建进程时无法安全地转义参数,则会返回InvalidInput
错误。该修复包含在 Rust 1.77.2 中。Rust 安全响应工作组补充道:"要注意批处理文件的新转义逻辑在保守方面会出错,并且可能会拒绝有效参数。如果您自己实现转义或仅处理受信任的输入,那么在 Windows 上您还可以使用
CommandExt::raw_arg
方法来绕过标准库转义逻辑。"
具体原因
简单的说就是 Rust 的 std::process::Command
没有正确转义 Windows 上批处理文件的参数。
1.77.2 之前的版本,在 Windows 上使用命令 API 调用批处理文件(带有 bat 和 cmd 扩展名)时,Rust 标准库没有正确转义参数。这会造成的可怕的影响,那就是攻击者可以控制传递到生成进程的参数,然后绕过转义来执行任意的 shell 命令(Commands),在 Windows 上调用批处理文件时使用的是不可信任的参数,因此该漏洞是个非常高危的漏洞。不过好在其他平台或使用不受影响。
鉴于如此高危漏洞,Rust 安全响应工作组随后发布安全公告。随即发布了 1.77.2 标准库安全补丁,修复了存在于 Windows 系统上的问题,并表示其它平台或者用途不受影响。
注:如果对细节感兴趣,推荐阅读下面2篇文章
参考资料
- Rust 1.77.2 官方升级博客:blog.rust-lang.org/2024/04/09/...
- CVE-2024-24576 漏洞详情:www.cve.org/CVERecord?i...
- 标准库的安全公告 (CVE-2024-24576):blog.rust-lang.org/2024/04/09/...