BatBadBut:你不能在 Windows 上安全地执行命令

这是一篇关于 Windows 命令注入漏洞“BatBadBut”的技术文章,包含以下主要内容:

  • 发布信息:于 2024 年 4 月 9 日发布,耗时 10 分钟,约 2120 字,包含目录。
  • 引言:作者 RyotaK 是 Flatt Security Inc 的安全工程师,近期向多种编程语言报告了多个漏洞,导致在特定条件下攻击者可在 Windows 上执行命令注入,今日受影响的供应商已发布漏洞公告,此文旨在提供更多细节并减少对高 CVSS 分数的困惑。
  • TL;DR(太长不看版):“BatBadBut”漏洞允许攻击者在特定条件满足时,对间接依赖“CreateProcess”函数的 Windows 应用程序执行命令注入。“CreateProcess()”在执行批处理文件时会隐式启动“cmd.exe”,其命令参数解析规则复杂,编程语言运行时未能正确转义命令参数,从而可能导致命令注入。文中给出了简单的 Node.js 代码示例,展示了命令注入的可能性,并提供了判断应用程序是否受影响的流程图及受影响编程语言的状态。
  • CVSS 分数:不应直接将库漏洞的 CVSS 分数应用于应用程序,应根据具体实现重新计算分数。
  • 技术细节

    • 根本原因:“CreateProcess”函数在 Windows 上的被忽视行为是“BatBadBut”的根本原因,执行批处理文件时 Windows 会隐式启动“cmd.exe”。
    • 包装“CreateProcess”:大多数编程语言提供执行命令的函数,会包装“CreateProcess”函数以提供更友好的接口,并内部转义命令参数,但在执行批处理文件时存在问题。
    • “cmd.exe”的解析规则:Unix 类系统的 shell 通常使用反斜杠作为转义字符,但“cmd.exe”使用 caret 作为转义字符,导致编程语言运行时的转义机制在执行批处理文件时不足,从而可能导致命令注入。
  • 缓解措施

    • 转义双引号:仅使用 caret 转义双引号不足以防止命令注入,因为命令提示符会先解析和扩展变量。
    • 作为开发者:执行命令时应注意指定命令的文件扩展名,避免执行批处理文件;若要执行批处理文件,必须在使用用户控制的输入作为命令参数之前进行转义,需注意处理百分号和反斜杠等特殊字符。
    • 作为用户:将批处理文件移动到不在“PATH”环境变量中的目录,以防止意外执行批处理文件。
    • 作为运行时维护者:维护编程语言运行时的人员应实现额外的转义机制,或至少记录问题并向用户提供适当的警告。
  • 结论:解释了“BatBadBut”的技术细节,指出该问题并非影响大多数应用程序,但受影响的应用程序应手动正确转义命令参数,并希望此文能帮助用户理解问题的严重性并妥善缓解。
  • 附录

    • 判断应用程序是否受影响的流程图:详细说明了判断应用程序是否受“BatBadBut”漏洞影响的流程。
    • 受影响编程语言的状态:列出了 Erlang、Go、Haskell、Java、Node.js、PHP、Python、Ruby、Rust 等编程语言的受影响状态,包括文档更新、补丁可用或不修复等情况。
阅读 26
0 条评论