CN105912381B - 一种基于规则库的编译期代码安全检测方法 - Google Patents
一种基于规则库的编译期代码安全检测方法 Download PDFInfo
- Publication number
- CN105912381B CN105912381B CN201610269945.2A CN201610269945A CN105912381B CN 105912381 B CN105912381 B CN 105912381B CN 201610269945 A CN201610269945 A CN 201610269945A CN 105912381 B CN105912381 B CN 105912381B
- Authority
- CN
- China
- Prior art keywords
- information
- array
- code
- analysis
- rule
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/425—Lexical analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实现了一种基于规则库的编译期代码安全检测方法,具体包括以下内容:将安全漏洞用规则库符号表示,对源代码进行预处理、词法分析、语法分析,由语法分析的结果构建出抽象语法树(Abstract Syntax Tree,AST),遍历AST节点得到所需的信息,将所得信息交付于规则库处理对比,对于错误的代码进行标记及提示,记录编译期的信息及错误成立条件,为后面的动态测试提供辅助信息。本发明采用了静态分析与辅助动态分析相结合的方法,在编译期分析阶段,及时对不安全代码进行高覆盖率检测,并且利用冗余消除技术手段降低检测开销,在辅助动态分析阶段,利用编译期的信息进一步消除漏洞。结合以上两种手段,本发明能够以一种高覆盖率、高准确率、低开销的方式进行检测。
Description
技术领域
本发明属于计算机系统软件领域,更具体地,涉及一种基于规则库的编译期代码安全检测方法。
背景技术
编译器的流程由三部分组成,第一个部分是前端分析器,负责对源代码进行预处理、词法分析、语法分析、语义分析,并且最终生成没有错误的中间代码(IR),第二个部分是中间代码的优化,编译器对中间代码进行优化以提高效率,第三个部分是后端,后端负责将中间代码生成平台相关的二进制代码来执行。
LLVM是构建编译器(compiler)的框架系统,以C++编写而成,利用其提供的接口可以方便的对程序进行分析优化,本发明中用到的AST就是来自于LLVM的Clang编译器,AST的节点分为3种,分别是声明(decl)、语句(stmt)、类型(type),利用这些节点的信息,可以有效的对程序进行分析。
在这个信息爆炸的时代,安全漏洞带来的问题日益严重,用户的隐私和财产受到极大的威胁,缓冲区溢出、内存泄露、SQL注入等安全漏洞让黑客有机可乘,检测这些系统软件安全漏洞显得迫在眉睫。
已有一些检测技术能够在一定程度上检测出安全漏洞,但是它们各有优缺点,仍存在一些不足之处。
程序静态分析技术指的是在不执行源程序的情况下,利用词法分析、语法分析、控制流以及数据流分析等技术手段对程序源代码进行分析,并进一步验证代码是否满足规范和安全。目前的静态分析技术,还有符号执 行、抽象解释等方法,能够发现很多动态测试才能发现的缺陷。但是目前的主流的静态分析工具能够报出的缺陷种类只有几百种,并且存在误报率高的问题。
程序动态分析技术指的是通过具体运行测试程序,检测运行结果与预期结果的差异,分析运行效率、正确性和健壮性等指标。这种方法由三部分组成:构造测试用例,执行程序,分析程序的输出结果。动态分析的缺陷很明显,比较依赖于特定的测试用例,因此检测覆盖率较低,特别地,因为需要对源程序进行真实执行,也存在着高额的运行时开销。
现有的这些技术可以在一定程度下解决安全漏洞问题,但是静态分析存在误报率较高的问题,动态测试又存在开销太大的问题。
发明内容
针对现有技术的缺陷,本发明的目的在于提供一种基于规则库的编译期代码安全检测方法,旨在解决现有方法中存在的开销过大、误报率高等技术问题。
为实现上述目的,本发明提供了一种基于规则库的编译期代码安全检测方法,包括以下步骤:
(1)将安全漏洞用规则库符号表示;
(2)对源代码进行预处理、词法分析以及语法分析,根据语法分析的结果构建出没有语法错误的抽象语法树(AST);
(3)利用编译器框架的接口,借助步骤(2)的信息,对AST的节点(node)进行遍历,收集需要检测的安全漏洞的相关信息;其子步骤为:
(3-1)对于缓冲区溢出,其规则符号表示为buf[i](i<0||i>bufsize),buf是一个缓冲区数组,i为缓冲区索引的位置,bufsize为缓冲区大小即数组大小,当索引位置超过数组大小时或者索引位置小于0时,即为缓冲区溢出,获取索引位置i以及缓冲区大小bufsize;
(3-2)由于存在隐式的指针数组操作,通过AST节点信息,找到将数 组地址赋给指针的语句,将隐式指针数组操作转换为显示的数组索引操作;
(3-3)由于数组索引操作大量存在于循环之中,获取索引位置i转换为获取循环边界;
(3-4)分别回溯语法树其定义处,找出对应的索引位置信息和缓冲区大小信息;
(4)若步骤(3)没有收集到足够的信息,转到步骤(5);将步骤(3)收集的信息交给规则库进行对比分析,得出相应的结果信息,对存在安全漏洞的程序代码进行标记,并且给出错误提示信息;流程结束。
(5)对于不能在编译期解决的问题,输出该安全漏洞成立时的条件,辅助之后的动态测试。
本发明的一个实施例中,所述步骤(1)的规则库提取方式为人为总结,但也可通过机器学习的方式学习出新的漏洞规则。
本发明的一个实施例中,所述步骤(2)得到源代码的抽象语法树(AST)表示的方法为:使用LLVM-Clang。
本发明的一个实施例中,所述步骤(3-2)中获取缓冲区溢出中数组索引位置的方法为:通过将隐式的指针数组操作转化为显示的数组索引操作。
本发明的一个实施例中,所述步骤(3-3)中获取缓冲区溢出中数组索引位置的方法为:由于大多数缓冲区操作集中在循环中,将寻找数组索引位置转化为寻找循环边界的次数。
本发明的一个实施例中,所述步骤(3-4)中获取缓冲区溢出中缓冲区大小以及索引位置的方法为:回溯语法树,找到数组限定大小以及索引位置信息。
本发明的一个实施例中,所述步骤(4)给出错误信息方法为:标记代码且给出错误信息,且有通过其他技术手段直接修复错误的可能。
本发明的一个实施例中,所述步骤(5)给出错误信息方法为:记录编译期的相关信息及错误成立条件,为之后的动态测试提供信息。
通过本发明所构思的以上技术方案,与现有技术相比,本发明的系统具有以下的优点和技术效果:
1、由于采用了步骤(1)将软件漏洞提取为规则库,增强了平台的可扩展性。
2、由于采用了步骤(3-2),程序中的指针操作是大量存在的,将检测指针转换为了统一的显示数组索引操作,降低了检测开销。
3、由于采用了步骤(3-3),对于一个循环量很大的缓冲区操作来说,将大量的检测操作转为了只检测一次循环边界信息,提高了检测的效率。
4、由于采用了步骤(4),在编译期就能发现出软件安全漏洞,能够最早的发现错误,将修复的代价降到了最低。
5、由于采用了步骤(5),可以提供编译期的信息帮助动态测试,大大降低了动态测试的复杂性。
附图说明
图1为本发明基于规则库的编译期代码安全检测方法模块框图;
图2为本发明基于规则库的编译期代码安全检测方法的流程图;
图3为本发明基于规则库的编译期代码安全检测方法缓冲区溢出检测原理图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
如图1所示,基于规则库的编译期代码安全检测方法由3个部分组成,分别是LLVMClang编译器模块,抽象语法树(AST)遍历,规则库。第一个部分是LLVM Clang编译器模块,这是一个方便程序代码分析的开源编译器框架,利用其提供的接口,我们可以对源代码进行词法分析、语法分析、最后生成没有语法错误的AST。第二个部分是对AST的节点进行遍历,AST 的节点分为3种,分别是声明(decl)、语句(stmt)、类型(type),由编译单元(Translationunit)为顶层节点的树组成,遍历到复合语句(CoumpoundStmt),可以方便的定位到循环节点以及变量的定义处,结合具体的规则在AST上获取相应的信息。第三个部分是规则库,这是安全漏洞的集合,以规则库的形式表现,对第二个部分的信息进行处理分析,给出相应的提示信息。
如图2所示,基于规则库的编译期代码安全检测方法的包括以下步骤:
(1)将安全漏洞用规则库符号表示,其方法包括人工经验以及机器学习的方法;
(2)对源代码进行预处理、词法分析以及语法分析,根据语法分析的结果构建出没有语法错误的抽象语法树(AST),本步骤借助了LLVM编译器框架;
(3)利用编译器框架的接口,借助步骤(2)的信息,对AST的节点(node)进行遍历,收集需要检测的安全漏洞的相关信息;其子步骤为:
(3-1)对于缓冲区溢出,其规则符号表示为buf[i](i<0||i>bufsize),buf是一个缓冲区数组,i为缓冲区索引的位置,bufsize为缓冲区大小即数组大小,当索引位置超过数组大小时或者索引位置小于0时,即为缓冲区溢出,获取索引位置i以及缓冲区大小bufsize;
(3-2)由于存在隐式的指针数组操作,通过AST节点信息,找到将数组地址赋给指针的语句,将隐式指针数组操作转换为显示的数组索引操作;
(3-3)由于数组索引操作大量存在于循环之中,获取索引位置i转换为获取循环边界;在图3中对索引位置j的获取转换为获取loop:j=20;从而将20次检测变成了一次,且将不能确定的索引位置变量转换成可以解决的循环边界问题;
(3-4)分别回溯语法树其定义处,找出对应的索引位置信息和缓冲区大小信息;
(4)若步骤(3)没有收集到足够的信息,转到步骤(5);将步骤(3)收集的信息交给规则库进行对比分析,得出相应的结果信息,对存在安全漏洞的程序代码进行标记,并且给出错误提示信息;结合图3的信息,可以发现语句2、语句6和语句8是存在缓冲区溢出的,标记这3处代码,并且输出提示信息数组索引位置超出了数组范围。
(5)对于不能在编译期解决的问题,输出该安全漏洞成立时的条件,辅助之后的动态测试;结合图3的信息,可以发现语句10在编译时是无法解决的,记录编译时的信息以及错误成立的条件:k>10,辅助后面的动态测试。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (7)
1.一种基于规则库的编译期代码安全检测方法,其特征在于,包括以下步骤:
(1)将安全漏洞用规则库符号表示;
(2)对源代码进行预处理、词法分析以及语法分析,根据语法分析的结果构建出没有语法错误的抽象语法树AST;
(3)利用编译器框架的接口,借助步骤(2)的信息,对AST的节点(node)进行遍历,收集需要检测的安全漏洞的相关信息;
(4)若步骤(3)没有收集到足够的信息,转到步骤(5);否则将步骤(3)收集的信息交给规则库进行对比分析,得出相应的结果信息,对存在安全漏洞的程序代码进行标记,并且给出错误提示信息;流程结束;
(5)对于不能在编译期解决的问题,输出该安全漏洞成立时的条件,辅助之后的动态测试;
所述步骤(3)包括如下子步骤:
(3-1)对于缓冲区溢出,其规则符号表示为buf[i](i<0||i>bufsize),buf是一个缓冲区数组,i为缓冲区索引的位置,bufsize为缓冲区大小即数组大小,当索引位置超过数组大小时或者索引位置小于0时,即为缓冲区溢出,获取索引位置i以及缓冲区大小bufsize;
(3-2)通过AST节点信息,找到将数组地址赋给指针的语句,将隐式指针数组操作转换为显式的数组索引操作;
(3-3)获取索引位置i转换为获取循环边界,即将寻找数组索引位置转化为寻找循环边界的次数;
(3-4)分别回溯语法树AST的节点定义处,找出对应的索引位置信息和缓冲区大小信息。
2.根据权利要求1所述的方法,其特征在于,所述步骤(1)中规则库为人工经验或者机器学习的方法得到。
3.根据权利要求1或2所述的方法,其特征在于,所述步骤(2)得到源代码的抽象语法树表示的方法为:使用LLVM-Clang编译器提供的接口对程序进行分析得到抽象语法树。
4.根据权利要求1所述的方法,其特征在于,所述步骤(3-2)中获取缓冲区溢出中数组索引位置的方法为:通过将隐式的指针数组操作转化为显式的数组索引操作。
5.根据权利要求2所述的方法,其特征在于,所述步骤(3-4)中获取缓冲区溢出中缓冲区大小以及索引位置的方法为:回溯语法树,找到数组限定大小以及索引位置信息。
6.根据权利要求1或2所述的方法,其特征在于,所述步骤(4)给出错误信息方法为:标记代码且给出错误信息,且有通过其他技术手段直接修复错误的可能。
7.根据权利要求1或2所述的方法,其特征在于,所述步骤(5)给出错误信息方法为:记录编译期的相关信息及错误成立条件,为之后的动态测试提供信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610269945.2A CN105912381B (zh) | 2016-04-27 | 2016-04-27 | 一种基于规则库的编译期代码安全检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610269945.2A CN105912381B (zh) | 2016-04-27 | 2016-04-27 | 一种基于规则库的编译期代码安全检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105912381A CN105912381A (zh) | 2016-08-31 |
CN105912381B true CN105912381B (zh) | 2019-08-30 |
Family
ID=56752752
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610269945.2A Active CN105912381B (zh) | 2016-04-27 | 2016-04-27 | 一种基于规则库的编译期代码安全检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105912381B (zh) |
Families Citing this family (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106371887B (zh) * | 2016-11-08 | 2019-09-13 | 西安电子科技大学 | 一种msvl语言的编译系统及方法 |
CN106874768B (zh) * | 2016-12-30 | 2020-03-24 | 北京瑞卓喜投科技发展有限公司 | 渗透测试的方法及装置 |
CN109426502A (zh) * | 2017-07-04 | 2019-03-05 | 普天信息技术有限公司 | 一种前后端分离架构的安全保障方法 |
CN110543297B (zh) * | 2018-05-28 | 2021-03-30 | 北京京东尚科信息技术有限公司 | 用于生成源码的方法和装置 |
CN109002713B (zh) * | 2018-06-26 | 2020-11-10 | 中国科学院计算技术研究所 | 安全规则检测方法和系统 |
CN109491924B (zh) * | 2018-12-21 | 2022-09-30 | 北京达佳互联信息技术有限公司 | 代码检测方法、装置、终端及存储介质 |
CN111045679B (zh) * | 2019-01-09 | 2024-02-23 | 国家计算机网络与信息安全管理中心 | 一种sql注入的检测和防御方法、装置及存储介质 |
CN109814874B (zh) * | 2019-02-20 | 2023-03-24 | 湖南国科微电子股份有限公司 | 一种编译结果输出控制方法、系统及应用 |
CN110222512B (zh) * | 2019-05-21 | 2021-04-20 | 华中科技大学 | 一种基于中间语言的软件漏洞智能检测与定位方法与系统 |
CN110609693B (zh) * | 2019-08-15 | 2023-05-26 | 深圳赛安特技术服务有限公司 | 基于数据标准化的代码更新方法、装置及终端设备 |
CN110515626B (zh) * | 2019-08-20 | 2023-04-18 | Oppo广东移动通信有限公司 | 深度学习计算框架的代码编译方法及相关产品 |
CN111222141B (zh) * | 2019-12-31 | 2021-10-19 | 广东为辰信息科技有限公司 | 一种汽车电控单元代码漏洞分析方法和系统 |
CN112925524A (zh) * | 2021-03-05 | 2021-06-08 | 清华大学 | 一种检测驱动程序中不安全直接存储器访问的方法及装置 |
CN112965851A (zh) * | 2021-03-30 | 2021-06-15 | 建信金融科技有限责任公司 | 内存溢出处理方法、装置、电子设备和存储介质 |
CN113407442B (zh) * | 2021-05-27 | 2022-02-18 | 杭州电子科技大学 | 一种基于模式的Python代码内存泄漏检测方法 |
CN114637686A (zh) * | 2022-03-30 | 2022-06-17 | 阿里巴巴(中国)有限公司 | 静态代码扫描方法以及装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103793652A (zh) * | 2012-10-29 | 2014-05-14 | 广东电网公司信息中心 | 一种基于静态分析的应用系统代码安全扫描装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100461132C (zh) * | 2007-03-02 | 2009-02-11 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN102117228B (zh) * | 2011-02-28 | 2013-10-16 | 复旦大学 | 一种动静态结合的Java程序异常处理优化方法 |
-
2016
- 2016-04-27 CN CN201610269945.2A patent/CN105912381B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103793652A (zh) * | 2012-10-29 | 2014-05-14 | 广东电网公司信息中心 | 一种基于静态分析的应用系统代码安全扫描装置 |
Non-Patent Citations (4)
Title |
---|
Android平台下软件安全漏洞挖掘方法研究;唐宇敬;《中国优秀硕士学位论文全文数据库 信息科技辑》;20140430;I138-93 |
一种静态代码安全分析系统的设计与实现;梁婕;《中国优秀硕士学位论文全文数据库 信息科技辑》;20081031;第2.1.1小节、2.2.1小节至2.2.3小节、3.2节、3.3.4.1小节至3.3.4.2小节、3.5节、4.2节、图3-18 |
缓冲区溢出漏洞的静态检测方法研究;夏一民;《中国博士学位论文全文数据库 Information Science and Technology》;20090731;I139-23 |
软件源代码安全分析研究;张立勇;《万方学位论文库》;20111130;第3.3、3.4节 |
Also Published As
Publication number | Publication date |
---|---|
CN105912381A (zh) | 2016-08-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105912381B (zh) | 一种基于规则库的编译期代码安全检测方法 | |
Berabi et al. | Tfix: Learning to fix coding errors with a text-to-text transformer | |
Zhang et al. | A survey of learning-based automated program repair | |
CN108446540B (zh) | 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统 | |
Yu et al. | Deescvhunter: A deep learning-based framework for smart contract vulnerability detection | |
CN104899147B (zh) | 一种面向安全检查的代码静态分析方法 | |
Ruan et al. | DeepLink: Recovering issue-commit links based on deep learning | |
Zhou et al. | Augmenting Java method comments generation with context information based on neural networks | |
CN103914379B (zh) | 故障自动注入与故障检测的方法及其系统 | |
CN109885479A (zh) | 基于路径记录截断的软件模糊测试方法及装置 | |
CN103294596B (zh) | 一种基于程序不变量的合约式软件故障预警方法 | |
US9880834B2 (en) | Source program analysis system, source program analysis method, and recording medium on which program is recorded | |
CN106843840A (zh) | 一种基于相似度分析的源代码版本演化注释复用方法 | |
CN104021084A (zh) | 一种Java源代码缺陷检测方法及装置 | |
CN107203468A (zh) | 一种基于ast的软件版本演化对比分析方法 | |
CN103729295A (zh) | 一种污点传播路径分析方法 | |
CN103714000A (zh) | 一种面向敏感区域的嵌入式软件测试用例生成方法 | |
CN102141959B (zh) | 一种受上下文无关文法约束的测试用例生成方法 | |
CN103914374B (zh) | 基于程序切片和频繁模式提取的代码缺陷检测方法及装置 | |
Erwig et al. | Explanations for regular expressions | |
CN105630678B (zh) | 一种智能电能表软件的可靠性检测仪及其检测方法 | |
Khaliq et al. | A deep learning-based automated framework for functional User Interface testing | |
Alexandru et al. | Replicating parser behavior using neural machine translation | |
Yadavally et al. | (Partial) Program Dependence Learning | |
Wang et al. | A search of Verilog code plagiarism detection method |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |