HEAPHOPPER: Bringing Bounded Model Checking to Heap Implementation Security

Abstract

堆元数据攻击已成为攻击者利用内存损坏漏洞的主要方式之一。虽然堆实现开发人员已经引入了缓解来防止和检测损坏,但攻击者仍然可以解决这些问题。在某种程度上,这是因为这些缓解是在没有原则基础的情况下创建和评估的,因此在许多情况下会导致堆元数据防御的复杂,低效和无效尝试。在本文中,我们提出了HEAPHOPPER,一种基于模型检查和符号执行的自动化方法,用于分析存在内存损坏时堆实现的可利用性。使用HEAPHOPPER,我们能够对不同的,广泛使用的堆实现进行系统分析,找到它们中令人惊讶的弱点。例如,我们的结果显示了ptmalloc中新引入的缓存机制(大多数Linux发行版使用的堆分配器实现)如何显著削弱其安全性。此外,HEAPHOPPER指导我们实施和评估对ptmalloc安全性的改进,用有效防御替代最近无效的缓解特定形式的堆元数据损坏的尝试。

阅读更多

Check It Again: Detecting Lacking-Recheck Bugs in OS Kernels

Abstract

论文中,作者主要介绍分析操作系统内核中的LRC(lacking-recheck)类型bug。并介绍了自己设计的一个静态分析系统LRSan(在Linux上实现),用于检测操作系统内核中的LRC bug。本文的主要贡献: 1. 定义了LRC bugs,并第一次展示了关于LRC bug的深入研究。 2. 实现一个自动化的LRC bug检测系统(LRSan),基于LLVM,使用在Linux内核上,可以检测内核中的LRC bug。LRSan运用了很多新的程序静态分析技术。结果显示LRSan在Linux内核发现了2808个LRC case,检测耗时为4小时。并且作者会将它开源。 3. 识别Security check(SC)和相关Critical variable(CV)的方法。 4. 发现了Linux内核中的19个新的LRC bug。

阅读更多

Automated Detection Exploitation and Elimination of Double-Fetch Bugs Using Modern CPU Features

Abstract

Double-fetch bugs 是一种特殊的条件竞争,在高权限线程的time-of-check和time-of-use之间,低权限线程能够修改共享的内存,导致高权限线程访问的内存产生不一致。本文作者提出了一种检测,利用并消除double-fetch bugs的技术DECAF和Dropit。总体来说,贡献如下:1. 把cache attack与kernel fuzzing结合起来。2. 首个自动化的挖掘double-fetch bugs的方法。3. 利用的成功率高达97%。4.利用Hardware Transactional Memory的特性,消除double-fetch bugs。5.方法对fuzz TEE也有效。

阅读更多

VUzzer: Application-aware Evolutionary Fuzzing

Abstract

Fuzzing是一种有效的软件测试技术,用于查找错误。考虑到实际应用程序的大小和复杂性,现代模糊器往往是可扩展的,但在探索执行更深层次的错误或者能够在应用程序中深入渗透但不具有可扩展性方面无效。在本文中,我们提出了一种应用程序感知的进化模糊测试策略,它不需要任何有关应用程序或输入格式的先验知识。为了最大化覆盖范围并探索更深入的路径,我们利用基于静态和动态分析的控制和数据流特征来推断应用程序的基本属性。与应用程序无关的方法相比,这可以更快地生成有趣的输入。我们在VUzzer中实现我们的模糊测试策略并在三个不同的数据集上进行评估:DARPA Grand Challenge二进制文件(CGC),一组实际应用程序(二进制输入解析器)和最近发布的LAVA数据集。在所有这些数据集中,通过快速查找几个现有和新的错误,VUzzer产生的结果明显优于最先进的模糊器。

阅读更多

NAR-Miner Discovering Negative Association Rules from Code

Abstract

从基于数据挖掘技术的源代码推断编程规则已被证明对检测软件错误是有效的。现有研究侧重于以A⇒B的形式发现积极规则,表明当操作A出现时,操作B也应该在这里。不幸的是,负面规则(A⇒¬B),表明程序元素之间的相互抑制或冲突关系,没有得到应有的重视。事实上,违反这些负面规则也会导致严重的错误。在本文中,我们提出了一种名为NAR-Miner的新方法,可以从大规模系统中自动提取负关联编程规则,并检测它们的违规行为来发现bug。然而,挖掘负面规则面临着比挖掘正面规则更严重的规则爆炸问题。大多数获得的负面规则都是无趣的,并且可能导致不可接受的错误警报。为了解决这个问题,我们设计了一个语义约束的挖掘算法,将规则挖掘集中在具有强语义关系的元素上。此外,我们引入信息熵来排列候选负面规则并突出有趣的规则。因此,我们有效地缓解了规则爆炸问题。我们实现NAR-Miner并将其应用于Linux内核(v4.12-rc6)。实验表明,不感兴趣的规则大大减少,检测到的17个违规行为已被确认为真正的错误并被内核社区修补。我们还将NAR-Miner应用于PostgreSQL,OpenSSL和FFmpeg,并发现了六个真正的错误。

阅读更多

Superset Disassembly: Statically Rewriting X86 Binaries Without Heuristics Disassembly

Abstract

静态代码重写是系统安全应用的一项核心技术,它的使用场景包括性能分析,优化和软件错误定位等。之前的许多静态二进制程序重写方法,例如CCFIR, PITTSFIELD, Google’s Native Client, BinCFI, UROBOROS等,在保证重写正确时,提出了有关二进制程序的许多假定,例如完全正确的反汇编,编译器要求,调试符号等等,给实际应用在Commercial off-the-shelf(COTS)二进制程序上制造了困难。作者提供了multiverse,一个新的二进制程序重写器,它不基于上述的任何假定并能够重写intel x86 COTS程序。在COTS二进制程序重写中,存在着两大挑战: (1)如何反汇编二进制代码并包含所有合法指令 (2)如何重新汇编重写后的指令并保留原程序的语义。multiverse使用了两种技术分别解决这两大挑战:(1)superset disassembly:通过对所有offset起始的地址进行反汇编获得合法代码的superset。 (2)instruction rewriter:通过替换控制流转移指令,中转到一个映射表,能够将原程序中所有的指令重定位到任意其他位置。

阅读更多

Angora: Efficient Fuzzing by Principled Search

Abstract

​ Fuzzing是一种用于查找软件错误的流行技术。然而,最先进的模糊器的性能还有很多不足之处。基于符号执行的模糊器产生高质量输入但运行缓慢,而基于随机变异的模糊器运行速度快但难以产生高质量输入。我们提出了一种新的基于突变的模糊器Angora,它的性能远远超过了最先进的模糊器。Angora的主要目标是通过解决路径约束来增加分支覆盖率而无需符号执行。为了有效地解决路径约束,我们引入了几个关键技术:可扩展的字节级污点跟踪,上下文敏感的分支计数,基于梯度下降的搜索和输入长度探索。在LAVA-M数据集上,Angora发现了几乎所有注入的错误,发现了比我们比较的任何其他模糊器更多的错误,并且发现错误是程序中第二好的模糊器的8倍。Angora还发现了LAVA作者注射但却无法触发的103个错误。我们还在八个流行的,成熟的开源程序上测试了Angora。Angora分别在file,jhead,nm,objdump和size中发现了6,52,29,40和48个新错误。我们测量了Angora的覆盖范围,并评估了其关键技术如何促成其令人印象深刻的性能。

阅读更多