穿越30年的模糊测试:1989年的技术如何在2018年依然发现Linux漏洞

本文通过复现1989年原始模糊测试论文的方法,在现代Ubuntu系统上发现依然存在的漏洞,包括glibc缺陷、缓冲区溢出和死锁问题,揭示了基础安全问题的持久性。

模糊测试的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%

关键漏洞分析

  1. glibc缺陷
    通过ul工具触发的glibc漏洞(2016年报告未修复),在Ubuntu 18.04后被发行版层面修补。

  2. 30年历史的缓冲区溢出
    f77调用的f2c转换器中存在自1989年保留至今的sprintf固定缓冲区溢出:

    1
    2
    
    char buff[100];
    sprintf(buff, s, t);  // 可变长度字符串写入固定缓冲区
    
  3. 经典死锁
    spellispell通过管道通信时,因写入超过4096字节的行导致双向阻塞:

    • spell等待完整行读取
    • ispell等待确认信号

历史启示

原始论文已预见C语言类型系统和gets函数的风险,但直到15-20年后模糊测试才成为行业标准。现代Linux虽将故障率从9%降至2%,但基础安全问题仍持续存在。这印证了论文的核心观点:即使是最简单的模糊测试,也能持续暴露深层缺陷

下期预告:《2000年代的模糊测试》将对比Windows 10与NT/2000应用在消息模糊测试中的表现——答案或许早已在预料之中。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计