模糊测试在2000年——Trail of Bits博客
引言
这是我们第二次尝试在现代系统上重现原始模糊测试研究。本次实验通过重现Forrester和Miller于2000年发表的《使用随机测试对Windows NT应用鲁棒性的实证研究》(简称NT模糊测试报告)的结果,重点针对Windows系统进行模糊测试。
窗口消息与程序崩溃原理
显示GUI的Windows应用采用事件驱动架构:鼠标移动、按钮点击、按键按下等事件通过窗口消息传递。每个消息包含数字代码和参数(lParam/wParam),用于描述事件细节(如鼠标坐标、按键类型)。这些消息可由程序自身、操作系统或其他程序发送,接收应用必须随时处理任意顺序到达的消息。
安全影响
在Windows Vista之前,低权限进程可向高权限进程发送消息,通过特定消息组合实现代码执行(即“粉碎攻击”)。UIPI机制和系统服务隔离已缓解此问题。现代系统中窗口消息处理错误通常不会造成安全影响,原因包括:
- 窗口消息无法通过网络发送
- 在同权限级别实现代码执行无实际价值
但某些场景下同权限代码执行可能突破安全边界,例如浏览器渲染器沙箱或 antivirus 产品的控制面板保护机制。
测试方法
使用原始NT报告相同的核心模糊测试代码:
- SendMessage/PostMessage模式各进行3轮50万次消息测试(种子值42和1337)
- 省略随机鼠标键盘输入测试以聚焦窗口消息
- 对Windows 10需两项修改:支持64位编译、增加指定窗口句柄参数(用于UWP应用)
测试工具缺陷
发现原始模糊器存在严重缺陷:lParam和wParam参数仅使用16位整数值(通过rand()生成),而实际参数在32/64位系统中应为32/64位。为保持结果可比性,故意保留此缺陷。
应用列表变更
原报告测试33个程序,本次测试28个(每个程序仅测一个版本)。主要变更:
- CD Player → Windows Media Player
- Eudora → Windows Mail
- Command AntiVirus → Avast Free Edition
- GSView → Photos
- JavaWorkshop → NetBeans IDE
- Secure CRT → BitVise SSH
- Telnet → Putty
- Freecell & Solitaire来自微软纸牌合集
测试结果
原始报告中100%应用崩溃或冻结,本次测试中93%应用(26/28)仍出现异常。仅计算器和Avast杀毒软件完全正常。详细结果见表1:
程序 | 版本 | SendMessage | PostMessage |
---|---|---|---|
Microsoft Access | 1901 | crash | crash |
Adobe Reader DC | 2019.010.20098 | crash | ok |
Calculator | 10.1812.10048.0 | ok | ok |
…(其余略) |
Windows系统漏洞
发现WM_DEVICECHANGE消息会导致多个应用崩溃,包括官方HelloWorld示例程序(图3)。调试发现该问题仅影响32位应用,根源在于wow64win.dll兼容层将wParam作为指针处理时未验证内存有效性。已向MSRC报告并确认为非安全问题。
结论
窗口消息仍是Windows程序中未被充分重视的非信任输入源。19年后,93%的应用仍无法正确处理畸形消息。部分应用的良好表现证明某些组织已具备避免此类错误的框架和制度知识。窗口消息模糊测试仍有改进空间,可能存在跨越真实安全边界的案例。
分享至:Twitter、LinkedIn、GitHub、Mastodon、Hacker News