模糊测试的30年回溯
在2019年到来之际,我们通过复现1989年Barton P. Miller的经典论文《UNIX工具可靠性实证研究》及其1995年后续《Fuzz Revisited》中的方法,在现代Ubuntu Linux系统中依然发现了漏洞。原始论文中预见的C语言安全问题(如缓冲区溢出)至今仍影响着代码安全。
方法论重现
测试完全采用原始论文的代码库fuzz-1995-basic,仅替换了部分已淘汰的工具:
cfe → cc1
:C预处理器dbx → gdb
:调试器ditroff → groff
:排版工具f77 → fort77
:Fortran77编译器(使用1989年发布的f2c转换器)
测试结果对比
系统版本 | 崩溃数 | 挂起数 | 测试总数 | 故障率 |
---|---|---|---|---|
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后被发行版层面修补。 -
30年历史的缓冲区溢出
f77
调用的f2c
转换器中存在自1989年保留至今的sprintf
固定缓冲区溢出:1 2
char buff[100]; sprintf(buff, s, t); // 可变长度字符串写入固定缓冲区
-
经典死锁
spell
与ispell
通过管道通信时,因写入超过4096字节的行导致双向阻塞:spell
等待完整行读取ispell
等待确认信号
历史启示
原始论文已预见C语言类型系统和gets
函数的风险,但直到15-20年后模糊测试才成为行业标准。现代Linux虽将故障率从9%降至2%,但基础安全问题仍持续存在。这印证了论文的核心观点:即使是最简单的模糊测试,也能持续暴露深层缺陷。
下期预告:《2000年代的模糊测试》将对比Windows 10与NT/2000应用在消息模糊测试中的表现——答案或许早已在预料之中。