CVE-2025-61787CVE-2025-61787 是 Deno 运行时在 Windows 平台上存在的一个高危命令行注入漏洞,CVSS 评分为 8.1 分。该漏洞源于 Windows 操作系统中 CreateProcess() API 的特殊行为:当应用程序尝试执行批处理文件(如 .bat、.cmd 等扩展名)时,即使调用方没有显式指定 cmd.exe,Windows 系统也会隐式地通过 cmd.exe 来解析和执行该批处理文件。这一操作系统层面的行为差异在 Unix/Linux 系统中并不存在,因此 Deno 的开发团队在最初设计跨平台进程执行逻辑时未能充分考虑 Windows 的这一特性,从而引入了安全风险。
攻击者可以利用该漏洞,通过精心构造的批处理文件路径或文件名,在 Deno 进程执行批处理文件时注入并执行任意操作系统命令。由于 Deno 通常被用于执行用户提供的脚本或代码,这种命令行注入可能导致完整的主机系统接管。攻击者可以读取敏感文件、安装恶意软件、修改系统配置、窃取凭据或利用被攻陷的服务器作为进一步攻击的跳板。
该漏洞的影响范围包括所有在 Windows 平台上运行且版本低于 2.5.3(2.5.x 分支)和 2.2.15(2.2.x 分支)的 Deno 运行时实例。由于 Deno 已被广泛应用于服务端 JavaScript/TypeScript 应用开发、CI/CD 流水线以及边缘计算场景中,该漏洞的潜在影响面非常广泛。GitHub 安全团队([email protected])于 2025 年 10 月 8 日披露了该漏洞,并已在最新版本中完成修复。
该漏洞的根本原因在于 Windows 操作系统中 CreateProcess() 系统调用的特殊行为。当应用程序调用 CreateProcess() 启动一个以 .bat、.cmd、.btm 等扩展名结尾的批处理文件时,Windows 内核会自动将该执行请求重定向到 cmd.exe,由 cmd.exe 负责解析和执行批处理文件中的命令序列。这一行为对于 Windows 开发者来说是众所周知的,但跨平台运行时(如 Deno)必须显式处理这种差异。
在 Deno 受影响版本中,当通过 Command::new() 或类似 API 执行批处理文件时,Deno 直接将文件路径传递给 Windows 的 CreateProcess() 函数,而没有对路径进行适当的转义或验证,也没有强制使用安全的执行方式。由于 cmd.exe 在解析命令行参数时会执行元字符(如 &、|、&&、|| 等),攻击者可以通过构造包含命令注入元字符的文件名或路径参数来实现任意命令执行。
例如,如果 Deno 应用接受用户输入作为批处理文件路径的一部分,攻击者可以提交类似 "legit.bat & calc.exe" 的路径,由于 cmd.exe 会将 & 解释为命令分隔符,从而执行 calc.exe。修复方案是通过使用 CreateProcessW() 配合 NULL 命令行参数(仅传递可执行文件路径),或者通过使用 CreateProcessAsUser() 等替代 API 来绕过 cmd.exe 的隐式调用,确保批处理文件以安全的方式执行。