[go: up one dir, main page]

CN114911711A - 一种代码缺陷分析方法、装置、电子设备及存储介质 - Google Patents

一种代码缺陷分析方法、装置、电子设备及存储介质 Download PDF

Info

Publication number
CN114911711A
CN114911711A CN202210669741.3A CN202210669741A CN114911711A CN 114911711 A CN114911711 A CN 114911711A CN 202210669741 A CN202210669741 A CN 202210669741A CN 114911711 A CN114911711 A CN 114911711A
Authority
CN
China
Prior art keywords
control flow
flow graph
code
analysis
program
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.)
Pending
Application number
CN202210669741.3A
Other languages
English (en)
Inventor
陈霖
匡晓云
杜金燃
杨祎巍
赖博宇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
China South Power Grid International Co ltd
Original Assignee
China South Power Grid International Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by China South Power Grid International Co ltd filed Critical China South Power Grid International Co ltd
Priority to CN202210669741.3A priority Critical patent/CN114911711A/zh
Publication of CN114911711A publication Critical patent/CN114911711A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Prevention of errors by analysis, debugging or testing of software
    • G06F11/3604Analysis of software for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • G06F21/563Static detection by source code analysis
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/20Natural language analysis
    • G06F40/253Grammatical analysis; Style critique

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Health & Medical Sciences (AREA)
  • General Health & Medical Sciences (AREA)
  • Quality & Reliability (AREA)
  • Virology (AREA)
  • Artificial Intelligence (AREA)
  • Audiology, Speech & Language Pathology (AREA)
  • Computational Linguistics (AREA)
  • Stored Programmes (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Abstract

本发明公开了一种代码缺陷分析方法、装置、电子设备及存储介质,用于解决现有的软件源代码缺陷分析方法对于源代码缺陷的检测准确性较低的技术问题。本发明包括:获取源代码,并对所述源代码进行文本分析,生成中间代码;采用所述中间代码生成控制流图;对所述控制流图进行程序切片,得到优化控制流图;所述优化控制流图具有多个节点;遍历所述优化控制流图中的各个节点,生成所述优化控制流图的程序路径信息;对所述程序路径信息做污点分析,判断所述源代码是否存在代码缺陷。

Description

一种代码缺陷分析方法、装置、电子设备及存储介质
技术领域
本发明涉及代码处理技术领域,尤其涉及一种代码缺陷分析方法、装置、电子设备及存储介质。
背景技术
源代码缺陷分析是通过对软件的源代码进行分析,发现程序中存在的安全漏洞、程序错误(BUG)及代码质量缺陷的技术手段。相对于传统的黑盒程序测试手段,源代码分析是一种白盒的软件检测技术。基于黑盒的检测无法了解到软件内部的运行逻辑和具体实现,而白盒检测可以看到软件内部实现的所有细节,因此基于源代码的检测能够更全面彻底的发现软件中存在的问题。它能够高效的检测出软件源代码中可能导致严重缺陷漏洞和系统运行异常的代码缺陷,并准确定位告警,从而有效地帮助开发人员消除代码中的缺陷。
软件源代码审计算法主要采用基于中间表示的分析和基于逻辑推理的分析技术。其中,基于中间表示的分析技术主要包括数据流分析、控制流分析、污点分析、符号执行等。Pixy采用取值分析、污点分析、指针别名分析等静态分析技术实现对PHP源码中的SQL注入和跨站脚本等漏洞的检测。Prefi采用静态符号执行技术模拟执行C/C++源码程序,并采用约束求解对程序中的部分路径进行检测。Melange采用数据流分析的框架,通过对程序进行数据流、控制流等复杂分析检测安全相关的漏洞,并支持对大型C/C++源码程序的分析。K-Miner利用内核代码中高度标准化的接口实现了可扩展性良好的指针分析以及全局的上下文敏感的分析技术,支持对空指针引用、指针释放后重引用。指针重释放、双重检查锁定等内存崩溃漏洞的检测。基于逻辑推理的分析技术主要是指模型检测,如MOPS、BLAST、SLAM是典型的面向C程序的模型检测工具,其基本思路是将程序结构抽象为状态机(布尔程序),然后基于归纳的安全属性对状态机进行遍历,检测其中存在的漏洞。
然而,现有的软件源代码缺陷分析方法对于源代码缺陷的检测准确性较低。
发明内容
本发明提供了一种代码缺陷分析方法、装置、电子设备及存储介质,用于解决现有的软件源代码缺陷分析方法对于源代码缺陷的检测准确性较低的技术问题。
本发明提供了一种代码缺陷分析方法,包括:
获取源代码,并对所述源代码进行文本分析,生成中间代码;
采用所述中间代码生成控制流图;
对所述控制流图进行程序切片,得到优化控制流图;所述优化控制流图具有多个节点;
遍历所述优化控制流图中的各个节点,生成所述优化控制流图的程序路径信息;
对所述程序路径信息做污点分析,判断所述源代码是否存在代码缺陷。
可选地,所述文本分析包括词法分析和语法分析;所述获取源代码,并对所述源代码进行文本分析,生成中间代码的步骤,包括:
对所述源代码进行词法分析,得到词素序列;
对所述词素序列进行语法分析,生成抽象语法树;
遍历所述抽象语法树的结构,将所述抽象语法树转换为中间代码。
可选地,所述采用所述中间代码生成控制流图的步骤,包括:
在所述中间代码中查找入口指令;
根据所述入口指令将所述中间代码划分为若干个基本块;
连接所述基本块,生成所述中间代码的控制流图。
可选地,所述程序路径信息包括第一遍历路径和第二遍历路径;所述遍历所述优化控制流图中的各个节点,生成所述优化控制流图的程序路径信息的步骤,包括:
遍历所述优化控制流图中的各个节点,确定第一遍历路径;
获取所述第一遍历路径中的分支节点;所述分支节点为具有至少两个输出节点的节点;
在不处于所述第一遍历路径中的输出节点中选择一个节点作为基础节点;
基于所述基础节点生成第二遍历路径。
本发明还提供了一种代码缺陷分析装置,包括:
中间代码生成模块,用于获取源代码,并对所述源代码进行文本分析,生成中间代码;
控制流图生成模块,用于采用所述中间代码生成控制流图;
优化控制流图生成模块,用于对所述控制流图进行程序切片,得到优化控制流图;所述优化控制流图具有多个节点;
程序路径信息生成模块,用于遍历所述优化控制流图中的各个节点,生成所述优化控制流图的程序路径信息;
污点分析模块,用于对所述程序路径信息做污点分析,判断所述源代码是否存在代码缺陷。
可选地,所述文本分析包括词法分析和语法分析;所述中间代码生成模块,包括:
词法分析子模块,用于对所述源代码进行词法分析,得到词素序列;
语法分析子模块,用于对所述词素序列进行语法分析,生成抽象语法树;
中间代码生成子模块,用于遍历所述抽象语法树的结构,将所述抽象语法树转换为中间代码。
可选地,所述控制流图生成模块,包括:
入口指令查找子模块,用于在所述中间代码中查找入口指令;
基本块划分子模块,用于根据所述入口指令将所述中间代码划分为若干个基本块;
控制流图生成子模块,用于连接所述基本块,生成所述中间代码的控制流图。
可选地,所述程序路径信息包括第一遍历路径和第二遍历路径;所述程序路径信息生成模块,包括:
第一遍历路径确定子模块,用于遍历所述优化控制流图中的各个节点,确定第一遍历路径;
分支节点获取子模块,用于获取所述第一遍历路径中的分支节点;所述分支节点为具有至少两个输出节点的节点;
基础节点选择子模块,用于在不处于所述第一遍历路径中的输出节点中选择一个节点作为基础节点;
第二遍历路径生成子模块,用于基于所述基础节点生成第二遍历路径。
本发明还提供了一种电子设备,所述设备包括处理器以及存储器:
所述存储器用于存储程序代码,并将所述程序代码传输给所述处理器;
所述处理器用于根据所述程序代码中的指令执行如上任一项所述的代码缺陷分析方法。
本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质用于存储程序代码,所述程序代码用于执行如上任一项所述的代码缺陷分析方法。
从以上技术方案可以看出,本发明具有以下优点:本发明通过获取源代码,并对源代码进行文本分析,生成中间代码;采用中间代码生成控制流图;对控制流图进行程序切片,得到优化控制流图;优化控制流图具有多个节点;遍历优化控制流图中的各个节点,生成优化控制流图的程序路径信息;对所述程序路径信息做污点分析,判断所述源代码是否存在代码缺陷。从而提高了代码缺陷检测的准确性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
图1为本发明实施例提供的一种代码缺陷分析方法的步骤流程图;
图2为本发明另一实施例提供的一种代码缺陷分析方法的步骤流程图;
图3为本发明实施例提供的中间代码生成流程图;
图4为本发明实施例提供的一种程序切片的示意图;
图5为本发明实施例提供的一种控制流图的结构示意图;
图6为本发明实施例提供的路径裁剪示意图;
图7为本发明实施例提供的一种代码缺陷分析装置的结构框图。
具体实施方式
本发明实施例提供了一种代码缺陷分析方法、装置、电子设备及存储介质,用于解决现有的软件源代码缺陷分析方法对于源代码缺陷的检测准确性较低的技术问题。
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
请参阅图1,图1为本发明实施例提供的一种代码缺陷分析方法的步骤流程图。
本发明提供的一种代码缺陷分析方法,具体可以包括以下步骤:
步骤101,获取源代码,并对源代码进行文本分析,生成中间代码;
源代码也称源程序,是指一系列人类可读的计算机语言指令,在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,其目的是为了编译出计算机程序。
在本发明实施例中,为了对源代码进行缺陷分析,首先需要对其进行文本分析,生成中间代码。
步骤102,采用中间代码生成控制流图;
在生成源代码的中间代码后,可以采用中间代码来生成控制流图。
控制流图(Control Flow Graph,CFG)是对中间代码处理后得到的供静态分析使用的一种图形表示形式,一般由多个基本块(Basic Block)组成。由于采用的是编译之后的中间形式来生成控制流图,由于基本块中包含的数据、指令相对比较简单,因此不需要额外的工作来处理简化函数调用、条件表达式以及其他复杂的表达式。
步骤103,对控制流图进行程序切片,得到优化控制流图;优化控制流图具有多个节点;
在生成了控制流图后,可以对控制流图进行程序切片,得到优化控制流图;每个优化控制流图均为原控制流图的一个切片。其中,每个优化控制流图由多个节点组成。
切片分析用于从控制流图中抽取对程序中兴趣点上的特定变量有影响的语句和谓词,组成新的程序(称作切片),然后通过分析切片来分析源程序的行为。
步骤104,遍历优化控制流图中的各个节点,生成优化控制流图的程序路径信息;
在得到优化控制流图后,可以遍历优化控制流图中的各个节点,得到优化控制流图的程序路径信息。
步骤105,对程序路径信息做污点分析,判断源代码是否存在代码缺陷。
在获取到程序路径信息后,可以遍历程序路径信息中各个节点的节点信息,判断节点的安全状态,在结合预设的缺陷规则对安全状态进行判断,从而判断源代码是否存在缺陷。
本发明通过获取源代码,并对源代码进行文本分析,生成中间代码;采用中间代码生成控制流图;对控制流图进行程序切片,得到优化控制流图;优化控制流图具有多个节点;遍历优化控制流图中的各个节点,生成优化控制流图的程序路径信息;对程序路径信息做污点分析,判断源代码是否存在代码缺陷。从而提高了代码缺陷检测的准确性。
请参阅图2,图2为本发明另一实施例提供的一种代码缺陷分析方法的步骤流程图。具体可以包括以下步骤:
步骤201,对源代码进行词法分析,得到词素序列;
像用自然语言书写的文章一样,源程序是由一系列的句子组成的,句子是由单词符号按一定的规则构成的,而单词符号又是由字符按照一定的规则构成。因此,源程序实际上是由满足程序语言规范化字符按照一定的规则组合起来构成的一组字符串。
词法分析的功能是,从左到右逐个地扫描源程序的字符串,按照词法规则,识别出单词符号作为输出,对识别过程中发现的词法错误,输出有关的错误信息。
由词法分析识别出的词素序列是语法分析的输入,语法分析据此判断它们是否构成了合法的句子。由词法分析识别出的常数和由用户定义的名字,可以分别在常数表和符号表中予以登记,以在编译的各个阶段中使用符号表。
步骤202,对词素序列进行语法分析,生成抽象语法树;
在使用某一种程序设计编写程序时,都要遵循一套特定的规则。比如,在C语言中,一个程序由多个函数组成,一个函数由声明和语句组成,一个语句由表达式组成等等。这组规则精确描述了一个良构的程序设计语言的语法。语法分析能够确定一个源程序的语法结构,能够检测出源程序中的语法错误,并且能够从常见的错误中恢复并继续处理程序的其余部分。
语法分析可以验证从词法分析得到的词素序列是否可以由源语言的文法生成。通过语法分析可以构造一棵抽象语法树,并把它传递给编译器进行处理,在构建抽象语法树的过程中,就验证了这个词素序列是否符合源语言的文法。
步骤203,遍历抽象语法树的结构,将抽象语法树转换为中间代码;
在编译器的分析-综合模型中,前端对源程序进行分析并产生中间表示,后端在此基础上生成目标代码。理想情况下,和源语言相关的细节在前端分析中处理,而关于目标机器的细节则在后端处理。和中间代码相关的内容包括中间代码表示、静态类型检查和中间代码生成。
在一个示例中,中间代码的生成流程如图3所示:
首先,将源代码和代码文法输入到Antlr4处理器进行处理,Antlr4处理器通过词法分析器对源代码进行词法分析,生成token序列(即词素序列);接着通过语法分析器对token序列进行语法分析,生成AST抽象语法树;最后通过中间代码生成器对AST抽象语法树进行处理,得到中间代码。
具体地,中间代码生成器前端首先将AST抽象语法树转换为中间表达形式(Intermediate Representation,IR),后端再将其转化为中间代码。其中IR可以选用基于栈的IR,这种IR的特点是中间代码生成非常容易实现。其常用指令如下所示:
PUSH:往运算栈中压入数据
LOAD:将变量的值读出,压入栈中
STORE:从栈顶弹出一个值,写入变量
LABEL:定义一个标号
BZ:从栈顶弹出一个值,如果该值等于0,则跳转到标号l执行,否则继续执行下一条指令
B:无条件跳转到标号执行
CMP_LE/ADD:两条二元运算指令,从栈上依次弹出两个值,分别作为右操作数和左操作数,执行整数二元运算,将结果压入栈。
步骤204,采用中间代码生成控制流图;
控制流图是对中间代码处理之后得到的供静态分析使用的一种图形表示形式,一般由多个中间代码Basic Block组成。由于采用的是编译之后中间代码,而不是源代码,Basic Block中包含的数据、指令相对比较简单,不需要额外的工作来处理简化函数调用、条件表达式以及其他复杂的表达式。
在一个示例中,采用中间代码生成控制流图的步骤,可以包括:
S41,在中间代码中查找入口指令;
S42,根据入口指令将中间代码划分为若干个基本块;
S43,连接基本块,生成中间代码的控制流图。
在本发明实施例中,中间代码指令很容易区分跳转指令和非跳转指令,因此在遍历指令构建CFG时,可以首先找出每个基本块的入口指令,将两个相邻入口指令之间的部分划分为一个基本块。在一个示例中,符合以下条件的指令可以为基本块的入口指令:
代码的第一条指令;
能由条件转移指令或无条件转移指令跳转到的指令;
紧跟在转移指令之后的指令。
在将中间代码划分为不同的基本块之后,可以将其连接形成控制流图。
在一个示例中,可以按照以下连接规则进行连接:
创建一条从控制流图的入口基本块指向包含第一条中间代码指令的基本块的边;
创建一条从包含最后一条中间代码指令的基本块指向控制流图的出口基本块的边;
遍历所有基本块,如果一个基本块的最后一条中间代码指令ip不是转移指令,则创建一条从该基本块指向以ip的下一条中间代码指令为入口指令的基本块的边;如果ip表示无条件转移指令,则创建一条从该基本块指向以目标指令为入口指令的基本块的边;如果ip表示条件转移指令,则创建一条从该基本块指向以ip的下一条指令为入口指令的基本块的边,并创建一条从该基本块指向以目标指令为入口指令的基本块的边;如果ip表示switch指令,则为每个将目标指令作为入口指令的基本块建立一条从基本块指向它的边;如果以上情况都不是,即基本块的最后一条指令是非跳转指令,则连接该基本块和以紧接着该基本块最后一条指令的指令为入口指令的基本块。
步骤205,对控制流图进行程序切片,得到优化控制流图;优化控制流图具有多个节点;
切片分析用于从控制流图中抽取对程序中兴趣点上的特定变量有影响的语句和谓词,组成新的程序(称作切片),然后通过分析切片来分析源程序的行为。海量的代码上下文关联分析,尤其分析污点定值问题,会严重滞缓代码分析速度。基于代码切片分析可以得到污点相关变量到安全相关变量间的定值图,为缓解定值分析面临的过度定值的问题,采取的解决方法是对其进行进一步分解简化控制流图将定值操作与控制流路径对应,最终形如一棵以sink函数为根节点的倒树。图4示出了一种分解后得到的程序切片示意图。
假设fun(int x)的x和source()都是外界可控源,则其取值域都可设为[-215,215),按原来的定值图,到达sink点处的x和y的取值域将分别是[-216,216)和[-215,215),但由于调用点sun(a,1)的参数y被赋值为1,使得对x和y的定值结果与虚线对应的数据流路径产生分歧。由此可见,将各安全相关变量的定值结果进行简单的并集操作,无法准确刻画不同路径的执行结果,定值分析的结果应与控制流流路径进行对应,实线路径到达sink点的定值结果为x:[-216,216)和y:[-215,215),虚线路径对应的定值结果为x:[-216,216)和y:1。
此时得到的定值结果仅为可能域,例如虚线路径的定值结果依赖的条件是a<b且a为int型,由于b的最大取值为215-1,所以x值域应是[-215,215),但由于y被赋值为常量1,故其值域属于必然域。变量定值的必然域一般能保证程序的正确执行,重点检查各路径的可能域是否完备。因此,可认为路径为“安全的”,当满足a+b≥215条件时实线路径的执行结果产生整数溢出。
步骤206,遍历优化控制流图中的各个节点,生成优化控制流图的程序路径信息;
在本发明实施例中,程序路径信息包括第一遍历路径和第二遍历路径;遍历优化控制流图中的各个节点,生成优化控制流图的程序路径信息的步骤,可以包括:
S61,遍历优化控制流图中的各个节点,确定第一遍历路径;
S62,获取第一遍历路径中的分支节点;分支节点为具有至少两个输出节点的节点;
S63,在不处于第一遍历路径中的输出节点中选择一个节点作为基础节点;
S64,基于基础节点生成第二遍历路径。
在实际应用中,通过遍历控制流图,可以生成所有代码路径信息。然而,在处理路径过多的程序时,由于路径爆炸问题会导致无法遍历完成所有的路径,从而导致代码覆盖率较低。有鉴于此,本发明实施例采用基于Worklist的遍历算法来进行程序路径信息的获取。其基本思想是,每次需要选择路径时,优先选择经过次数少的路径,而将另一条路径加入到Worklist中;待当前路径遍历完成,从Worklist中取出一个节点开始另一条路径的遍历。
以如图5所示的控制流图为例,按照现有的深度优先算法,遍历路径的顺序是:
1a)A→B→D→E→G
2a)→F→G
3a)→C→D→E→G
4a)→F→G
假设说程序限制了最大路径数为2,那么路径3a)和路径4a)就无法遍历,即基本块并没有完全覆盖(基本块C没有被覆盖到)。如果控制流图中的路径进一步增加,则无法覆盖的代码量也可能会进一步增加。
而按照本发明实施例的方法,遍历路径的顺序为:
1b)A→B→D→E→G(第一遍历路径)
2b)→C→D→F→G(第二遍历路径)
3b)A→B→D→F→G
4b)→C→D→E→G
具体而言,其实现过程是:
1)处理A(分支节点)之后,选择B(A的输出节点)作为下一个遍历的基本块,将C(及其对应的程序状态,C也为A的输出节点)加入到Worklist={C};处理D(分支节点)之后选择E(D的输出节点),将F(D的分支节点)加入Worklist={C,F},处理G。这样路径1b)就遍历完成;
2)从Worklist中取出C(基础节点)遍历第二条路径,处理D之后,由于路径DvE已经走过一次,而路径DvF尚未走过,因此选择F,将E加入Worklist={F,E}。然后遍历完第2b)条路径;
从Worklist中取出F,得到第3b)条路径;
取出E,得到第4b)条路径。
根据本发明实施例,只需要遍历两条路径就能够实现代码的完全覆盖。即使控制流图中的路径数进一步增加,也只需要2条路径就能覆盖所有代码。将这两条路径作为本发明实施例的程序路径信息,进行后续操作。
进一步地,遍历控制流图时,需要记录变量在程序中的全部状态,这需要空间来存储这些状态信息。变量独立的历史状态检测是为了缓解由于程序路径数增加,存储的历史状态过多导致空间不足的问题。原有的方法是每次检查历史状态是否命中时,使用当前程序状态与历史上各次进入当前基本块时的完整状态进行比较,仅当程序状态作为一个整体命中时,才认为当前路径的分析可以终止。历史状态的存储也是将程序状态作为一个整体进行存储,而不管本次状态整体中仅有一个变量的状态与历史状态不合。由此带来的空间消耗问题在路径数增加时更加严重。
因此可以将每个变量的状态独立开来存入历史状态中,可以有效减少历史状态的空间需求;历史状态比较则采用单个变量命中的方式来处理。假如说基本块历史上已经遍历过2次,现在存在历史状态为{a:X;b:Y,a:Y,b:Z}(a、b表示变量,X、Y、Z表示状态),当前程序状态是{a:X;b:Z},由于变量a能够命中,变量b也能够命中,虽然两者命中的历史状态是不同路径下的变量状态,但是按照改进后的方法,则仍然认为历史状态整体命中,因而当前路径终止分析。
进一步地,遍历控制流图时,也会生成大量的程序路径,使用程序静态分析方法进行漏洞检测具有分析速度快且能够发现隐藏较深的安全漏洞等优点,但在分析复杂的程序路径时可能存在较多误报,对于误报需要后期投入大量的资源进行人工分析,太多的误报信息也可能导致重要的有用信息被淹没,降低了分析结果的可信度。在静态分析过程中产生误报的原因有很多程序的路径为不可行路径,因此在静态分析过程中如何对不可行路径进行剪枝,是降低静态分析误报率,提高检测结果准确性的一个重要问题。
要实现对不可行路径的剪枝,首先要对其进行识别,在生成中间代码时引入额外的控制流而产生的不可行路径和其它一些在静态分析阶段就能够确定条件表达式取值,而能够识别出的不可行路径。方法能够剪去较大部分不可行路径,从而有效地减少了漏洞静态检测的误报。
基于上述对问题的分析通过对在静态分析阶段就能够确定其取值的变量及其值的传播进行跟踪,当遇到分支语句时,对分支条件表达式的值进行检查,若其值可确定,停止分析与当前值对应的不可行路径,从而在漏洞静态检测时实现对不可行路径的剪枝。要在漏洞静态检测时对不可行路径进行剪枝,首先需要判断路径是否可行,因此需要检查条件表达式的当前取值情况。只有当表达式中所有变量的取值都能够确定时,该表达式的取值才能够确定,所以对表达式进行求值前要先判断条件表达式中的所有变量的取值是否都能够确定。因此需要在到达该条件语句前对所有变量的当前取值状态进行跟踪。而变量的取值之所以最终能够确定的根源,往往是因为它被赋予了某个常量值,使得静态分析器可以确定其具体取值。
对程序安全状态进行跟踪和检查,使用基于有限状态机模型的漏洞状态机描述程序变量安全状态的转换规则,对程序各可能执行路径进行遍历并识别当前操作,对当前操作所涉及的程序变量根据漏洞状态机赋予其相应的安全状态,在安全相关操作处检查操作数据的安全状态输出安全漏洞信息。图6为本发明实施例提供的路径裁剪示意图。
步骤207,对程序路径信息做污点分析,判断源代码是否存在代码缺陷。
在获取到程序路径信息后,可以遍历程序路径信息中各个节点的节点信息,判断节点的安全状态,在结合预设的缺陷规则对安全状态进行判断,从而判断源代码是否存在缺陷。
在一个示例中,可以通过污点分析来判断源代码是否存在缺陷。
其中,预设的缺陷规则可以由污点信息产生点(source)、污点信息汇聚点(sink)组成,并包含缺陷类型的的详细描述信息。
产生点(source):污点产生点往往是用户输入的数据,比如Web应用中读取URL参数的函数,顾名思义,这些函数调用后的返回值被标记为污点——攻击者可以操控的数据点。
汇聚点(sink):检查点是程序的一些敏感操作,如调用数据库查询语句,或是将数据返回到网页,如果这些操作的数据是污点,那么意味着操作可被攻击者利用,即程序存在漏洞。
预设的缺陷规则可以在污点分析过程中,帮助工具识别代码路径是否存在风险。
程序污点分析可以通过解析代码程序路径,对不信任的输入数据做标记,静态跟踪程序运行过程中污点数据的传播路径,检测使用污点数据的不安全方式,用这种方法可以检测到敏感数据(如字符串参数)被改写而造成的缓冲区溢出、格式化字符串、命令注入等问题。当检测到一个攻击时,污点分析技术可以提供详细的攻击过程,给出由于污点数据所导致的漏洞被利用的过程.污点及其传播路径信息还可以用来产生脆弱性签名。
进一步地,若要输出带有污点传播路径信息的漏洞实例报告,必须在污点分析函数时记录函数内部信息,具体来说,不仅要记录与污点传播相关函数调用的指令位置,还需要记录函数内返回污点的返回语句位置,以及函数调用语句位置。
本发明通过获取源代码,并对源代码进行文本分析,生成中间代码;采用中间代码生成控制流图;对控制流图进行程序切片,得到优化控制流图;优化控制流图具有多个节点;遍历优化控制流图中的各个节点,生成优化控制流图的程序路径信息;对程序路径信息做污点分析,判断源代码是否存在代码缺陷。从而提高了代码缺陷检测的准确性。
请参阅图7,图7为本发明实施例提供的一种代码缺陷分析装置的结构框图。
本发明实施例提供了一种代码缺陷分析装置,包括:
中间代码生成模块701,用于获取源代码,并对源代码进行文本分析,生成中间代码;
控制流图生成模块702,用于采用中间代码生成控制流图;
优化控制流图生成模块703,用于对控制流图进行程序切片,得到优化控制流图;优化控制流图具有多个节点;
程序路径信息生成模块704,用于遍历优化控制流图中的各个节点,生成优化控制流图的程序路径信息;
污点分析模块705,用于对程序路径信息做污点分析,判断源代码是否存在代码缺陷。
在本发明实施例中,文本分析包括词法分析和语法分析;中间代码生成模块701,包括:
词法分析子模块,用于对源代码进行词法分析,得到词素序列;
语法分析子模块,用于对词素序列进行语法分析,生成抽象语法树;
中间代码生成子模块,用于遍历抽象语法树的结构,将抽象语法树转换为中间代码。
在本发明实施例中,控制流图生成模块702,包括:
入口指令查找子模块,用于在中间代码中查找入口指令;
基本块划分子模块,用于根据入口指令将中间代码划分为若干个基本块;
控制流图生成子模块,用于连接基本块,生成中间代码的控制流图。
在本发明实施例中,程序路径信息包括第一遍历路径和第二遍历路径;程序路径信息生成模块704,包括:
第一遍历路径确定子模块,用于遍历优化控制流图中的各个节点,确定第一遍历路径;
分支节点获取子模块,用于获取第一遍历路径中的分支节点;分支节点为具有至少两个输出节点的节点;
基础节点选择子模块,用于在不处于第一遍历路径中的输出节点中选择一个节点作为基础节点;
第二遍历路径生成子模块,用于基于基础节点生成第二遍历路径。
本发明实施例还提供了一种电子设备,设备包括处理器以及存储器:
存储器用于存储程序代码,并将程序代码传输给处理器;
处理器用于根据程序代码中的指令执行本发明实施例的代码缺陷分析方法。
本发明实施例还提供了一种计算机可读存储介质,计算机可读存储介质用于存储程序代码,程序代码用于执行本发明实施例的代码缺陷分析方法。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (10)

