(论文阅读)★Finding Unstable Code via Compiler-Driven Differential Testing

Finding Unstable Code via Compiler-Driven Differential Testing 时间:2023 作者:Shaohua Li、Zhendong Su(苏黎世联邦理工) 会议:ASPLOS(CCF-A) 开源:shao-hua-li/compdiff (github.com) Abstract​ 不稳定的代码是指由于程序中存在未定义行为(UB),导致运行时语义不一致或不稳定的代码。编译器通过假设未定义行为永远不会发生来利用UB,从而生成高效但潜在语义不一致的二进制文件。实践者们在设计动态工具(例如sanitizers)来处理常见的UB问题时已付出了大量研究和工程努力。然而,目前的技术仍面临一个重大挑战,即如何检测那些超出当前技术范围的UB问题。 ​ 在本文中,我们介绍了一种名为Compiler-driven differential testing(CompDiff)的简单而有效的方法,用于发现C/C++程序中的不稳定代码。CompDiff利用了一个事实,即当编译不稳定代码时,不同的编译器实现可能会生成语义上不一致的二进制文件。我们的主要方法是检查相同输入上不同二进制文件的输出。输出的差异可能表明存在不稳定的代码。为了在实际程序中检测不稳定代码,我们还将CompDiff集成到AFL++中,这是最常用且积极维护的通用模糊测试工具。 ​ 尽管CompDiff的方法简单,但实践中非常有效:在Juliet基准程序上,相比于sanitizers,CompDiff独特地检测到1,409个错误;在23个流行的开源C/C++项目中,CompDiff-AFL++发现了78个新错误,其中52个已经被开发人员修复,而36个无法通过sanitizers检测出来。我们的评估还揭示了一个事实,即CompDiff的设计并不是为了取代当前的UB检测工具,而是为它们提供补充。

阅读全文

(论文阅读)UTOPIA-Automatic Generation of Fuzz Driver using Unit Tests

UTOPIA: Automatic Generation of Fuzz Driver using Unit Tests 时间:2022 作者:Bokdeuk Jeong、Joonun Jang(Samsung Research)、Taesoo Kim(佐治亚理工) 会议:S&P’2023 开源:https://github.com/Samsung/UTopia Abstract​ Fuzzing可以说是检测软件安全漏洞的最实用方法,但采用这种方法需要付出不小的努力。要想取得成效,高质量的fuzz driver程序应首先应当包含适当的 API 序列,以便详尽地探索程序状态。为减轻这一负担,现有解决方案试图通过从用户代码(即 API 的实际使用)中推断出有效的 API 序列,或直接从样本执行中提取 API 序列来生成fuzz driver程序。遗憾的是,所有现有方法都存在一个共同问题:观察到的 API 序列(无论是静态推断还是动态监控)都与自定义应用程序逻辑混杂在一起。然而,我们观察到,单元测试是由应用程序接口的实际设计者精心制作的,以验证其正确使用,而且重要的是,在开发过程中编写单元测试是一种常见做法(例如,超过 70% 的流行 GitHub 项目)。 ​ 在本文中,我们提出了一种开源工具和分析算法—UTOPIA,它可以从现有的单元测试中自动合成有效的fuzz driver程序,几乎不需要人工参与。为了证明其有效性,我们将 UTOPIA 应用于 55 个开源项目库,包括 Tizen 和 Node.js,并从 8K 个合格的单元测试中自动生成了 5K 个fuzz driver程序。此外,我们在每个内核上执行了约 500 万小时生成的fuzzer,发现了 123 个错误。更重要的是,2.4K 个生成的fuzz driver程序被Tizen项目的持续集成流程采用,这表明了合成fuzz driver程序的质量。为了让研究人员和从业人员更广泛地采用,我们公开并维护了所提出的工具和结果。

阅读全文

(论文阅读)FuzzBuilder- Automated building greybox fuzzing environment for C/C++ library

