今天分享的论文是《Modeling and Discovering Vulnerabilities with Code Property Graphs》
读这篇论文主要是做挖洞工作的时候要用,所以学习了解了一下,是一篇2014年的论文。
论文主要是介绍一种图格式去挖洞,实验评估部分大段数学公式,不再过多介绍了。
在本文中提出了一种有效地挖掘大量源代码漏洞的方法。为此,引入了一种称为代码属性图的源代码新表示,它将经典程序分析的概念,即抽象语法树、控制流图和程序依赖图,合并到一个联合数据结构中。这种全面的表示使得能够通过图形遍历为常见漏洞优雅地建模,例如,可以识别缓冲区溢出、整数溢出、格式字符串漏洞或内存泄漏。使用一个流行的图形数据库来实现方法,并通过识别 Linux 内核源代码中的 18 个以前未知的漏洞来证明其有效性。
贡献:
(1)代码属性图。介绍了一种新颖的源代码表示法,它结合了抽象语法树、控制流图和程序依赖的特性联合数据结构中的密度图。
(2)漏洞类型的遍历。常见类型的漏洞可以优雅地建模为代码属性图的遍历,并产生有效的检测模板。
(3)有效实施。证明了通过将代码属性图导入到图形数据库中,可以在大型代码上有效地执行遍历基础,比如 Linux 内核
(In summary, we make the following contributions to the problem of vulnerability discovery: • Code property graph. We introduce a novel representation of source code that combines properties of abstract syntax trees, control flow graphs and program dependence graphs in a joint data structure. • Traversals for vulnerability types. We show that common types of vulnerabilities can be elegantly modeled as traversals of the code property graph and give rise to efficient detection templates. • Efficient implementation. We demonstrate that by importing the code property graph into a graph database, traversals can be efficiently executed on large code bases, such as the Linux kernel.)
不足:
首先,方法是纯静态的,因此不能克服静态程序分析的固有限制。当实现控制和数据流跟踪时,不解释代码,例如,使用符号执行可能找到等价但不同表达的表达式。因此,由运行时行为(如竞争条件)引发的漏洞无法使用代码属性图进行建模。
第二,由于漏洞发现问题在一般情况下是不可判定的,方法只能发现潜在的易受攻击的代码。与针对特定类型漏洞的方法相比,侧重于挖掘漏洞的一般方法,这种方法可能无法保证存在安全漏洞,但可以识别超大型软件项目中的潜在漏洞。
第三,当前的实现没有处理过程间分析。当根据图数据库中的调用关系链接函数时,制定有效的过程间遍历带来了额外的挑战。这不是方法的固有限制,因为存在控制流图和程序依赖图的过程间变体以程序间控制流程图和系统依赖图的形式。
总结:
为分析人员提供发现软件漏洞的实用方法对于保护计算机系统至关重要。本文提出了一种从大量代码中挖掘漏洞的方法。这种方法建立在一种新颖的源代码表示法——代
码属性图——的基础上,它能够根据图遍历对常见漏洞的模式进行建模。使用这种表示,已经为许多众所周知的漏洞类型提供了小而简洁的遍历,包括缓冲区溢出、格式字符串漏洞和内存地址泄漏。此外,使用代码属性图审计了一个大型代码库(Linux 内核),并在供应商确认和修复的源代码中发现了总共 18 个以前未知的漏洞。
代码属性图和图遍历适用于找到常见类型的漏洞,但更重要的是,它们可以被很好地定制,以识别特定于代码库的漏洞。通过重新定义遍历,分析师可以完全控制误报率和漏报率,从而允许在分析的发现阶段制定模糊遍历,并允许非常精确的遍历来捕获充分了解的漏洞类型的实例。