[论文分享] 开源 C/C++静态软件缺陷检测工具实证研究

前言

之前读了一遍这篇论文
开源 C/C++静态软件缺陷检测工具实证研究[1] [软件学报 2022]
属于静态软件分析与漏洞挖掘工具及技术的综述性文章, 今天总结一下

(其他的水话就不多说了, 就像TK教主经常说的: 先干了再说

摘要

软件静态缺陷检测是软件安全领域中的一个研究热点.随着使用 C/C++语言编写的软件规模和复杂度的逐渐提高,软件迭代速度的逐渐加快,由于静态软件缺陷检测不需要运行目标代码即可发现其中潜藏的缺陷,因而在工业界和学术界受到了更广泛的关注.近年来涌现大量使用软件静态分析技术的检测工具,并在不同领域的软件项目中发挥了不可忽视的作用,但是高误报率是 C/C++静态缺陷检测工具难以普及的首要原因.
因此,我们选择现有较为完善的开源 C/C++静态缺陷检测工具,在 Juliet 基准测试集和 37 个良好维护的开源软件项目上对特定类型缺陷的检测效果进行了深入研究,结合检测工具的具体实现归纳了导致静态缺陷检测工具产生误报的关键原因.同时,我们通过研究静态缺陷检测工具的版本迁移轨迹,总结出了当下静态分析工具的发展方向和未来趋势,有助未来静态分析技术的优化和发展,从而实现静态缺陷检测工具的普及应用.

工作内容

通过研究具有代表性的开源 C/C++静态缺陷检测工具在 Juliet 测试套件[2]和 37 个开源项目上的表现,从易用性,可用性,报告精度,报告可理解性四个方面进行了评价对比, 有以下4个结论

  1. 当前流行的静态分析工具都提供的主流操作系统上的预构建版本或者自动构建脚本,都存在官方或者第三方提供的预构建 docker 容器镜像,都提供了足够的文档说明如何使用工具,但是检测工具对输入的额外要求,对工具的使用造成了一定的阻碍;
  2. 至少 89.2%的项目上,这些工具都能在 1 小时内给出项目的缺陷报告,尤其对于小于 20 万行的开源项目,它们都能在 1 小时内消耗少于 32GB 内存的情况下完成检测;
  3. 通过人工检查超过 1500 个缺陷报告之后,我们发现 C/C++静态缺陷检测工具给出的缺陷报告往往具有极高的误报率,比如释放后使用和缓冲区溢出这两类缺陷的误报率都超过 90%;
  4. 开源 C/C++静态缺陷检测工具给出的缺陷报告的可理解性较差,缺陷报告中包含的具有提示作用的信息极少,难以帮助开发者确定报告是否是误报,同时也难以快速定位缺陷发生的原因.即使部分工具可以给出函数内的一些关键路径,但仍然无法为复杂环境中缺陷的分析和定位提供足够的信息.

据瑞星发布的《2020 年中国网络安全报告[3]》,2020 年攻击频率最高的 10 个 CVE 漏洞中有 4 个是系统软件漏洞,5 个是常用软件(Microsoft Office/Adobe Acrobat)漏洞,同时其中有 5 个是由于 C/C++堆栈溢出(Buffer Overflow)引起的

通用缺陷列表(Common Weakness Enumeration, CWE)
[论文分享] 开源 C/C++静态软件缺陷检测工具实证研究_第1张图片

[论文分享] 开源 C/C++静态软件缺陷检测工具实证研究_第2张图片

漏洞的数量占比, Buffer Overflow在17年之前占大部分(50%以上), 最近几年开始下降, UAF占比提升

静态检测方法

静态分析是一种通过在源代码上静态地对程序状态,数据传播等信息进行计算分析而不执行目标代码的分析方式.静态分析的优点在于能专注于代码本身,利用对于程序的抽象建模简化复杂语义,可以获得较高的分析效率和覆盖率.

数据流分析

使用数据流分析或者其变种(比如静态污点分析)来计算程序的变化状态在程序中的传播,从而监测特定位置程序的行为和状态.经典的数据流分析是建立在程序的控制流图及表示所分析抽象信息的格(Lattice)上的不动点算法.

模型检测(Model Checking)

通过对程序进行形式化建模,并探索模型的每一个状态,从而验证一个特定的程序属性是否可以被满足.常见的建模方法包括有穷状态机,时序迁移系统,异步消息传递模型和分布式共享内存模型等.

抽象解释(Abstract Interpretation)

对程序指令进行抽象建模,通过 Galois 链接用抽象域表达对具体域的可靠近似.抽象解释提供了严格地理论约束来通过不动点算法求解获得程序的最小不动点,从而保证其结论的可靠性.

静态缺陷检测工具

FaceBook Infer

FaceBook Infer(简称为 FbInfer)[4]在 2013 年作为一个学术研究项目被开发,采用抽象解释 (Abstract Interpretation)技术以作为检测多种语言,多种缺陷类型的通用支撑平台,其对于 C/C++ 缺陷的检测中使用到了基于分离逻辑 (Separation Logic)的双向假推理 (Bi-Abduction)技术, 在Facebook内部广泛使用且成熟的一种开源工具.

Clang static Analyzer

Clang Static Analyzer(简称为 ClangSA)[5]是在流行编译工具链 LLVM 上构建并集成于 Clang 中的针对 C/C++ 和 Objective-C 源代码的静态分析工具,此工具被大量开源社区和项目使用,同时被多款 IDE 集成从而为开发者提供快速可用的静态缺陷检测能力.ClangSA 提供在 AST 上对代码进行的语法及语义检查,涵盖检查内存安全属性,死代码等功能.ClangSA 的主要实现技术是静态符号执行 (Static Symbolic Execution),由负责遍历控制流图控制计算路径的 CoreEngine 和负责计算程序状态属性的 Checkers 组成.ClangSA 的 CoreEngine 实现基于 Worklist 的广度优先搜索(Breadth-First Search)算法,因此具有较高的时间和空间效率,从而达到 ClangSA 快速轻量的设计目标,并提供了良好的扩展性.

SVF Saber

SVF[6] 是使用稀疏流图技术的指针分析框架,为工业界和科研界提供基础的指针分析实现,SVF Saber(简称为 Saber)是在其指针分析基础上实现的一个实验性的缺陷检测工具.最初只支持检测 C 语言中的内存泄漏(Memory Leak)缺陷,随着对其指针分析算法的不断完善,形成了著名的开源指针分析框架 SVF.稀疏值流分析(Sparse Value-Flow Analysis)是当前学术界最新的高效精确的静态指针分析算法.

实验

[论文分享] 开源 C/C++静态软件缺陷检测工具实证研究_第3张图片

实验流程

  1. 构建和配置缺陷检测工具:本文实验所选择的开源检测工具都提供了多平台上的构建指南,同时FbInfer/ClangSA 都有官方提供的预编译版本,Saber 提供了自动构建的脚本.实验中为了降低对测试集中项目构建过程的干扰,优先选择使用预构建版本.
  2. 针对实验环境构建测试集:虽然开源项目一般都提供了配置和构建相关的指导文档和自动化脚本,但是针对特定系统版本或者依赖库版本,仍然需要手工进行部分修改才能使用 Clang 编译成功.Saber 要求项目被编译成 Bitcode 文件作为输入.
  3. 缺陷检测:使用静态缺陷检测工具检测配置好的软件项目或者项目产生的 Bitcode 文件.
  4. 收集和检查缺陷报告:每款缺陷检测工具提供的缺陷报告格式和内容相差很大,因此需要针对性的处理和过滤.在此过程中,我们对缺陷报告进行随机抽样并人工检查报告是否是误报.然后将统一格式化的数据存入报告数据库中以待进一步分析.

测试套件
Juliet C/C++测试套件 1.3 版(Juliet Test Suite for C/C++ 1.3)以及 37 个被广泛使用且具有代表性的开源项目作为基准测试集

[论文分享] 开源 C/C++静态软件缺陷检测工具实证研究_第4张图片

实验指标

(1) 召回率(Recall Rate, RCR): 正确报告数与测试用例中正例总数的比值.这个指标表示了在测试用例集合上检测工具的检测能力的大小 —— 召回率越高,检测工具对特定缺陷的检测能力越高.

(2) 误报率(False Positive Rate, FPR): 错误报告数占工具所有报告总数的比值.此指标表示检测工具在给出报告时可能发生错误的几率.误报率也是衡量缺陷检测工具精度的主要指标.

(3) 共识率(Consensus Rate, CR): 在同一个测试集合运行多款检测工具时,两款工具同时报告了同一个缺陷,那么我们认为这两款工具就这一个缺陷达成了共识.共识率就是某款工具所有报告中与任意一款其它工具达成共识的报告数与其报告缺陷总数的比值.

实验分析

[论文分享] 开源 C/C++静态软件缺陷检测工具实证研究_第5张图片

[论文分享] 开源 C/C++静态软件缺陷检测工具实证研究_第6张图片FbInfer 和 ClangSA 在不同的缺陷分类上的召回率各有优劣,表明它们各自不同的检测针对性,同时ClangSA 在误报率上普遍比 FbInfer 要低,反映了它们在检测能力和误报率之间所采取的不同折衷策略.
实验结果表明,ClangSA 在给出缺陷报告的 13 类缺陷中有 9 类缺陷的误报率为 0,这表明作为一个随编译工具链发布的检测工具,其主要定位是让开发者更早地识别和修复那些普遍且简单的缺陷,并极力降低误报带来的开销.
Saber 得益于更精确的全程序指针分析算法作为基础,在支持的缺陷类型检测中,它具有最高的召回率,表明它检测特定类型缺陷的能力最好. 但是同时它也有最高的误报率, 一部分原因是采取了较为保守的报告方式以尽可能地报告潜在的缺陷.

实验总结

FbInfer 更注重内存安全, 尤其是资源泄露
ClangSA 的设计目的是更快更早发现程序局部存在的缺陷, 所用技术较单一
Saber 不同于两者, 目的在于验证实验性的新技术和新方案所具有的检测能力和性能水平

总结

这篇文章总体是对目前三类开源静态软件缺陷检测工具的实验评估, 说不上多少创新点, 实际上目前的静态软件分析工具有很多, 除了开源的工具还有很多商业工具.
优点则在于对目前主流的开源工具做了横评, 实验做得比较全面, 具有一定的工作量, 对于想要尽快了解当前静态软件缺陷检测领域工作的研究者有一定的借鉴意义.
未来做静态缺陷检测方向的工作, 可以考虑从改进误报率开始, 或者深入研究复杂缺陷的检测(这部分工作研究还未成熟), 还可以从优化检测性能优化方面入手进行研究.

水平有限, 仅仅记录当前的阅读收获, 如有错漏还请路过的大佬斧正

参考列表
[1] http://www.jos.org.cn/jos/article/abstract/6569
[2] https://samate.nist.gov/SRD/testsuite.php
[3] http://it.rising.com.cn/d/file/it/dongtai/20210113/2020.pdf
[4] https://fbinfer.com/
[5] https://clang-analyzer.llvm.org/
[6] Sui Y, Ye D, Xue J. Static memory leak detection using full-sparse value-flow analysis. In Proceedings of the 2012 International Symposium on Software Testing and Analysis. 2012. 254-264

你可能感兴趣的:(C/C++,程序分析,程序分析,C++)