1.一种代码缺陷分析方法,其特征在于,包括:
获取源代码,并对所述源代码进行文本分析,生成中间代码;
采用所述中间代码生成控制流图;
对所述控制流图进行程序切片,得到优化控制流图;所述优化控制流图具有多个节点;
遍历所述优化控制流图中的各个节点,生成所述优化控制流图的程序路径信息;
对所述程序路径信息做污点分析,判断所述源代码是否存在代码缺陷。
2.根据权利要求1所述的方法,其特征在于,所述文本分析包括词法分析和语法分析;所述获取源代码,并对所述源代码进行文本分析,生成中间代码的步骤,包括:
对所述源代码进行词法分析,得到词素序列;
对所述词素序列进行语法分析,生成抽象语法树;
遍历所述抽象语法树的结构,将所述抽象语法树转换为中间代码。
3.根据权利要求1所述的方法,其特征在于,所述采用所述中间代码生成控制流图的步骤,包括:
在所述中间代码中查找入口指令;
根据所述入口指令将所述中间代码划分为若干个基本块;
连接所述基本块,生成所述中间代码的控制流图。
4.根据权利要求1所述的方法,其特征在于,所述程序路径信息包括第一遍历路径和第二遍历路径;所述遍历所述优化控制流图中的各个节点,生成所述优化控制流图的程序路径信息的步骤,包括:
遍历所述优化控制流图中的各个节点,确定第一遍历路径;
获取所述第一遍历路径中的分支节点;所述分支节点为具有至少两个输出节点的节点;
在不处于所述第一遍历路径中的输出节点中选择一个节点作为基础节点;
基于所述基础节点生成第二遍历路径。
5.一种代码缺陷分析装置,其特征在于,包括:
中间代码生成模块,用于获取源代码,并对所述源代码进行文本分析,生成中间代码;
控制流图生成模块,用于采用所述中间代码生成控制流图;
优化控制流图生成模块,用于对所述控制流图进行程序切片,得到优化控制流图;所述优化控制流图具有多个节点;
程序路径信息生成模块,用于遍历所述优化控制流图中的各个节点,生成所述优化控制流图的程序路径信息;
污点分析模块,用于对所述程序路径信息做污点分析,判断所述源代码是否存在代码缺陷。
6.根据权利要求5所述的装置,其特征在于,所述文本分析包括词法分析和语法分析;所述中间代码生成模块,包括:
词法分析子模块,用于对所述源代码进行词法分析,得到词素序列;
语法分析子模块,用于对所述词素序列进行语法分析,生成抽象语法树;
中间代码生成子模块,用于遍历所述抽象语法树的结构,将所述抽象语法树转换为中间代码。
7.根据权利要求5所述的装置,其特征在于,所述控制流图生成模块,包括:
入口指令查找子模块,用于在所述中间代码中查找入口指令;
基本块划分子模块,用于根据所述入口指令将所述中间代码划分为若干个基本块;
控制流图生成子模块,用于连接所述基本块,生成所述中间代码的控制流图。
8.根据权利要求5所述的装置,其特征在于,所述程序路径信息包括第一遍历路径和第二遍历路径;所述程序路径信息生成模块,包括:
第一遍历路径确定子模块,用于遍历所述优化控制流图中的各个节点,确定第一遍历路径;
分支节点获取子模块,用于获取所述第一遍历路径中的分支节点;所述分支节点为具有至少两个输出节点的节点;
基础节点选择子模块,用于在不处于所述第一遍历路径中的输出节点中选择一个节点作为基础节点;
第二遍历路径生成子模块,用于基于所述基础节点生成第二遍历路径。
9.一种电子设备,其特征在于,所述设备包括处理器以及存储器:
所述存储器用于存储程序代码,并将所述程序代码传输给所述处理器;
所述处理器用于根据所述程序代码中的指令执行权利要求1-4任一项所述的代码缺陷分析方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质用于存储程序代码,所述程序代码用于执行权利要求1-4任一项所述的代码缺陷分析方法。
CN202210669741.3A 2022-06-14 2022-06-14 一种代码缺陷分析方法、装置、电子设备及存储介质 Pending CN114911711A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210669741.3A CN114911711A (zh) 2022-06-14 2022-06-14 一种代码缺陷分析方法、装置、电子设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210669741.3A CN114911711A (zh) 2022-06-14 2022-06-14 一种代码缺陷分析方法、装置、电子设备及存储介质

