Smart-Gerybox-fuzzing

Abstract CGF(coverage-based grebox fuzzing)是一种在自动化漏洞检测方面很成功的方法。通过给定种子文件,CGF能够随机的进行翻转,删除bit来生成新的文件。CGF通过保留那些增强覆盖率的生成文件来迭代地构建(和fuzz)种子语料库。然而,随机地bit翻转对于处理复杂文件格式的应用,可能不会产生有效的文件。 在本文中,我们介绍一种smart gerybox fuzzing(SGF)能够通过对种子文件进行高结构化的表示来生成新文件。我们定义了在虚拟文件结构上进行变异操作的方法,而不是在bit级别上的变异。这种SGF能够探索完整的新输入区域并且能够保证文件的完整性。我们引入了一种新颖的基于有效性的能力调度,使SGF能够花更多的时间生成更有可能通过程序解析阶段的文件,这可以让我们找到程序逻辑更深处的漏洞。 Motivation 许多安全关键的程序和库都是处理高度结构化的输入。例如,图片、音频、视频、数据库、文档或者电子表格文件等。CGF的变异操作往往都是bit级别的,容易生成无效的种子输入。 Implement Virtual structure 我们引入了一个轻量级的数据结构化表示-虚拟结构。每个输入文件表示成一个颗解析树。树上的节点代表chunk或者attribution。chunk是树的内部节点,attribution是树上的叶子节点。 每个chunk包含start和end-index,表示在文件中的起始和结束字节序列位置。type表示chunk的类别,用于与其他chunk区分(eg:fmt chunk or data chunk)。每个chunk包含0个或者多个chunk作为孩子节点,同时也可以是0个或者多个attribution。attribute代表了文件中与结构无关的重要数据。 Smart Mutation Operators Smart deletion: 删掉一个chunk,并将后面的索引修改。 Smart addition: 随机选择另一个seed s2, 并随机选择其中一个chunk C2放入到S1中,与C2的parent type相同的chunk内。 Smart splicing: 随机在S1和S2中选择两个type相同的chunk,将C2替代C1。 Stack mutations 为了生成interesting种子,将结构化变异和bit级别的变异一起使用是很有意义的。对于结构化变异,我们需要将文件和文件的虚拟结构同步更新,一个chunk的删除可能会影响到他的父节点的end_index。 Deferred Parsing 在实验中发现,虚拟结构的构建开销较大,解析输入只需要数秒。若是为每一个种子都构建虚拟结构,那么SGF的效率比传统的灰盒fuzz要差。为了克服这个问题,我们提出了一种deferred parsing的方法。 prob: 表示给种子s构建虚拟结构的概率 t: 上一次发现新路径的时间 ε: 阈值 当t>ε 时,构建新的虚拟结构。即,在小于ε时,采用bit-level变异;大于ε时,构建虚拟结构,使用结构化变异。 Validity-based...>

Your Exploit is Mine

