重温1989年的模糊测试:30年后仍在发现漏洞

本文通过复现1989年原始模糊测试论文的方法,在现代Ubuntu系统上发现仍存在崩溃和死锁漏洞,包括glibc和f2c编译器中的历史遗留问题,揭示即使最简单的模糊测试也能持续发现安全问题。

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

关键漏洞分析

  1. glibc缓冲区溢出
    通过ul工具触发的glibc漏洞(2016年报告未修复),在Ubuntu 18.04后通过发行版补丁修复

  2. f2c编译器历史漏洞

    1
    2
    3
    4
    5
    
    errstr(const char *s, const char *t) {
      char buff[100];
      sprintf(buff, s, t); // 1989年遗留的固定缓冲区溢出
      err(buff);
    }
    
  3. 经典死锁案例
    spellispell因管道缓冲区限制(4096字节)产生双向阻塞

历史启示

1990年论文已预见:

  • C语言类型系统安全隐患
  • 格式字符串漏洞(比大规模利用早数年发现)
  • 40%的漏洞在5年后仍存在

现代启示

即使最基础的模糊测试仍能有效发现现代软件缺陷,但企业界花费了15-20年才将其列为标准实践。原始论文的结论至今有效:C语言使编写不安全代码过于容易,应尽可能避免。

下期预告:《2000年代的模糊测试》将对比Windows 10与NT/2000应用在消息模糊测试中的表现

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