[发明专利]一种面向安全检查的代码静态分析方法有效
申请号: | 201510347630.0 | 申请日: | 2015-06-19 |
公开(公告)号: | CN104899147B | 公开(公告)日: | 2017-11-28 |
发明(设计)人: | 胡昌振;单纯;吴露霞;于泽群;马锐 | 申请(专利权)人: | 北京理工大学 |
主分类号: | G06F11/36 | 分类号: | G06F11/36;G06F21/56 |
代理公司: | 北京理工大学专利中心11120 | 代理人: | 李微微,仇蕾安 |
地址: | 100081 *** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 面向 安全检查 代码 静态 分析 方法 | ||
技术领域
本发明涉及软件安全漏洞检测技术领域,尤其涉及一种面向安全检查的代码静态分析方法。
背景技术
静态分析是指在不运行待检测程序的情况下,通过分析程序源代码中的语法、过程和程序结构等来验证程序的正确性。它通过检查代码是否与设计相符、代码对安全编码标准的遵循程度、代码中逻辑正确性和结构的合理性,发现代码中存在的潜在安全问题,包括代码检查和代码结构分析等。静态检测技术的检测对象是软件的源代码。该类技术不需要动态执行程序的源代码,也不需要获得程序编译时的信息,而是在具体检测代码中存在的问题之前,扫描软件源代码,运用词法分析、语法分析以及语义分析等技术生成源代码的某种中间表示,然后再通过各种技术对中间表示进行扫描,生成相应的检测模型,最后根据各种检测规则分析模型来查找程序源代码中存在的安全缺陷。
抽象解释是静态分析的形式化框架。静态分析仅跟踪用户关心的程序属性,所以它对程序语义的解释是程序实际语义的近似。抽象解释需要用户根据被检测安全漏洞设计具体的抽象解释函数和抽象域。目前,主流的静态分析方法都是抽象解释的实例。在对程序进行语法分析时,在保持被测程序原有逻辑完整性的基础上,可以在程序的不同部位插入一些探针,通过探针的执行获取程序运行测试用例的特征数据,如调用分支的执行次数等。
数据流分析收集程序中每个点所计算的值的可能集合,这些集合指明变量的值在何处产生以及在什么地方使用,指明如何处理、存储、传递数据,以及将数据传递到何处等。对程序源码进行数据流分析,首先需要将被分析的代码划分为基本块(程序子序列由顺序执行的指令组成),然后以这些基本块为结点给程序构造控制流图。数据流分析以基本块和控制流程图为基础,控制流图是函数体的形式化表示,可以表达程序结构,在安全分析阶段起着重要作用。控制流图通过遍历抽象语法树,依据程序的执行规则,分析程序的可能执行路径,最终生成程序调用图供后续检测工作使用。
程序调用图是静态分析安全检查中常用的描述函数之间调用关系的结构之一,相比于其他结构,程序调用图更为直观,易于理解和使用。函数递归调用可以分为直接递归调用和间接递归调用两种。一个可终止的程序在进入递归调用后,必定会在某条件满足后退出递归,否则程序会永不停息的递归下去。因此可以判定构成递归的所有函数调用中,至少有一个位于条件分支中。
在自底向上的静态安全检查中,生成拓扑序列的前提是控制流图中没有环,但是递归函数的存在使控制流图存在环,从而无法确定该环中各个函数的调用顺序,因此必须解除递归函数依赖。解除递归函数的依赖关系后,相应的函数依赖信息也随之丢失。
如图1和2所示,在图1中,函数f2存在直接递归函数调用f2→f2,函数f1、f3、f6和f4,函数f1、f5、f6和f4均存在间接递归函数调用,函数递归调用环分别为f1→f3→f6→f4→f1和f1→f5→f6→f4→f1。现有解除递归函数依赖的技术是基于程序调用图通过比较控制流图中环的函数节点的入度和出度选择被解除的边,即找出递归调用环中具有最大入度的f(x)和与f(x)相连的出度最小的f(y),删除二者的调用关系。在图1中的3个函数递归调用环中,直接递归函数调用f2→f2直接解除;在间接递归函数调用f1→f3→f6→f4→f1中,函数f1节点具有最大的入度2,在与函数f1节点相连的函数节点中,函数f3节点具有最小的出度1,因此,将f1→f3的函数依赖关系解除;同理,在间接递归函数调用f1→f5→f6→f4→f1中,函数f1节点具有最大的入度2,在与函数f1节点相连的函数节点中,函数f5节点具有最小的出度1,因此,将f1→f5的函数依赖关系解除。解除递归函数依赖后的程序调用图如图2所示。该技术只分析了程序的控制流程图,具有易实现、速度快的优点,但其对程序的语义分析不足,容易解除重要的函数依赖,造成较大的损失,对检测结果的精确性影响较大。
发明内容
有鉴于此,本发明提供了一种面向安全检查的代码静态分析方法,将两函数之间的调用次数作为两者之间条件调用边的权值,并将权值作为两函数依赖重要性,可根据该依赖的重要性,解除递归环中权值较小的条件调用边,如此,在尽量减少解除边的数目的同时减少重要依赖的损失,提高程序漏洞的检测效率。
为了解决上述技术问题,本发明是这样实现的:
一种面向安全检查的代码静态分析方法,包括如下步骤:
步骤1、对待分析的程序代码进行词法分析,即将程序代码中的字符流分割为独立的单词;
步骤2、将步骤1分割得到的各个独立的单词进行语法分析,得到抽象语法树;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京理工大学,未经北京理工大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201510347630.0/2.html,转载请声明来源钻瓜专利网。
- 上一篇:固态硬盘的写入方法
- 下一篇:电源供应模块及数字影像输出装置