最差适应:揭示 Windows ANSI 中的隐藏变压器!

这是一篇关于 Windows 系统中 Best-Fit 字符转换特性导致新攻击面的研究文章,主要内容总结如下:

  • 背景与历史:Windows 系统最初使用 ANSI 编码和代码页,后过渡到 Unicode 时代,采用 UTF-16 编码。同时存在 ANSI 和 Unicode 两套 API,在处理非 ASCII 字符时会出现 Best-Fit 行为,即将 Unicode 字符串转换为目标代码页的“最接近”字符。
  • 新攻击面:通过深入研究 Best-Fit 特性,发现可将其作为 Windows 系统的新攻击面,包括 Filename Smuggling(文件名走私)、Argument Splitting(参数分裂)和 Environment Variable Confusion(环境变量混淆)三种攻击技术。

    • Filename Smuggling:利用某些字符在不同代码页中映射为“/”或“\”的特性,导致文件访问和路径遍历漏洞,如在 Chrome V8、mruby 等中,通过 ANSI API 处理包含恶意 Unicode 字符的工作目录或函数返回值,可引发文件访问问题,甚至在 Cuckoo Sandbox 中导致远程代码执行(RCE)。
    • Argument Splitting:在命令行解析中利用字符映射进行攻击,如全角引号(U+FF02)在特定代码页下会自动转换为标准引号,从而改变命令行语法实现参数分裂,可在 PHP、Python、Node.js 等多种编程语言中触发,甚至影响到不直接使用GetCommandLineA的程序,如通过操纵GetCommandLineA的输出,在wget.exeopenssl.exe等工具中实现任意命令执行,还展示了多个实际应用中的攻击案例,如 ElFinder、TortoiseGit、RStudio 等。
    • Environment Variable Confusion:在使用GetEnvironmentVariableA等函数获取环境变量时,由于 Best-Fit 行为,可绕过字符限制,引发安全漏洞,如在 CGI 脚本中通过替换admin中的字符进行 WAF 绕过,在 PHP-CGI 中利用PATH_INFO环境变量导致本地文件包含(LFI)甚至远程代码执行(RCE)等。
  • 应对措施与挑战:作为用户,可在 Windows 中检查 UTF-8 选项,但该功能仍处于测试阶段;作为开发者,应尽量使用 Wide Character API 和宽字符版本的 C Runtime Library,以避免受到 WorstFit 攻击。然而,报告漏洞给上游维护者过程充满挑战,如关于 Argument Splitting 的责任界定不清,修复过程复杂,部分项目如 Curl、OpenSSL、Perl 等表示难以或不愿修复,Microsoft 对部分报告的案例处理也未达预期,尽管最终 Microsoft 在文档中添加了一个警告,但仍有多个 ANSI API 需要关注。

总之,尽管研究揭示了 WorstFit 攻击的存在和影响,但解决该问题仍面临诸多困难,需要各方共同努力逐步改善 Windows 环境的安全性。

阅读 9
0 条评论