发表会议 IEEE Symposium on Security and Privacy 2017 作者信息 Tiffany Bao, Ruoyu Wang, Yan Shoshitaishvili, David Brumley Carnegie Mellon University UC Santa Barbara 背景 构造远程利用往往是漏洞攻击的终极目标,攻击者可以通过其在不经过物理访问的基础上即实现对受害者机器的攻击,如安装后门、窃取敏感信息。然而,构造一个远程利用并不那么容易,需要对漏洞有深入的了解、绕过远程机器上的防御措施等。因此,与其从头构造一个新利用,攻击者往往会使用一个现有的利用,通过相应的改造使其实现不同的攻击目标。这就是本文提出的“shellcode transplant”的概念,即将原始利用中的shellcode替换为自定义的shellcode,从而使得漏洞利用的最后一步去执行攻击者注入的shellcode,达到新的攻击目的。 然而“shellcode transplant”问题并不是那么容易,主要存在这三个挑战: 由于不存在明确的边界,难以将一个利用中的shellcode和其余部分分割开; 即使能将shellcode和利用其余部分分割开,又由于shellcode往往是通过复杂的数据转换得来的,因此重写利用中shellcode的部分为新的shellcode并不那么直接简单; shellcode和利用其余部分可能相互依赖,从而导致对新替换的shellcode存在潜在的约束,而当这个约束与shellcode本身约束相矛盾时就需要对利用或shellcode进行相应地修改,使得它能正常工作 之前的利用自动生成相关工作是通过将攻击者可用的内存添加约束为目标shellcode来实现的,但这种方法是不充分的。最坏情况下,当shellcode约束和路径约束相冲突时,这些方法就会降级为对程序进行纯符号执行,从而会面临路径爆炸等问题。而当存在已有利用的前提下,我们可以通过现有利用提供的信息来减少路径探索规模。 为此,本文实现了称为“ShellSwap”的系统,它可以自动处理shellcode移植问题。ShellSwap接收一个现有的利用、一个用户指定的替换shellcode作为输入,生成一个与原利用针对漏洞相同的但实现了用户指定功能的新利用。通过符号执行和静态分析方法解决了上面提及的三个挑战: 能够识别出利用中的shellcode; 能够恢复shellcode数据转换,即不受数据转换的限制; 能够解决replacement shellcode引入的约束冲突。 通过充分利用原先exploit提供的信息,结合创造性地转换shellcode,ShellSwap几乎不会降级为一个纯符号探索的方法,从而对比原先方法则会更加有效。在本文实验中,ShellSwap成功生成了88%的新利用,成功率几乎是已有方法的3倍。 概览 本文针对的是控制流劫持类型的漏洞和利用。它包括两个阶段: 劫持前:设置程序状态state,使其能够实现劫持 劫持后:实施被注入的shellcode功能 我们将到达第一个阶段后的状态称为“exploitable state”(可利用状态),将到达可利用状态之前执行的程序指令序列称为“exploitable path”(可利用路径)。因此,如果我们能找到一个输入,它能沿着可利用路径执行,并在第二阶段能执行新的shellcode,那么这个输入就是我们想要的新利用。 上图是ShellSwap的整体框架,包括符号跟踪和shellcode移植两个模块。 Symbolic Tracing(符号跟踪) 重放利用攻击过程并记录下执行的指令序列;然后在符号跟踪引擎中按照执行序列进行符号跟踪,即保证符号执行走的指令序列和具值执行一致,最后记录下执行到劫持点(即上述第一个阶段结尾)时执行路径的约束(称为Path Constraints)和当前状态(即上面的Exploitable...>

Skyfire- Data-Driven Seed Generation for Fuzzing

发表会议 IEEE Symposium on Security and Privacy 2017 作者信息 Junjie Wang, Bihuan Chen†, Lei Wei, and Yang Liu Nanyang Technological University, Singapore {wang1043, bhchen, l.wei, yangliu}@ntu.edu.sg †Corresponding Author 摘要 对于输入格式是高度结构化文件的程序来说,其处理流程一般是:语法解析–语义检查–程序执行。程序深层次的漏洞一般隐藏在程序执行阶段, 而对于自动化的模糊测试(Fuzzing)来说很难触发该类漏洞。 该论文提出了一种数据驱动的种子生成方法,叫做Skyfire。Skyfire通过从大量的已知样本中学习而生成覆盖良好的种子作为Fuzzing的输入对处 理高度结构化输入的程序进行测试。Skyfire接收输入样本集合和文法,通过自动化学习PCSG(一种改了的上下文敏感的文法,包含语义规则和语 法特征),并利用其生成种子文件。 本文利用收集的样本和Skyfire生成的种子作为AFL的seed对开源的XSLT、XML等引擎进行测试,证明skyfire生成的种子文件分布(提高了20%行覆 盖率和15的函数覆盖率)和发现漏洞能力。同时也对闭源的IE11的JavaScript引擎测试。其发现了19个内存破坏型缺陷和32个DOS缺陷。 背景介绍 Fuzzing是一种自动化的随机测试技术,其通过变异或者生成的方法生成大量的测试样本,并利用生成的测试样本对目标程序进行测试和监控,以发现 程序异常和缺陷。模糊测试的输入种子文件的质量是对测试效果的重要影响因素。 一个高效的Fuzzer需要实现大部分的生成样本可以到达处理执行阶段(execution stage)。 基于变异的方法是通过随机或者启发式的方法对合法的输入种子文件进行变异生成测试用例,大部分的生成用例在早起的语法检查阶段就被拒绝而导致 程序退出。然而,基于生成的方法是利用格式描述或文法描述来生成测试用例,可以快速的通过语法检查阶段,但是大部分程序在语义检查阶段也难以 通过,这都限制了这些方法难以挖掘程序的深层次漏洞。 基于生成的方法能够实现对语法规则的描述和生成,但是想要通过语义规则确实非常困难的。一方面,对于不同的程序有不同的语义规则,编写的生 成规则难以复用,另一方面,这样的手动描述方法是非常耗时费力的,而且有时候甚至是难以实现的。 本文使用一种扩展的上下文敏感的文法(包含语义信息和概率信息)来生成测试用例,并将其作为Fuzzer的输入进行测试。Skyfire面向的目标程序是接收高度结构化输入的程序,本文主要针对XSL、XML、JavaScript等开源引擎进行测试,很大的提高了测试代码覆盖率,并发现了16个新的漏洞。 方法概述 生成目标 生成正确的种子:能够通过程序的语法和语义检测...>