白帽故事 · 2024年4月12日

CVE-2024-24576 Rust 命令注入漏洞【PoC已公布】

背景介绍

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

原文报道来自:https://www.darkreading.com/application-security/critical-rust-flaw-poses-exploit-threat-in-specific-windows-use-cases

file

以上由骨哥翻译并整理。