批处理脚本是一种安全漏洞吗?

2024 年 4 月 23 日:

  • 数周前,一个影响 Windows 上几乎每种语言标准库的 CVE 出现,RyotaK 有详细介绍:BatBadBut: You can't securely execute commands on Windows。简而言之,即使是可信的批处理脚本,发送不受信任的参数也是一个漏洞,因为在脚本运行之前 shell 就已介入。
  • 不同语言对此反应不同:有些(如 Rust)发布了修复,有些仅记录了问题,还有些则完全未采取行动。
  • 为何有不同反应:

    • Rust 认为这是库漏洞,因为在 Windows 上运行.bat文件时,cmd.exe会在脚本运行前评估整个命令,如Command::new("script.bat").arg("&calc").spawn();会运行cmd /c script.bat &calc导致calc.exe被启动,这与脚本本身无关,类似许多语言中传递不受信任的字符串给eval。语言标准库无法解决cmd.exe的问题,只能通过转义参数来规避。
    • 其他语言未修复可能是:不同意此问题如声称的那么关键,毕竟这是 Windows 存在数十年的特性且虽未记录但不是秘密,也可能认为责任在操作系统而非包装操作系统 API 的库;不想进行破坏性更改,Rust 等的规避方法虽尽量避免实际破坏但仍可能被视为破坏,且有些(希望是少数)人可能因某种原因依赖命令注入;已记录不受信任的参数是漏洞,广泛的免责声明可涵盖此及未来与进程参数相关的 CVE,无需更新标准库或文档。
  • 这或许是较 niche 的问题:多数人可能未向批处理脚本传递不受信任的输入,即便如此,对于不可避免受影响的人来说,有避免命令注入攻击的方法无疑是关键的。
阅读 144
0 条评论