模糊测试的30年回溯
2019年前夕,让我们回顾30年前Barton P. Miller教授的开创性论文《UNIX工具可靠性实证研究》及其1995年后续《Fuzz Revisited》。本文将使用原始论文中的相同工具在现代Ubuntu Linux系统中寻找漏洞。
核心方法论
原始模糊测试工具通过生成随机字符流(可指定可打印/控制字符)进行测试,其特点包括:
- 使用种子实现可复现结果(现代模糊测试常缺失的功能)
- 脚本自动检测程序崩溃(core dump)
- 手动识别程序挂起
- 适配器支持交互式程序/网络服务/X程序测试
跨时代测试结果对比
系统版本 | 崩溃数 | 挂起数 | 测试总数 | 故障率 |
---|---|---|---|---|
Slackware 2.1.0 (1995) | 4 | 1 | 55 | 9% |
Ubuntu 14.04 (2014) | 2 | 2 | 81 | 5% |
Ubuntu 18.10 (2018) | 1 | 1 | 81 | 2% |
关键漏洞分析
-
glibc缓冲区溢出
通过ul
工具触发的glibc漏洞(2016年报告未修复),在Ubuntu 18.04后通过发行版补丁修复 -
f2c编译器历史漏洞
1 2 3 4 5
errstr(const char *s, const char *t) { char buff[100]; sprintf(buff, s, t); // 1989年遗留的固定缓冲区溢出 err(buff); }
-
经典死锁案例
spell
与ispell
因管道缓冲区限制(4096字节)产生双向阻塞
历史启示
1990年论文已预见:
- C语言类型系统安全隐患
- 格式字符串漏洞(比大规模利用早数年发现)
- 40%的漏洞在5年后仍存在
现代启示
即使最基础的模糊测试仍能有效发现现代软件缺陷,但企业界花费了15-20年才将其列为标准实践。原始论文的结论至今有效:C语言使编写不安全代码过于容易,应尽可能避免。
下期预告:《2000年代的模糊测试》将对比Windows 10与NT/2000应用在消息模糊测试中的表现