Page 112 - 《软件学报》2020年第11期
P. 112
3428 Journal of Software 软件学报 Vol.31, No.11, November 2020
26 end for
在构建 FDDG 时,过程间分析同样采用摘要分析的方式.对于系统函数或库函数,采用“符号摘要”方法来更
好地描述函数的行为及语义 [20] ;对于用户自定义函数,采用普通的函数摘要技术来构建其输入状态和输出状态
等信息 [21] ,也可以采用其他更精确的函数摘要技术,如基于 TAL(tree-adjoining-language)可达性的摘要技术 [15] .
需要说明的是,FDDG 本质上还是一种数据依赖图,其与函数摘要技术属于两个不同的范畴.FDDG 中节点的处
理方式,重点关注的是参数或返回值之间的“定义-引用”关系,而函数摘要技术则无法直接得到这种关系.
4 函数级数据依赖图在静态脆弱性分析中的应用
函数级数据依赖图 FDDG 保存了函数参数及函数之间参数的依赖关系,所以最直观的应用是分析函数参
数在程序调用过程中的传递路径.本节将以固件中二进制程序的静态脆弱性分析为例分析 FDDG 的可用性.
4.1 二进制程序静态脆弱性分析
二进制程序静态脆弱性分析的基本流程如图 6 所示.其中,通过控制流分析可以得到程序的控制流图 CFG
和函数调用图(call graph,简称 CG),通过数据流分析可以得到数据依赖图 DDG.在此基础上,根据漏洞模式或规
则对程序中的潜在脆弱点进行分析,以判断程序是否存在安全缺陷.
Fig.6 Flow of static vulnerability analysis
图 6 静态脆弱性分析流程
在进行静态代码分析时,由于存在函数间接调用、指针别名等机制,构建 DDG 的过程中会出现信息损失.
基于 DDG 进行静态脆弱性分析,实质是对 DDG 中包含的信息进行挖掘,从而判断是否存在漏洞.整个过程可以
用图 7 所示的模型表示.为了便于描述,将与脆弱点处的变量存在依赖关系的其他变量称为相关变量,这些变量
所蕴含的信息称为有效信息,记为 A;而与脆弱点处的变量不存在依赖关系的其他变量称为无关变量,其信息为
无效信息,记为 B(或Θ−A,Θ表示全部信息).具体地,在对脆弱点进行分析时,除了关心数据的流动或数据的性质,
既需要知道某个变量的取值是否来自非可信的数据源,还需要知道某个变量可能的取值范围.因此,在对脆弱点
处的变量进行回溯时,与其存在依赖关系的相关变量的信息包括变量取值、大小、来源及约束等都属于有效信
息.以图 5 所示的代码片段为例,在图 5(a)中的脆弱点处包含 buf 和 argv[1]两个变量,从脆弱点向上回溯时,只要
与变量 buf 或 argv[1]存在依赖关系的变量都属于相关变量,这些变量的取值、大小、来源及约束等信息都属于
有效信息.而变量 argc 与脆弱点的分析无关,故其属于无关变量,其信息为无效信息.
Fig.7 A vulnerability mining model based on data dependence graph
图 7 基于数据依赖图的漏洞挖掘模型
由图 7 可知,脆弱性分析的结果可以看作是将脆弱性分析函数 M 作用于信息θ上的输出,记为 M(θ).通常,
包含的有效信息 A 越多,检测出漏洞的可能性越大,M(θ)越接近 M(Θ);包含的无效信息 B 越多,检测不出漏洞的
可能性也越大,M(θ)越接近 M(Φ)(Φ表示空信息).在理想情况下,脆弱性分析函数 M 可以根据有效信息 A 检测出
所有的漏洞,即 M(A)=M(Θ).而实际会存在根据有效信息 A 检测不出漏洞的情形,和根据无效信息 B 检测出漏洞