一种面向安全检查的代码静态分析方法

文档序号:8922515阅读:385来源:国知局
一种面向安全检查的代码静态分析方法
【技术领域】
[0001]本发明涉及软件安全漏洞检测技术领域,尤其涉及一种面向安全检查的代码静态分析方法。
【背景技术】
[0002]静态分析是指在不运行待检测程序的情况下,通过分析程序源代码中的语法、过程和程序结构等来验证程序的正确性。它通过检查代码是否与设计相符、代码对安全编码标准的遵循程度、代码中逻辑正确性和结构的合理性,发现代码中存在的潜在安全问题,包括代码检查和代码结构分析等。静态检测技术的检测对象是软件的源代码。该类技术不需要动态执行程序的源代码,也不需要获得程序编译时的信息,而是在具体检测代码中存在的问题之前,扫描软件源代码,运用词法分析、语法分析以及语义分析等技术生成源代码的某种中间表示,然后再通过各种技术对中间表示进行扫描,生成相应的检测模型,最后根据各种检测规则分析模型来查找程序源代码中存在的安全缺陷。
[0003]抽象解释是静态分析的形式化框架。静态分析仅跟踪用户关心的程序属性,所以它对程序语义的解释是程序实际语义的近似。抽象解释需要用户根据被检测安全漏洞设计具体的抽象解释函数和抽象域。目前,主流的静态分析方法都是抽象解释的实例。在对程序进行语法分析时,在保持被测程序原有逻辑完整性的基础上,可以在程序的不同部位插入一些探针,通过探针的执行获取程序运行测试用例的特征数据,如调用分支的执行次数等。
[0004]数据流分析收集程序中每个点所计算的值的可能集合,这些集合指明变量的值在何处产生以及在什么地方使用,指明如何处理、存储、传递数据,以及将数据传递到何处等。对程序源码进行数据流分析,首先需要将被分析的代码划分为基本块(程序子序列由顺序执行的指令组成),然后以这些基本块为结点给程序构造控制流图。数据流分析以基本块和控制流程图为基础,控制流图是函数体的形式化表示,可以表达程序结构,在安全分析阶段起着重要作用。控制流图通过遍历抽象语法树,依据程序的执行规则,分析程序的可能执行路径,最终生成程序调用图供后续检测工作使用。
[0005]程序调用图是静态分析安全检查中常用的描述函数之间调用关系的结构之一,相比于其他结构,程序调用图更为直观,易于理解和使用。函数递归调用可以分为直接递归调用和间接递归调用两种。一个可终止的程序在进入递归调用后,必定会在某条件满足后退出递归,否则程序会永不停息的递归下去。因此可以判定构成递归的所有函数调用中,至少有一个位于条件分支中。
[0006]在自底向上的静态安全检查中,生成拓扑序列的前提是控制流图中没有环,但是递归函数的存在使控制流图存在环,从而无法确定该环中各个函数的调用顺序,因此必须解除递归函数依赖。解除递归函数的依赖关系后,相应的函数依赖信息也随之丢失。
[0007]如图1和2所示,在图1中,函数f2存在直接递归函数调用f2 — f2,函数Π、f3、f6和f4,函数fl、f5、f6和f4均存在间接递归函数调用,函数递归调用环分别为Π — f3 — f6 — f4 — fl和fl — f5 — f6 — f4 — fl。现有解除递归函数依赖的技术是基于程序调用图通过比较控制流图中环的函数节点的入度和出度选择被解除的边,即找出递归调用环中具有最大入度的f(x)和与f(x)相连的出度最小的f(y),删除二者的调用关系。在图1中的3个函数递归调用环中,直接递归函数调用f2 — f2直接解除;在间接递归函数调用fl — f3 — f6 — f4 — fl中,函数fl节点具有最大的入度2,在与函数fl节点相连的函数节点中,函数f3节点具有最小的出度1,因此,将fl — f3的函数依赖关系解除;同理,在间接递归函数调用fl — f5 — f6 — f4 — fl中,函数fl节点具有最大的入度2,在与函数fI节点相连的函数节点中,函数f5节点具有最小的出度1,因此,将fl — f5的函数依赖关系解除。解除递归函数依赖后的程序调用图如图2所示。该技术只分析了程序的控制流程图,具有易实现、速度快的优点,但其对程序的语义分析不足,容易解除重要的函数依赖,造成较大的损失,对检测结果的精确性影响较大。

