这是一篇关于 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.exe
、openssl.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 环境的安全性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。