写点什么

1989 年的模糊测试技术如何在 2018 年仍发现 Linux 漏洞

作者:qife122
  • 2025-08-18
    福建
  • 本文字数:900 字

    阅读完需:约 3 分钟

1989 年的模糊测试技术

随着 2019 年临近,让我们回顾历史寻求改进。我们将目光投向 30 年前,重新审视模糊测试的开山之作:Barton P. Miller 教授 1990 年发表的《UNIX 工具可靠性实证研究》及其 1995 年续作《模糊测试再探》。


本文将使用原始论文中完全相同的测试工具,在现代 Ubuntu Linux 系统中寻找漏洞。这两篇论文不仅提供了研究背景,更包含了惊人的预见性——它们准确预测了随后十年代码中普遍存在的漏洞类型。

技术概览

模糊测试程序通过生成随机字符流(可选择可打印字符/控制字符/非打印字符)进行测试,其核心特性包括:


  • 使用随机种子确保结果可复现(现代模糊测试工具常缺失此功能)

  • 通过脚本自动检测程序崩溃(生成 core dump)

  • 手动识别程序挂起

  • 适配器支持交互式程序(1990)、网络服务(1995)和 X 图形程序(1995)测试


原始研究覆盖 4 种处理器架构(i386/CVAX/Sparc/68020)和 5 个操作系统(4.3BSD/SunOS/AIX/Xenix/Dynix)。结果显示:


  • 1990 年测试中 25-33%工具存在故障

  • 1995 年测试中 GNU/Linux 故障率最低(9%)

现代复现方法

我们使用 1995 年代码库fuzz-1995-basic进行测试,仅更新测试目标列表以适配现代 Linux 环境。测试工具链保持原始状态,仅对部分过时软件包进行等效替换:


测试结果对比

典型漏洞分析

  1. glibc 缓冲区溢出

  2. ul工具中发现的实际上是 glibc 漏洞(2016 年报告仍未修复),表现为sprintf写入固定长度缓冲区的经典问题:


   errstr(const char *s, const char *t) {     char buff[100];     sprintf(buff, s, t);  // 缓冲区溢出风险     err(buff);   }
复制代码


  1. 拼写检查死锁

  2. spellispell通过管道通信时产生经典死锁:

  3. spell阻塞写入超过 4096 字节的行

  4. ispell阻塞等待确认已读取修正数据

  5. Fortran 编译器崩溃

  6. f2c转换器中的错误处理函数存在 30 年历史遗留漏洞,其变更日志可追溯至 1989 年。

历史启示

原始论文的三大预言至今有效:


  1. C 语言类型系统存在根本缺陷

  2. 基础模糊测试始终有效

  3. 开发者修复漏洞意愿低下


尽管现代 Linux 系统故障率已从 9%降至 2%,但完全消除基础性漏洞仍需持续努力。这项研究证明,即使是最简单的自动化测试方法,经过 30 年仍能发现当代软件中的关键缺陷。


(全文完)更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)公众号二维码


办公AI智能小助手


用户头像

qife122

关注

还未添加个人签名 2021-05-19 加入

还未添加个人简介

评论

发布
暂无评论
1989年的模糊测试技术如何在2018年仍发现Linux漏洞_漏洞挖掘_qife122_InfoQ写作社区