模糊测试
2016年,模糊测试美国海军研究生院的模糊测试一个研究团队用模糊测试工具跑了不到72小时,就在Windows 7的模糊测试内核里挖出了十几个此前从未被发现的漏洞。微软安全响应中心的模糊测试人起初不太相信——这套系统经过了多少轮内部审计和商业扫描工具?结果他们复现了全部漏洞。这件事在圈内传开之后,模糊测试模糊测试才算真正从学术论文里走出来,模糊测试变成了工业界的模糊测试常规武器。 说白了,模糊测试模糊测试就是模糊测试往程序嘴里塞各种乱七八糟的东西,看它会不会噎着。模糊测试塞的模糊测试是随机数据、畸形输入、模糊测试边界值附近的模糊测试变异样本。程序如果崩溃了、模糊测试卡死了、模糊测试内存读飞了,那就说明有问题。思路极其朴素,甚至有点笨。但偏偏就是这种笨办法,抓住了一大批聪明办法漏掉的东西。 为什么?因为传统测试是“验证已知”——你知道程序应该做什么,然后写用例去确认它做到了。模糊测试是“暴露未知”——你根本不知道程序在什么情况下会出问题,那就让机器替你穷举那些你想不到的情况。人的想象力有边界,随机变异没有。 拿AFL这个工具举例。它做的事情听起来很简单:给一个初始输入样本,不断做字节翻转、插入、删除,把变异后的数据喂给目标程序,同时用插桩技术监控代码覆盖率。如果某个变异输入让程序走到了新的代码分支,就把它保留下来作为下一轮变异的种子。这个反馈循环一跑起来,就像滚雪球一样,覆盖面越来越广,挖到的崩溃越来越多。Google的OSS-Fuzz项目用类似思路跑了几年,在开源软件里找到了超过一万个安全漏洞,涉及Chrome、OpenSSL、FFmpeg这些核心组件。 不过模糊测试也不是万能药。它有个让人头疼的问题:盲目性。大部分随机变异产生的输入会被程序在解析阶段就拒绝掉,根本走不到深层逻辑。就像一个保安把你拦在门口,你连大厅都进不去,更别提找到保险柜的弱点了。为了解决这个问题,研究者搞出了基于语法规则的变异、基于符号执行的混合模糊测试等等。说白了就是给随机过程加点方向感。 另一个现实问题是,跑模糊测试烧算力。大规模的模糊测试集群动辄几百上千个CPU核心同时跑,跑几天甚至几周。小团队玩不起这个。但换个角度想,一台普通笔记本跑AFL,针对一个小型解析器,一晚上也能跑出不少东西。门槛没有想象中那么高。 我自己的经验是,模糊测试最让人上瘾的时刻,不是它找到漏洞的那一秒,而是你看着覆盖率曲线慢慢往上爬,突然某个变异样本让程序走进了一段你以为永远不会被触发的代码。那种感觉像是拿手电筒在黑暗里照,你以为墙角就那么点大,结果光打过去发现后面还有一条走廊。 如果你打算试试,别一上来就冲着Chrome或者Linux内核去。找个小的、开源的、处理文件格式的库,比如解析PNG或者JSON的。写个简单的harness,编译时加上AFL的插桩,准备几个合法的输入样本丢进去,然后等着就行。第一次看到“crash found”出现在终端里的时候,你会明白为什么有人愿意花整个周末盯着这个东西看。
-
上一篇
-
下一篇
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-