第1章:模糊测试基础理论

各位同学好,我是老张。在电信核心网这个行当摸爬滚打了十几年,今天咱们来聊聊模糊测试的基础理论。说实话,我刚入行那会儿,模糊测试还是个挺小众的技术,现在已经是安全测试的标配了。这一章,我会把最核心的概念掰开了讲清楚。

1.1 模糊测试的定义与分类

模糊测试,英文叫Fuzzing。说白了,就是往目标系统里塞各种畸形数据,看它会不会崩溃。我个人的理解更简单——用随机或半随机的方式,给程序喂它不该吃的东西

为什么会这样?因为很多安全漏洞,都是程序在处理异常输入时暴露的。你想想看,一个正常的SIP消息,协议栈处理得妥妥当当。但如果你把消息头里的某个字段改成超大长度,或者塞进一些特殊字符,很多实现就会出问题。

模糊测试的分类,我习惯从两个维度来看:

  • 按测试对象:协议模糊测试、文件格式模糊测试、API模糊测试、驱动模糊测试等
  • 按测试方法:黑盒、白盒、灰盒模糊测试

嗯,这里要注意,分类不是绝对的。我在项目中经常把几种方法混着用,效果反而更好。

核心要点:模糊测试的本质是异常输入生成 + 异常监控。没有监控的模糊测试,就像闭着眼睛扔飞镖——你永远不知道打没打中。

1.2 黑盒/白盒/灰盒模糊测试

这三种分类,主要看你对被测系统的了解程度。

黑盒模糊测试

黑盒,就是完全不知道内部结构。你只能看到输入和输出。我早期做电信协议测试时,经常用这种方法。对着协议规范,构造各种变异报文,然后看设备会不会挂。

优点很明显:简单、通用、不需要源码。缺点也很致命:效率低,很多代码路径根本走不到。

白盒模糊测试

白盒就不一样了。你有源码,甚至能插桩。我记得有一次做核心网MME的测试,我们拿到了部分源码,直接插桩跟踪代码覆盖率。那效率,比黑盒高了一个数量级。

白盒的核心是符号执行约束求解。说白了,就是分析代码路径,自动生成能触发特定分支的输入。但这东西计算量太大,复杂协议搞起来很慢。

灰盒模糊测试

灰盒是现在最主流的方式。它介于黑盒和白盒之间——不需要源码,但能通过一些手段获取反馈信息。最常见的就是覆盖率反馈

我曾经在测试5G核心网的AMF网元时,就用灰盒方法。通过插桩或者硬件追踪,拿到代码覆盖率,然后指导变异方向。效果非常好,一周内挖出了3个高危漏洞。

类型 信息掌握 效率 适用场景
黑盒 无内部信息 第三方设备、闭源系统
白盒 完全掌握 自研系统、源码可用
灰盒 部分反馈 中高 大多数实际场景

1.3 变异与生成策略

这是模糊测试的核心技术。简单说,就是怎么造出那些畸形数据。

变异策略

变异,就是拿一个合法的输入,然后改它。我常用的变异操作有:

  • 位翻转:把某些bit从0改成1,或者反过来
  • 字节替换:替换某些字节为随机值或特殊值
  • 长度修改:把长度字段改成超大值或负值
  • 插入/删除:在数据流中插入或删除一些字节

举个例子,一个SIP消息的Content-Length字段,正常值是100。你把它改成65535,很多协议栈就会出问题。我在项目中遇到过,某个厂商的SIP服务器,遇到超大的Content-Length直接内存溢出。

个人经验:变异策略中,边界值特殊字符是最容易出漏洞的。比如0x00、0xFF、超大整数、负数等。我每次做测试,都会优先覆盖这些点。

生成策略

生成,就是完全从零开始构造数据。这需要你对协议格式有深入了解。比如构造一个完整的SIP消息,每个字段都要符合规范,但某些字段的值是异常的。

生成策略的好处是覆盖率可控。你可以精确控制每个字段的值,确保所有协议路径都被测试到。缺点是需要写大量的模板代码。

我个人习惯,在项目初期用变异策略快速扫描,发现可疑点后再用生成策略做深度测试。两者结合,效果最好。

1.4 覆盖率引导的模糊测试

这是目前最先进的模糊测试方法。核心思想很简单:用代码覆盖率来指导测试用例的生成

为什么需要覆盖率引导?你想想看,纯随机的模糊测试,大部分时间都在重复测试相同的代码路径。真正危险的代码,可能根本走不到。

覆盖率引导的流程大概是这样的:

  1. 生成一个初始测试用例
  2. 用这个用例去测试目标程序
  3. 监控程序执行了哪些代码路径
  4. 如果发现了新的代码路径,就把这个用例保留下来
  5. 基于保留的用例进行变异,生成新的用例
  6. 重复2-5步

我在做5G核心网测试时,就用过AFL(American Fuzzy Lop)的思路。虽然AFL主要是文件格式的,但核心思想完全可以用在协议测试上。我们当时在SCTP层做了插桩,监控每个SCTP消息处理函数的覆盖率。结果发现,有些异常处理函数,之前从来没被触发过。

避坑指南:覆盖率引导虽然好,但要注意覆盖率反馈的准确性。我曾经遇到过,插桩代码本身影响了程序的执行流程,导致覆盖率数据失真。所以,一定要验证插桩的正确性。

下面这张图,是我自己总结的模糊测试知识体系。你可以看到,所有技术最终都指向一个目标——发现漏洞

模糊测试基础理论 定义与分类 黑盒/白盒/灰盒 变异与生成策略 覆盖率引导 协议模糊测试 文件格式模糊测试 黑盒:无内部信息 白盒:完全掌握 灰盒:部分反馈 变异:位翻转/替换 生成:从零构造 代码路径监控 反馈驱动变异 目标:发现漏洞,提升安全性 核心:异常输入生成 + 异常监控

好了,这一章的内容就到这里。模糊测试的基础理论,说白了就是搞清楚测什么、怎么测、怎么测得更聪明。后面的章节,我们会深入到具体的协议测试实战中,到时候这些理论都会用上。


专注资料整理