4.2. 白盒Fuzz

4.2.1. 简介

白盒Fuzz在测试之前通常会先对应用进行分析,获取一定的信息来辅助其创建的输入能在应用程序中发现崩溃。

其通常遇到的问题是一个应用程序一般有有许多分支,然后形成许多可能的执行流。不过如果有了很大的测试空间,就有可能创建几乎无限的输入来遍历所有的执行流。一般白盒Fuzz会试图创造在更少的输入的同时来尽量覆盖更多的路径。目前也有一些研究取得了成果,比如CRAX[1-2]就用符号执行的方式完成了一个白盒浏览器漏洞Fuzz工具。

但是由于执行流程过多和复杂的约束,白盒Fuzz在应用程序中可能并不精确。 此外,白盒Fuzz分析应用程序需要比较多的时间,所以浏览器Fuzz一般仍以黑盒Fuzz为主。

4.2.2. 符号执行

符号执行是白盒Fuzz的一个常用技术。其关键思想就是,把输入变为符号值,那么程序计算的输出值就是一个符号输入值的函数。这个符号化的过程在文章[1-9]中已有简要阐述,简而言之,就是一个程序执行的路径通常是true和false条件的序列,这些条件是在分支语句处产生的。

符号执行要解决的问题主要是路径选择、约束求解、内存建模、处理并发这几个方面。