Publications (1)

Publication Number Publication Date
CN114911711A true CN114911711A (zh) 2022-08-16

Family

ID=82770519

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210669741.3A Pending CN114911711A (zh) 2022-06-14 2022-06-14 一种代码缺陷分析方法、装置、电子设备及存储介质

Country Status (1)

Country Link
CN (1) CN114911711A (zh)

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115982053A (zh) * 2023-01-17 2023-04-18 城云科技(中国)有限公司 一种检测软件源代码缺陷的方法、装置及应用
CN115982059A (zh) * 2023-03-21 2023-04-18 麒麟软件有限公司 Shell脚本检查工具的实现方法
CN117556431A (zh) * 2024-01-12 2024-02-13 北京北大软件工程股份有限公司 一种混合软件漏洞分析方法和系统
WO2024037168A1 (zh) * 2022-08-18 2024-02-22 华为技术有限公司 建立模型的方法、装置以及设备
CN117744087A (zh) * 2023-12-07 2024-03-22 浙江大学 基于静态分析的智能设备远程代码执行漏洞检测方法
CN117874767A (zh) * 2024-01-03 2024-04-12 中国人民解放军国防科技大学 一种基于程序转换的sql注入漏洞防御方法与系统
CN118963994A (zh) * 2024-07-15 2024-11-15 上海壁仞科技股份有限公司 资源管理方法、电子设备和存储介质
CN119312347A (zh) * 2024-10-10 2025-01-14 中国电信股份有限公司技术创新中心 一种代码检测方法、装置及电子设备
CN119323014A (zh) * 2024-09-29 2025-01-17 西安电子科技大学 一种基于完全域敏感和源敏感的控制流完整性方法、系统、设备及介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120233599A1 (en) * 2011-03-11 2012-09-13 Oracle International Corporation Efficient model checking technique for finding software defects
CN104765687A (zh) * 2015-04-10 2015-07-08 江西师范大学 基于对象跟踪和污点分析的j2ee程序漏洞检测方法
CN110187885A (zh) * 2019-06-10 2019-08-30 合肥本源量子计算科技有限责任公司 一种量子程序编译的中间代码生成方法及装置
CN111240982A (zh) * 2020-01-09 2020-06-05 华东师范大学 源代码静态分析方法
CN112579469A (zh) * 2020-12-29 2021-03-30 中国信息安全测评中心 一种源代码缺陷检测方法与装置

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120233599A1 (en) * 2011-03-11 2012-09-13 Oracle International Corporation Efficient model checking technique for finding software defects
CN104765687A (zh) * 2015-04-10 2015-07-08 江西师范大学 基于对象跟踪和污点分析的j2ee程序漏洞检测方法
CN110187885A (zh) * 2019-06-10 2019-08-30 合肥本源量子计算科技有限责任公司 一种量子程序编译的中间代码生成方法及装置
CN111240982A (zh) * 2020-01-09 2020-06-05 华东师范大学 源代码静态分析方法
CN112579469A (zh) * 2020-12-29 2021-03-30 中国信息安全测评中心 一种源代码缺陷检测方法与装置

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024037168A1 (zh) * 2022-08-18 2024-02-22 华为技术有限公司 建立模型的方法、装置以及设备
CN115982053A (zh) * 2023-01-17 2023-04-18 城云科技(中国)有限公司 一种检测软件源代码缺陷的方法、装置及应用
CN115982059A (zh) * 2023-03-21 2023-04-18 麒麟软件有限公司 Shell脚本检查工具的实现方法
CN117744087A (zh) * 2023-12-07 2024-03-22 浙江大学 基于静态分析的智能设备远程代码执行漏洞检测方法
CN117744087B (zh) * 2023-12-07 2024-10-01 浙江大学 基于静态分析的智能设备远程代码执行漏洞检测方法
CN117874767A (zh) * 2024-01-03 2024-04-12 中国人民解放军国防科技大学 一种基于程序转换的sql注入漏洞防御方法与系统
CN117556431A (zh) * 2024-01-12 2024-02-13 北京北大软件工程股份有限公司 一种混合软件漏洞分析方法和系统
CN117556431B (zh) * 2024-01-12 2024-06-11 北京北大软件工程股份有限公司 一种混合软件漏洞分析方法和系统
CN118963994A (zh) * 2024-07-15 2024-11-15 上海壁仞科技股份有限公司 资源管理方法、电子设备和存储介质
CN119323014A (zh) * 2024-09-29 2025-01-17 西安电子科技大学 一种基于完全域敏感和源敏感的控制流完整性方法、系统、设备及介质
CN119312347A (zh) * 2024-10-10 2025-01-14 中国电信股份有限公司技术创新中心 一种代码检测方法、装置及电子设备

