作者:{wh1t3p1g}@ArkTeam
原文作者:Xiaoning Du , Bihuan Chen , Yuekang Li , Jianmin Guo , Yaqin Zhou , Yang Liu , Yu Jiang
原文标题:LEOPARD: Identifying Vulnerable Code for Vulnerability Assessment through Program Metrics
原文会议:the 41st International Conference on Software Engineering
原文链接:https://arxiv.org/pdf/1901.11479
概述
识别代码库中的易受攻击的代码对漏洞评估来说至关重要。现有存在两种方式来识别,包括基于度量的和基于模式的方法。前者依赖机器学习,后者需要已知的漏洞先验知识。文章提出并实现了一个通用的,轻量级和可扩展的框架LEOPARD,其通过程序指标识别潜在的易受攻击的C/C++代码。通过这个工具,在实际的应用中(PHP、radare2、FFmpeg等)发现了22个漏洞,其中8个是新漏洞。需要注意的是该框架并没有直接定位出具体的漏洞,而是给安全专家提供了一个大概率出现漏洞的位置,由安全专家来人工review这些位置。
方法
上图为框架的一个总体流程,主要包括Function Binning和Function Ranking这两个部分,下面将着重介绍这两个部分。
Function Binning
不同的漏洞通常具有不同的复杂程度。为了识别各种复杂程度的漏洞,首先将目标应用程序中的所有功能分类为基于复杂度指标的一组容器。每个容器代表不同的复杂程度,供后面的Function Ranking来做预测。这种分级和排序方法旨在避免遗漏低复杂性的易受攻击的功能。
其中对于复杂度指标的定义:引用函数中的近似路径数,并从结构复杂性中导出函数的复杂度度量。结构复杂性的主要来源是函数的循环和控制结构。度量标准包括循环数、嵌套循环数和循环的最大嵌套级别。
Function Ranking
第二步,根据漏洞的一般原因的特征推导出一组新的漏洞度量,然后对每一组容器中功能进行排名并基于漏洞指标将最上层函数识别为易受攻击的函数。漏洞度量标准包含三个维度:
- 依赖性度量:表明函数与其他函数的依赖关系,即函数的参数变量的数量和由函数调用作为参数变量的数量。函数越依赖于其他功能,越难以跟踪交互。
- 指针度量:捕获指针的操作,即指针算术的数量,指针算数中使用的变量的数量以及变量所涉及的指针算术的最大数量。这些操作与敏感的内存操作密切相关,数量越多内存管理错误的风险越大。
- 控制结构度量:捕获由于高度耦合和依赖控制结构导致的漏洞,即潜逃控制结构对的数量,控制结构的最大嵌套级别,最大数量控制或数据相关的控制结构的数量,没有显示else语句的if结构数量以及数据相关控制结构中涉及的变量的数量。
评估
作者选取了应用广泛的11个项目,从中发现了20个新的错误,其中8个为新漏洞。并且作者设计了相关实验来证明其提出的新方法的有效性、性能、应用场景等,由于篇幅这里不再展开,可阅读该文章。
启发
这篇论文提出了一种新的度量方法,虽然不能直接定位具体漏洞,但它可以帮助安全专家在大型的应用程序中找出值得关注的点,提高了审计效率。软工类的审计方法对我来说还是有点陌生,他提到的基于复杂度等方法来做审计,以前没有接触过,开启了新的大门。不过是否有效用于PHP等语言的审计还有待商榷。