代码分析属性图 CPG
代码分析工具层出不穷,编译器本身也内置了大量的静态检查,但分析的数据源较为单一。而本文要介绍的,是集众之所长的代码分析属性图 CPG,在漏洞分析上很有帮助。
1、定义
代码属性图(code property graph,简称 CPG) 是一种数据结构,用来通过 DSL(domain-specific language) 查询语句来挖掘代码漏洞。
它的主要思想如下:
CPG 将多个程序表示(program representations)整合成一个
CPG 数据被存储在图数据库中
通过 DSL 在图数据库中遍历和查询 CPG 数据
2、用处
CPG 整合了 AST(abstract syntax trees)、CFG(control flow graphs)、PDG(program dependence graphs) 到一种数据结构当中。
这种综合的数据表示,使得我们在图遍历当中,可以优雅地组织漏洞扫描的模版。
可以用来分析缓冲区溢出、整型溢出、格式字符串漏洞、内存泄漏等。
2.1、局限性
1、纯静态分析,缺乏对运行时信息的组织(比如数据争用)
2、解决 ...
程序切片
软件漏洞主要由指针、数组、表达式运算、敏感 API 函数所在位置引入, 并称其为漏洞关注点。 如常见的数组越界、整数溢出、空指针、API 函数错误使用等类型漏洞, 均由以上 4 类漏洞关注点所致. 在程序代码中, 与漏洞关注点存在数据依赖或者控制依赖关系的语句集合构成一个可能存在漏洞的程序切片;反之, 其他语句被视为会干扰模型训练的漏洞无关语句. 不同于 Li 等人[19]构 造的文本切片, 本文提取程序依赖图的子图作为切片, 即选取上述 4 类漏洞关注点作为程序切片的基准点后, 保留与其存在数据及控制依赖关系的节点和边, 以生成程序依赖图子图. 具体来说, 生成代码切片可以分为 3 个步骤.
(1)漏洞关注点选取,通过遍历程序依赖图节点,选取符合4类漏洞关注点的代码元素,并记录节点作为切片基点;
具体地,
通过在标识符声明节点中匹配“[”字符来确定数组元素;
通过在标识符声明节点中匹配“*”字符来确定指针元素;
通过正则表达式规则来匹配表达式运算节点;
通过Li 等人[19]提供的敏感 API 列表进行敏感 API 节点匹配;
如图 2 中程序依赖图提取部分所示, 1 号 ...
【程序分析】数据依赖、控制依赖、程序依赖图PDG、系统依赖图SDG-CSDN博客
可达性
变量v的定义:对变量v的赋值语句成为变量的定义;
变量v的使用:在某个表达式中引用变量v的值;
当变量v被再次赋值时,上一次赋值对变量v的定义d就被kill掉了;
如果定义d到点p之间存在一条路径,且在路径中定义d没有被kill掉,则称d可以达到p
如下图所示,d可以通过path2到达u但是不能通过path1到达u,因为k这条语句kill掉了定义d。而因为d到u之间存在着没有被kill的路径path2,所以d可以到达u。
X = . 叫做精确定义,*p = . 叫做模糊定义,因为p可能指向X,一般考虑可达性只考虑精确定义对路径的kill。
数据依赖
两个句子存在数据依赖:一条语句中一个变量的定义,可以到达另一条语句中对该变量的使用。
在编译领域有不同类型的数据依赖,如果我们说s2依赖于s1,可以是:
s1 写内存 s2 读 (RAW)
s1 读内存 s2 写 (WAR)
s1 写内存 s2 写 (WAW)
s1 读内存 s2 读 (RAR)
在软件工程领域,主要关注RAW依赖,在源码或IR的 ...