【发明内容】

[0008]有鉴于此,本发明提供了一种面向安全检查的代码静态分析方法,将两函数之间的调用次数作为两者之间条件调用边的权值,并将权值作为两函数依赖重要性,可根据该依赖的重要性,解除递归环中权值较小的条件调用边,如此,在尽量减少解除边的数目的同时减少重要依赖的损失,提高程序漏洞的检测效率。
[0009]为了解决上述技术问题,本发明是这样实现的:
[0010]一种面向安全检查的代码静态分析方法,包括如下步骤:
[0011]步骤1、对待分析的程序代码进行词法分析,即将程序代码中的字符流分割为独立的单词;
[0012]步骤2、将步骤I分割得到的各个独立的单词进行语法分析,得到抽象语法树;
[0013]步骤3、基于步骤2的抽象语法树,得到控制流图;
[0014]步骤4、根据步骤3得到的所述控制流程图,得到函数调用图;
[0015]步骤5、对程序代码的函数依赖关系进行解除,具体为:
[0016]S51、计算所述函数调用图中两两函数之间的调用次数;
[0017]S52、在所述函数调用图的基础上,针对任意两个有调用关系的函数,将两者之间的调用次数作为权值并赋值给该两个函数之间的条件调用边,得到带权依赖关系的函数调用图;
[0018]S53、查找所述带权依赖关系的函数调用图中的递归环,针对任意一个递归环X,检测与该递归环X没有共用条件调用边的递归环,将检测到的递归环中权值最小的条件调用边解除,遍历函数调用图中所有的递归环,得到解除函数依赖关系的函数调用图;
[0019]步骤6、依照所述步骤5得到的解除了函数依赖关系的函数调用图,使用静态分析方法对程序代码进行安全缺陷的检测,并将检测结果以文本形式存储并输出,供程序员查看。
[0020]本发明具有如下有益效果:
[0021](I)本发明针对目前软件安全漏洞检测方法在代码静态分析安全检查中漏报率和误报率无法与检测软件的运行效率兼得的问题,本发明将消除函数递归技术引入到软件安全漏洞静态分析中:首先生成程序安全检查的中间表示如控制流图和程序调用图等,获得程序的函数依赖关系;若程序调用图中存在递归环,则意味着函数依赖中存在递归。其次得到程序调用图中各依赖的权值;最后根据依赖重要性即权值决定要解除的依赖关系,提高程序漏洞的检测效率的同时,尽量降低解除递归函数依赖造成的检测损失。
【附图说明】
[0022]图1为现有技术中存在递归的函数调用图。
[0023]图2为利用现有的方法解除递归的函数调用图。
[0024]图3为利用本发明的方法解除递归的函数调用图。
【具体实施方式】
[0025]下面结合附图并举实施例,对本发明进行详细描述。
[0026]步骤1、对待分析的程序代码进行词法分析,即将程序代码中的字符流分割为独立的单词:
[0027]以待分析的程序代码(源文件)作为输入,逐行扫描程序文件中的字符,根据编程语言约束生成的正则表达式,把源文件中的字符流分割为一个个的单词。该单词流将作为语法分析器的输入。此过程会自动过滤掉源程序中的空白符、制表符等对文件分析无帮助的字符,并将有关单词序列的信息写入符号表。
[0028]步骤2、将步骤I分割得到的各个独立的单词进行语法分析,得到
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1