
这是我们第二次尝试在现代系统上重现原始模糊测试研究。本次实验专注于Windows平台,通过复现Justin E. Forrester和Barton P. Miller于2000年发表的《使用随机测试对Windows NT应用程序鲁棒性的实证研究》(简称NT模糊测试报告)的结果。
显示GUI的Windows应用程序采用事件驱动架构:鼠标移动、按钮点击、按键按压等。窗口消息是Windows中的事件通知机制,每个消息包含数字代码和参数(lParam和wParam),用于指定事件详情。这些消息可由程序自身、操作系统或其他程序发送,必须由接收应用程序处理。
在Windows Vista之前,低权限进程可向高权限进程发送消息,通过特定消息组合实现在高权限进程中执行代码的“粉碎攻击”。现代Windows系统通过UIPI和系统服务隔离已基本缓解此问题。窗口消息处理不当在现代系统中通常不会造成安全影响,因为:1)消息无法通过网络发送;2)在同一权限级别获得代码执行无实际意义。
使用原始NT模糊测试报告中描述的相同核心模糊测试代码和方法。在SendMessage和PostMessage模式下,模糊测试器使用种子值42和1337各进行三次50万条消息的迭代测试。由于时间限制,未测试随机鼠标和键盘输入方法。
为在Windows 10上运行模糊测试器进行了两处修改:1)适配64位Windows的编译调整;2)增加通过命令行参数指定目标窗口句柄的功能,以支持通用Windows平台(UWP)应用程序测试。
在修改过程中发现原始模糊测试器的严重缺陷:lParam和wParam参数的随机值范围被限制在16位整数(通过rand()函数生成),而实际参数在32位系统中为32位,64位系统中为64位。为保持结果可比性,在评估过程中故意保留此缺陷。
原始报告测试33个程序,本次重现测试28个。部分软件替代情况:
与原始报告结果高度一致:19年前100%的测试应用在畸形窗口消息测试中崩溃或冻结,如今仍有93%的应用出现相同问题。仅计算器和Avast防病毒软件未受影响。具体结果见表1。
表1:Windows 10上重现NT模糊测试报告的结果
程序 | 版本 | SendMessage | PostMessage |
|---|---|---|---|
Microsoft Access | 1901 | crash | crash |
Adobe Reader | DC2019.010.20098 | crash | ok |
Calculator | 10.1812.10048.0 | ok | ok |
...(其余应用结果) |
发现一个影响多个无关应用的共同问题:当模糊测试器发送WM_DEVICECHANGE消息时,甚至会导致最简单的官方Windows API HelloWorld示例程序崩溃(图3)。进一步分析表明该问题仅影响32位应用程序,问题根源在于wow64win.dll(32到64位兼容层)中的whcbfnINDEVICECHANGE函数将wParam作为指向DEV_BROADCAST_HANDLE64结构的指针处理,在转换到32位结构时因指向无效内存而崩溃。已向MSRC报告此问题,确认为非安全问题。
窗口消息是Windows程序中未被充分重视的非可信输入源。即使距首个开源窗口消息模糊测试器部署已19年,93%的测试应用在面对相同测试器时仍会冻结或崩溃。某些应用能优雅处理这些畸形输入的事实令人鼓舞,表明某些组织已建立避免这些错误的框架和制度知识。
窗口消息模糊测试仍有很大改进空间——最简单的测试方法就能使93%的应用崩溃。可能存在窗口消息跨越真实安全边界的实例,鼓励进一步探索此领域。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。