FuzzBuilder: Automated building greybox fuzzing environment for C/C++ library 时间:2019 作者:Joonun Jang、Huy Kang Kim(三星研究院、首尔大学) 会议:ACSAC 开源:https://github.com/hksecurity/FuzzBuilder Abstract​ Fuzzing是发现软件漏洞的一种有效方法,由于fuzzing发现的大多数错误都与安全漏洞有关,因此许多安全社区都对模糊测试这种验证软件安全性的自动化方法很感兴趣。然而,并非所有软件都能通过模糊测试进行测试,因为模糊测试需要运行环境,特别是可执行文件,值得注意的是,就库而言,大多数库实际上都没有相关的可执行文件。 ​ 因此,最先进的fuzzer在测试任意库方面存在局限性,为了克服这个问题,我们提出了 FuzzBuilder,为库提供自动fuzzing environment。FuzzBuilder生成的可执行文件会调用库的 API 函数,从而实现库模糊测试,此外,FuzzBuilder 生成的任何可执行文件都与 AFL 等现有模糊器兼容。 ​ 我们通过测试开源库来评估 FuzzBuilder 的整体性能。因此,我们在实现高代码覆盖率的同时发现了库中的未知错误。我们相信,FuzzBuilder 可以帮助安全研究人员节省库模糊测试的设置成本和学习成本。

阅读全文

(论文阅读)RULF-Rust Library Fuzzing via API Dependency Graph Traversal

RULF: Rust Library Fuzzing via API Dependency Graph Traversal 时间:2021 作者:Jianfeng Jiang、Hui Xu、Yangfan Zhou(复旦大学) 会议:ASE 开源:https://github.com/Artisan-Lab/RULF Abstract​ 鲁棒性是 Rust 库开发的一个关键问题,因为 Rust 承诺,如果开发人员只使用安全的 API,就不会出现未定义行为的风险。Fuzzing是检查程序鲁棒性的一种实用方法,然而,由于缺乏目标,现有的fuzzing工具并不能直接适用于library API。故这项工作主要依靠人工逐个设计fuzzing target,耗费大量人力物力。 ​ 为了解决这个问题,本文提出了一种新颖的自动fuzzing目标生成方法,通过遍历 API 依赖图来fuzzing Rust 库。我们确定了library fuzzing的几个基本要求,包括target的有效性、高 API 覆盖率和fuzzing的效率。为了满足这些要求,我们首先采用了带有剪枝功能的广度优先搜索,以找到长度低于阈值的 API 序列,然后反向搜索更长的序列以查找未覆盖的 API,最后将序列集作为集合覆盖问题进行优化。 ​ 我们实现了fuzz target生成器,并使用 AFL++ 在多个现实世界中流行的 Rust 项目上进行了fuzzing实验。我们的工具最终为每个库生成了 7 到 118 个fuzzing target,API 覆盖率高达 0.92。我们以 24 小时为阈值对每个目标进行测试,并从七个库中发现了 30 个以前未知的错误。

阅读全文

(论文阅读)GraphFuzz-Library API Fuzzing with Lifetime-aware Dataflow Graphs

GraphFuzz: Library API Fuzzing with Lifetime-aware Dataflow Graphs 时间:2022 作者:Harrison Green、Thanassis Avgerinos 会议:ICSE 开源:https://github.com/ForAllSecure/GraphFuzz Abstract​ 提出了一种新fuzzer:GraphFuzz,能够自动测试low-level Library APIs。与其他fuzzer不同的是,GraphFuzz 将已执行函数的序列建模为数据流图,因此能够在data和execution跟踪级别执行graph-based mutations。GraphFuzz 自带自动规范生成器,可最大限度地减少开发人员的集成工作。 ​ 我们使用 GraphFuzz 对 Skia(经过严格测试的 Google Chrome 浏览器图形库)进行分析,并将 GraphFuzz 生成的fuzzing harnesses与手工优化、精心编写的 libFuzzer harnesses进行比较。我们发现,GraphFuzz生成的测试用例平均代码覆盖率提高了2-3倍,而开发工作量却很小,而且在此过程中还发现了以前未知的缺陷。我们通过分析另外四个开源库,发现了数十个以前未知的缺陷,从而证明了 GraphFuzz 在low-level Library APIs上的适用性。开发人员已经报告并修复了所有与安全相关的发现。

阅读全文