第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 覆盖率引导的模糊测试
这是目前最先进的模糊测试方法。核心思想很简单:用代码覆盖率来指导测试用例的生成。
为什么需要覆盖率引导?你想想看,纯随机的模糊测试,大部分时间都在重复测试相同的代码路径。真正危险的代码,可能根本走不到。
覆盖率引导的流程大概是这样的:
- 生成一个初始测试用例
- 用这个用例去测试目标程序
- 监控程序执行了哪些代码路径
- 如果发现了新的代码路径,就把这个用例保留下来
- 基于保留的用例进行变异,生成新的用例
- 重复2-5步
我在做5G核心网测试时,就用过AFL(American Fuzzy Lop)的思路。虽然AFL主要是文件格式的,但核心思想完全可以用在协议测试上。我们当时在SCTP层做了插桩,监控每个SCTP消息处理函数的覆盖率。结果发现,有些异常处理函数,之前从来没被触发过。
避坑指南:覆盖率引导虽然好,但要注意覆盖率反馈的准确性。我曾经遇到过,插桩代码本身影响了程序的执行流程,导致覆盖率数据失真。所以,一定要验证插桩的正确性。
下面这张图,是我自己总结的模糊测试知识体系。你可以看到,所有技术最终都指向一个目标——发现漏洞。
好了,这一章的内容就到这里。模糊测试的基础理论,说白了就是搞清楚测什么、怎么测、怎么测得更聪明。后面的章节,我们会深入到具体的协议测试实战中,到时候这些理论都会用上。