CVE-2024-24576 Windows 下多语言命令注入漏洞分析

💡 原文中文,约21100字,阅读约需51分钟。
📝

内容提要

Flatt Security Inc.的RyotaK披露了Windows下多个编程语言的命令注入漏洞,其中Rust语言的漏洞编号为CVE-2024-24576。漏洞是由于Windows下cmd.exe对命令行参数的特殊解析逻辑导致的。PHP、Python等语言也受到影响。文章还分析了漏洞的原因和补丁分析,并提到了Python版本的漏洞分析。

🔎

延伸解读

漏洞本质:参数转义与 cmd.exe 解析的错位

CVE-2024-24576 并非内存安全漏洞,而是 Windows 下 cmd.exe 对命令行参数的特殊解析逻辑与编程语言转义规则不一致导致的逻辑漏洞。当程序通过 Command API 执行 .bat 或 .cmd 文件时,Rust 会调用 cmd.exe 并拼接参数,但 cmd.exe 对引号和元字符的处理方式与 Rust 的转义逻辑不同,攻击者可通过控制参数注入命令。该漏洞影响 Rust、PHP、Python、Node.js 等多种语言,CWE 分类为 CWE-78 和 CWE-88。

补丁修复思路:针对批处理参数的特殊转义

Rust 1.77.2 修复了 make_bat_command_line 函数,对普通参数改用 append_bat_arg 处理。新逻辑将双引号转义为两个双引号,并对 % 和 \r 等字符做特殊处理,例如将 % 替换为 %%cd:~,% 以阻止环境变量展开。同时,补丁在 cmd.exe 命令行中增加了 /e:ON /v:OFF 开关,确保命令扩展启用且延迟变量展开关闭。这些措施使参数在 cmd.exe 解析时被视为一个整体,从而避免注入。

影响范围与修复差异:多语言共性问题

该漏洞不仅影响 Rust,PHP、Python、Node.js 等语言在 Windows 下执行批处理文件时也存在类似风险。Python 的 subprocess 模块未专门处理 .bat 或 .cmd,其 list2cmdline 转义逻辑与 Rust 类似,因此同样可触发注入。不同语言对此漏洞的重视程度和修复速度可能不同,部分语言可能不将其视为自身问题,而是依赖开发者避免传递不可信参数。

安全启示:参数控制与防御建议

漏洞触发需要攻击者能控制传递给子进程的参数,因此开发者应避免将不可信输入直接作为参数执行批处理文件。在无法避免时,应使用语言提供的安全 API 或手动进行严格转义。此外,文章提到 cmd.exe 的 AutoRun 注册表项可能被恶意软件用于持久化,启动 cmd.exe 时指定 /d 参数可禁止 AutoRun,这提醒我们在调用命令行解释器时注意安全配置。

❓

Q&A

CVE-2024-24576漏洞的主要影响是什么?

该漏洞影响Windows下的Rust、PHP、Python等多种编程语言,攻击者可以通过控制传递给子进程的参数执行任意命令。

CVE-2024-24576漏洞是如何产生的?

漏洞源于Windows下cmd.exe对命令行参数的特殊解析逻辑,导致参数未能正确转义,从而引发命令注入。

Rust语言的哪个版本受到了CVE-2024-24576漏洞的影响?

Rust for Windows版本低于1.77.2受到该漏洞影响。

如何修复CVE-2024-24576漏洞?

在Rust 1.77.2版本中,通过修复make_bat_command_line函数的处理逻辑来避免参数注入问题。

Python语言是否也受到CVE-2024-24576漏洞的影响?

是的,Python同样存在类似的命令注入问题,特别是在使用subprocess模块时。

CVE-2024-24576漏洞的CWE分类是什么?

该漏洞的CWE分类包括CWE-78(操作系统命令注入)和CWE-88(命令中的参数分隔符未正确处理)。

🏷️

标签

➡️

继续阅读