2020 S&P-SAVIOR: Towards Bug-Driven Hybrid Testing

摘要:混合测试结合了模糊测试和协同执行。它利用模糊测试来测试容易到达的代码区域,并使用concolic执行来探索由复杂分支条件保护的代码块。因此,与模糊测试或协同执行相比,混合测试能够深入到程序状态空间。最近,混合测试取得了重大进展。然而,其以代码覆盖率为中心的设计在漏洞检测方面效率低下。首先,它盲目地为concolic执行选择种子,并旨在不断探索新代码。然而,正如统计数据所显示的,大部分探索的代码通常都没有bug。因此,在混合测试期间对代码的每个部分给予同等关注是一种非最优策略。它将实际漏洞的检测速度降低了43%以上。第二,经典的混合测试在到达一段代码后会迅速进行,而不是检查其中隐藏的缺陷。尽管它已经探索了易受攻击的代码路径,但它可能经常漏掉细微的漏洞。
我们提出SAVIOR,这是一个新的混合测试框架,开创了bug驱动的原则。与现有的混合测试工具不同,SAVIOR优先考虑共同执行可能会发现更多漏洞的种子。此外,SAVIOR会验证执行程序路径上所有易受攻击的程序位置。通过使用SMT约束对故障情况进行建模,SAVIOR分析了漏洞的可行性,并生成了具体的测试用例作为证据。我们的评估表明,bug驱动的方法优于主流的自动化测试技术,包括由代码覆盖率驱动的最先进的混合测试系统。平均而言,SAVIOR检测漏洞的速度比DRILLER快43.4%,比QSYM快44.3%,分别发现了88个和76个独特的漏洞。根据对11个模糊的基准测试程序的评估,在最初的24小时内,SAVIOR触发了481个瑞银违规,其中243个是真正的bug。

I. INTRODUCTION

Bug 驱动的优先级划分: SAVIOR 不会在 concolic 执行中不加区别地运行所有种子,而是优先考虑那些更有可能导致漏洞的种子。具体来说,在测试之前,SAVIOR会分析源代码,并静态标记目标程序中可能易受攻击的位置。在这里,SAVIOR遵循现有的方法[21,35]来保守地标记所有可疑的位置。此外,SAVIOR 计算 可从每个分支访问的基本块集。优先考虑可以访问更重要分支(即,其可访问代码具有更多漏洞标签的分支)的共同执行种子。
错误引导的验证:除了加速漏洞检测外,SAVIOR还沿着Concoli执行器遍历的程序路径验证标记的漏洞。具体来说,SAVIOR综合了触发执行路径上每个漏洞的错误约束。如果当前路径条件下的约束是可满足的,SAVIOR将解决该约束以构造测试输入作为证明。否则,SAVIOR证明,无论输入如何,该漏洞在此路径上都是不可行的。

II. BACKGROUND AND MOTIVATION

这项工作的动机是漏洞检测中混合测试的局限性。在本节中,我们首先介绍混合测试的背景,然后通过两个例子说明其局限性。

A.混合测试

B. Motivation

覆盖易受攻击代码的效率低下:尽管混合测试专门进行覆盖驱动的测试,但它仍然需要大量时间来饱和难以到达的代码分区,这通常会超支时间预算。为了在有限的时间内发现更多漏洞,一种直观的方法是优先测试易受攻击的代码。然而,第II-A节中介绍的当前混合测试方法不符合该要求。
漏洞检测的缺陷:混合测试通常无法识别漏洞,即使它沿着正确的路径接近易受攻击的位置。图2展示了objdump-2.29中的整数溢出。在第12行,程序将一个值从秒复制到节→大小接下来,该值用作第15行的内存分配请求的大小。通过仔细地手工输入,对手可以做出正确的判断→大小在32位系统上为232-1,在64位系统上为264-1。这是一个完整的部分→大小+1大约为0,使malloc返回一个零字节缓冲区。当进一步使用缓冲区时,会发生segfault或内存泄漏。
在这里插入图片描述
在这个例子中,杂交测试可以快速生成一个种子,以命中15号线。然而,它几乎无法触发整数溢出。因为程序没有对传播到节的输入字节施加任何约束→大小,杂交测试只能进行随机变异来合成极值。考虑到巨大的可能性空间(232或264),突变不太可能成功。

III. DESIGN

A. Core Techniques

Bug驱动的优先级排序:回想一下,经典的混合测试盲目地为concolic执行安排种子,而没有权衡它们的Bug检测潜力。这会大大推迟漏洞的发现。为了弥补这一局限性,SAVIOR从目标源代码收集信息,对可能触发漏洞的可能性更高的种子进行优先排序。然而,这种方法需要预测在种子上运行concolic执行可能暴露的漏洞数量。预测基本上取决于两个先决条件:R1——一种在种子上共同执行后评估可到达代码区域的方法;R2——一种量化一段代码中漏洞数量的指标。救世主满足他们如下。
为了满足R1的要求,SAVIOR基于静态和动态分析的组合来近似新探索的代码区域。在编译过程中,SAVIOR静态计算每个分支的可访问基本块集。在运行时,SAVIOR识别种子执行路径上未探索的分支,并计算可从这些分支访问的基本块。我们认为,一旦concolic执行器运行该种子,这些块就成为可探索的代码区域。
为了满足R2的要求,SAVIOR利用UBSan[21

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值