Similar Documents

Publication Publication Date Title
CN114911711A (zh) 一种代码缺陷分析方法、装置、电子设备及存储介质
Schäfer et al. An empirical evaluation of using large language models for automated unit test generation
US11714611B2 (en) Library suggestion engine
CN109426722B (zh) Sql注入缺陷检测方法、系统、设备及存储介质
Kang et al. Assessing the generalizability of code2vec token embeddings
US20230350645A1 (en) Method and System for Arbitrary-Granularity Execution Clone Detection
Medeiros et al. DEKANT: a static analysis tool that learns to detect web application vulnerabilities
Chandra et al. Angelic debugging
CN110059006B (zh) 代码审计方法及装置
Degiovanni et al. $\mu $ BERT: Mutation Testing using Pre-Trained Language Models
WO2019075390A1 (en) BOX BLACK MATCHING MOTOR
CN112131120B (zh) 一种源代码缺陷检测方法及装置
Madani Metamorphic malware evolution: The potential and peril of large language models
Medeiros et al. Statically detecting vulnerabilities by processing programming languages as natural languages
KR20200071413A (ko) 학습용 데이터 생성 장치, 소스 코드 오류 분석 장치 및 방법
Taghavi et al. Using large language models to better detect and handle software vulnerabilities and cyber security threats
Siddiq et al. FRANC: A lightweight framework for high-quality code generation
Dubniczky et al. Castle: Benchmarking dataset for static code analyzers and llms towards cwe detection
Jerónimo et al. Techniques of sast tools in the early stages of secure software development: A systematic literature review
Ceka et al. Can llm prompting serve as a proxy for static analysis in vulnerability detection
Utkin et al. Evaluating the impact of source code parsers on ML4SE models
Zhao et al. Yama: Precise Opcode-Based Data Flow Analysis for Detecting PHP Applications Vulnerabilities
CN120296747A (zh) 一种基于ChatGPT的增强思维链提示软件漏洞检测方法
Gajjar et al. MalCodeAI: Autonomous vulnerability detection and remediation via language agnostic code reasoning
Mir et al. On the effectiveness of machine learning-based call graph pruning: An empirical study

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication

Application publication date: 20220816

RJ01 Rejection of invention patent application after publication