BSidesLison2016-Keynote-The Smart Fuzzer Revolution by Dan Guido
演讲者:Dan Guido 解读:CSDN@IT鹅
智能模糊测试在未来市场具有巨大潜能,掌握这套技术意味着我们对更多的安全产生了威胁,正如棱角的一句话来讲:
“网络本是安全的,自从又了安全研究员,就不安全了”。
1988年,华盛顿大学的一个教操作系统课程的教授要求学生编写一个程序,该程序通过其他
UNIX命令进行随机输入,我们就像丢垃圾一样像程序里丢数据,我们希望能得到不同的结果。
出人意料,这是一个有效的策略。
Random:“cat /dev/urandom | program”
-Class assignment in "Advanced Operating Systems"at University of Wisconsion(1988)
Generation:Write a BNF spec->introduce anomalies
-PROTOS from OUSPG(2002)&Block-based Fuzzing from Dave Aitel(2002)
在21世纪初期,人们想设计一种特殊的数据结构来对程序测试,有很多小组在参与研究,
奥卢大学与夏威夷大学创建了protos,Dave发表了关于他基于块的模糊测试的创新性论文。
这篇论文成为shell编码器手册中重要的章节。他的论文是Fuzzing的开端。
同时我们还研究了基于突变的模糊测试,这是一种资源密集型的测试,此时的模糊测试出现了
语料集(generate data)
我们通过自己搜集的数据,进行翻转、变异、改变形式的方式生成你的语料集
所有的共同点:
Apply random mutations to well-formed inputs and observe the results.
之后Fuzzing研究者改变这个策略。
目前已经创建了测量代码覆盖率并创建最小的输入集
Measure coverage and create a minimized input set
我们就能够判断哪些数据对程序造成影响,就排除了冗杂输入数据,而不是随机运行。
一旦我们发现了crash,一个有效的崩溃输入,我们就能解释程序的状态,通过模糊测试探索它
周围的代码,崩溃输入一般是聚集在一起的。
Initial attempts at combining SMT solvers and Symbolic Execution for test
generation(EXE[2006],DART[2005])
在2005-2006年,fuzzing将具体的执行与符号相结合。
Microsoft的研究团队在2008年带来了智能模糊测试(Smart Fuzzing)的策略。
Scalable,Automated, Guided Execution(SAGE)in “Automated Whitebox Fuzz Testing”
成效:
Combine fuzzing and symbolic execution to dynamically generate new tests,
while managing"state explosion"problems
1.Record execution and symbolically evaluate trace to gather new constrains
2.Use constraint solver to produce new inputs that execise new control paths
3.Measure code coverage to rank new inputs that attain maximal testing path
解读:
1.记录输入并且象征性地跟踪新的约束求解器
2.使用约束求解器生成执行新控制路径的新输入
3.测量代码覆盖率以对达到最大测试路径的新输入进行排名
Sage被微软广泛应用在windows7中
成效:
Pre-SAGE statements like if(x+y=z)or simple checksums would stymie a fuzzer,
Now they solved easily and help find new inputs.
Sage优点:
Works on binary, no source code requierd.
Handles real,very large applications.
Does not require a cache of starting inputs,or grammers.
No fales positive.It finds real bugs and generates input that trigger them
sage并且可以让它找到BUG,它不需要开发人员测试一大堆数据。
sage可以在没有源码的情况下直接对二进制文件进行Fuzzing,比如你可以在Microsoft Office上与性能
sage在Microsoft AFL开源之外,AFL并不是那么”聪明“。
它不能像sage一样使用symboolic execution符号执行,但是AFL更容易安装使用,并且开源。
Fuzzer可以找到sequel light和Java score等漏洞。并且打开OpenSSL与openssh
Sage很聪明,但是没有微软的支持,我们无法使用,虽然AFL很笨,但是我们能轻松使用。
哪一个更好呢?
大约在2012年-2013年
DARPA已经确定这是一个问题,他们想攻击,他们认为自动发现的错误的工具能整合他们的研究,
所以这是成立Cyber Grand Challenge的计划。
Cyber Grand Challenge(CGC)
最早的蓝队防守:
团队需要构建一个Cyber Reasoning Systems(CRS)
CRS需要给出“CBs” pwnables
CRS需要找到“Proof of Vulnerability”(POV)
获得一些寄存器控制的输入,防守方需要去修复,并且保持服务器正常运行。以便其他竞争对手可以继续
搜集Flag,
CRS’s are ranked by a complex scoring algorithm(就如CTF有一套复杂的记分方式)
Every published strategy has been the same combinaation of ingredients:
-Fuzzing模糊测试
-Symbolic Execution符号执行框架
-Other program analyses(alias analysis,reachability,input dependence)
-其他程序分析(别名分析、可达性、输入依赖)
-Prioritization scheme for which problems to solve 解决问题的优先级方案
-State pruning scheme状态修剪方案
-Resource control and allocaton资源控制和分配
CRS中解决的问题:“Analysis Boosting”
我们不可能支付巨额的工资进行研究,所以我们需要“开源”,需要得到大多数人的支持,因为这样整体技术
才能得到进步。我们搜集了各种测试错误的工具,搜集了这些所有输入生成将它们放入知识库(KnowledgeBase)
我们称Minset:Minimum Set of Maximal,即为这些输入的最大代码覆盖率的最小集。我们通过最大代码覆盖率的最小集
评估最好的Fuzzing数据,接着会把这些数据共享给其他工具,如果一个模糊器卡住了,它会到Symbolic Execution框架,
该框架的程序会克服chesksum校验并且创建一个新的输入,获得更多的代码覆盖率(code coverage),接着获得更多的Minimum
Set of Maximal,接着Minimum set会将它重新Fuzzing。现在一个模糊器可以绕过测试中卡住的代码。
然而学术界上对Fuzzing并不是很认同,他们主要是在程序语言等方面研究,正如我们所见在第一次安全性初次尝试之后,模糊测试就停止了,研究者们从来没有想到如此实用,他们不了解某些论文的价值,直到他们在CTF竞赛中使用,然而大部分人都不清楚如何构建这套系统,大规模工作以发现错误的分布式系统。
一些程序可能遇到的问题:
.One or more exploitable or crashing vulnerabilites.一个或多个崩溃漏洞。
.One or more proof of vulnerability triggers一个或多个漏洞触发证据
buffer overflow缓冲区溢出漏洞 stack overflow栈溢出漏洞 heap overflow堆漏洞
type confusion类型混淆漏洞等,我们都可以用Fuzzing方式去寻找,我们通过一个工具Fuzzing找到
类型混淆漏洞,我们又通过另外一个工具找到Buffer Overflow,然后我们将两者结合起来,我们就能得带
更高的覆盖率。
关于CGC竞赛:
大多数团队构建的系统都需要专家操作,CGC评分或规则未解决可用性问题。他们为 DARPA 的研究操作系统专门构建了系统:DECREE,只有6个系统调用,没有文件、线程或信号。
CGC竞赛有很多分散漏洞的因素:自动修补、网络设备、资源限制等。4
CGC为自动化分析领域提供了急需的推动力,而且恰逢其时。现在很明显,自动错误发现是可能的,而且非常有效。
目前有几个原型系统,其中一部分已经开源。为CGC带来的挑战为比较自动错误发现工具提供了标准基准。 错误查找工具终于具有可比性。
Going Mainstream走向主流:
自动化错误发现与和智能模糊测试是从机器学习Machine Learning开始,10年前没有一个可靠的技术指标来比较技术
与其他系统,例如SE Comp系统的出现,让机器学习的不同策略之间能够持续的竞争
微软有个一Springfield项目,你可以通过注册访问他。
https://www.microsoft.com/en-us/springfield/
Google有一个在Cloud中运行的Fuzzing工具oss-fuzz
https://github.com/google/oss-fuzz
苹果公司在IOS10中使用了LLVM技术,可以分析App Store中应用程序的字节码或者位码,可以通过LLVM轻松的分析这些
应用程序,从而找到最基础的安全漏洞。例如API滥用和隐私泄漏等。
大部分主流的公司在开发实践中使用了它,可能会向公众开放一些技术。
自动分析所有应用程序的错误、后门和 API 滥用,苹果可以在一定程度上将他们的应用程序推销为可证明是安全的。 或者让你重新提交你的应用程序,直到它通过,每个竞争对手都必须匹配这些功能。
ALF让我们需要从前专家操作的东西消失,计算机软件的安全可以上升到国家安全层面,软件的漏洞也是不可忽视的。
安全影响每个人,但没有人愿意付费,但是一个清晰的“项目分析 = 利润”商业案例将解决这个问题。