首页 / 专利库 / 电脑编程 / 临时别名 / 基于源代码静态分析的软件安全代码分析器及其检测方法

基于源代码静态分析的软件安全代码分析器及其检测方法

阅读:768发布:2020-06-06

专利汇可以提供基于源代码静态分析的软件安全代码分析器及其检测方法专利检索,专利查询,专利分析的服务。并且一种基于源代码静态分析的 软件 安全代码分析器及其检测方法,软件安全代码分析器包括五个功能模 块 :代码解析器、代码分析引擎、安全 风 险报告器、安全规则库和用户 接口 ,其中代码分析引擎由数据流分析器、控制流分析器、结构分析器、 安全分析 调度器及安全分析接口所组成,负责提取程序结构并通过基于全文的语法、语义来分析代码的安全问题;通过输入的源代码和代码的语法与语义,由该引擎分析代码的结构和关键特征,由此获取程序的安全风险并报告给用户。本 发明 根据输入的源程序,根据语法与语义,分析程序的结构与关键特征,从而获得程序的安全风险,并报告给用户;还可将代码分析结果通过报表,将发现的安全漏洞提交给用户进行审核与评估。,下面是基于源代码静态分析的软件安全代码分析器及其检测方法专利的具体信息内容。

1.一种基于源代码静态分析技术的软件安全代码分析器,其特征在于:所 述软件安全代码分析器包括有下述五个功能模
代码解析器,负责对源程序代码进行词法、语法分析,然后抽象出足够多 的信息并转换成抽象语法树AST来表示,再送入代码分析引擎,为后继分析提 供便利;该模块还能够支持解析项目工程文件,获取工程中全部源代码信息;
代码分析引擎,由分别完成各自功能的五个子功能模块:数据流分析器、 控制流分析器、结构分析器、安全分析调度器及安全分析接口所组成,负责根 据安全规则库分析程序的结构与关键特征,获得程序的安全险,并通过安全 风险报告器将结果提交给用户接口;
安全风险报告器,负责根据代码分析引擎的结果,再参照安全规则库的相 关语法与语义进行比对,将发现的安全风险提交给用户接口;
安全规则库,负责为代码分析引擎提供使用可扩展标记语言XML配置的代 码分析规则,以及对应不同的安全性漏洞的安全风险支持;还能够提供风险改 进策略报告,即能够针对不同环境的软件系统的多样性和复杂性进行扩充;
用户接口,负责与用户进行交互,一方面接受用户扫描代码的请求,另一 方面则将扫描分析的结果向用户输出。
2.根据权利要求1所述的软件安全代码分析器,其特征在于:所述代码分 析引擎中五个子模块的功能是:
数据流分析器,用于在代码解析的基础上,提取程序的数据流信息;它是 通过遍历抽象语法树AST,提取出包括指针变量、内存块、常量、函数结构的 数据信息,再根据代码分析规则对这些信息进行刷选,并向结构分析器提供接 口,以读取这些信息;
控制流分析器,用于在代码解析基础上,提取程序的控制流信息;它是根 据代码分析规则和通过遍历抽象语法树AST,生成对应的程序控制依赖图,并 向安全分析调度器提供接口,以读取这些信息;
结构分析器,用于在代码分析引擎提取出的抽象语法树AST基础上,根据 安全规则库提供的代码分析规则,提取程序的包括入口点、主要函数名和函数 关系的主要结构信息,再调度数据流分析器和控制流分析器,完成对代码分析 规则指定的关键变量的分析,并调用安全分析接口,完成对相关代码的安全性 检测;
安全分析调度器,作为代码分析引擎的主要调度模块,用于根据安全规则 库提供的信息,调度结构分析器进行安全性分析,并生成报告表,提供接口供 安全风险报告器调用;
安全分析接口,负责根据代码分析规则调用特定的安全分析方法,这些方 法利用抽象语法树AST和流分析结果,进行安全分析,并将分析结果提交给安 全风险报告器。
3.根据权利要求1所述的软件安全代码分析器,其特征在于:所述源程序 代码是包括C、C++、C#、JAVA和Perl的主流开发语言。
4.根据权利要求1所述的软件安全代码分析器,其特征在于:所述软件安 全代码分析器能够检测出来的软件安全漏洞包括以下多类:
输入验证Input Validation,包括:缓冲区溢出Buffer Overflow,命令注入 Command Injection,跨站脚本Cross-Site Scripting,格式化字符串Format String, 非法指针Illegal Pointer Value,整数溢出Integer Overflow,日志伪造Log Forging, 路径操纵Path Manipulation,进程控制Process Control,资源泄漏Resource Injection,SQL注入SQL Injection,字符串错误中止String Termination Error;
API误用,即API Abuse,包括:危险函数Dangerous Function,目录限制 Directory Restriction,未检测返回值Unchecked Return Value,堆检查Heap Inspection;
安全特征Security Features,包括:不安全的随机数Insecure Randomness, 最小权限违规Least Privilege Violation;
时间与状态Time and State,包括:文件访问竞赛条件File Access Race Condition:TOCTOU,不安全的临时文件Insecure Temporary File;
代码质量Code Quality,包括:双重释放Double Free,内存泄漏Memory Leak,空指针检查Null Dereference,废弃函数Obsolete,未初始化变量 Uninitialized Variable,未释放资源Unreleased Resource,释放后使用Use After Free。
5.一种基于源代码静态分析技术的软件安全代码分析器的检测软件安全漏 洞的方法,其特征在于:包括下列操作步骤:
(1)将用户配置好的需要进行检测的源代码目录、代码语言、头文件目录 送入软件安全代码分析器后,该软件安全代码分析器开始工作;
(2)先对输入的源代码进行预处理,将程序中已经定义的头文件和宏解开, 替换到源代码中相应的位置上;
(3)读取代码分析规则文件,解析存储代码分析规则所使用的可扩展标记 语言XML文件,获取所需要的代码分析规则;
(4)对每一个处理过的源文件进行语法解析,在经过宏解析和头文件处理 后,进行文法解析,将源代码解析成从左到右LL描述文法所描述的数据,此 后解析为标准的抽象语法树AST;
(5)根据代码分析规则和抽象语法树AST,对目标工程的源代码进行预分 析;如果发现不需要进行流分析就能发现的安全问题,则直接把分析结果提交 给结果处理模块,跳转执行步骤(8)的操作;否则,顺序执行后续操作;
(6)分别对抽象语法树AST作进一步的控制流分析与数据流分析,其中 数据流分析是将代码中所有变量的调用关系的数据集中到一个预先分配好的缓 冲池中,使用时告诉变量名和所在行号,以便查找其函数调用表;控制流分析 则是对特定行的控制关系进行统计,可以将代码中任意一行是否被控制、以及 被哪行控制都提交给相关接口;
(7)根据代码分析规则中配置的分析类名,通过安全分析调度器对代码的 安全问题进行分析,每一类安全问题对应于一个安全分析方法,由安全分析接 口动态调用这些安全分析方法进行安全性分析;这些安全分析方法针对的安全 漏洞至少包括:缓冲区溢出、资源泄漏、危险API和格式化字符串,该安全分 析调度器调度结构分析器进行安全性分析,结构分析器利用代码分析规则、抽 象语法树AST和流分析的结果进行具体分析,一旦发现安全问题后,即将分析 结果填充到结果缓冲池中;
(8)安全分析结束后,将存储在结果缓冲池中的分析结果取出,存储在本 地磁盘,并提交给用户审阅。
6.根据权利要求5所述的检测软件安全漏洞的方法,其特征在于:所述步 骤(4)进一步包括下列操作内容:
(41)代码解析器中的语法解析模块先对输入的源文件的类型进行过滤, 根据扩展名提取所需的源代码;
(42)对提取的源代码进行预处理,解析代码中所有的头文件信息和宏信 息,并将其解开到指定的文件中;
(43)进行词法分析,将源代码转换为从左到右的LL描述文法;
(44)进行语法分析,将文法分析的结果转换成抽象语法树AST。
7.根据权利要求5所述的检测软件安全漏洞的方法,其特征在于:所述步 骤(6)进一步包括下列操作内容:
(61)先进行控制流分析,即由软件安全代码分析器遍历抽象语法树AST, 寻找并获取其中包括if、while、for、switch的控制语句;
(62)如果存在所述包括if、while、for、switch的控制语句,则进行递归 计算,记录控制关系,直到找不到控制关系为止;如果不存在所述的控制语句, 则对已经分析出来的控制关系进行记录;
(63)进行到达/定值的数据流分析,获取每个参数的使用状况;
(64)如果存在参数引用的情况,则进行指针/别名分析,获取这些参数的 实际指向;
(65)根据参数的不同,分别进行变量查询、内存查询、或函数查询;
(66)将查询结果存储到对应的数据列表中,方便下一步使用。
8.根据权利要求7所述的检测软件安全漏洞的方法,其特征在于:所述步 骤(64)中的别名分析是分析出两个或多个不同变量指向同一块数据区的情况。

说明书全文

技术领域

发明涉及一种在软件源代码中检测安全漏洞的技术,确切地说,涉及一 种基于源代码静态分析技术的软件安全代码分析器及其检测方法,属于信息安 全中的软件安全技术领域。

背景技术

目前,代码分析技术的研究很多,主流的开源软件包括:ITS4,BOON, CQual,MOPS,RATS,FlawFinder等。下面对这些软件进行简介:
ITS4:一种用于静态检测C和C++源代码安全漏洞的工具。同其它类似技 术相比,ITS4的准确性更高,能够在编程过程中把检测结果实时反馈给开发人 员;同时能够轻松地支持C++代码的检测。ITS4支持命令行格式,可运行于 Windows和Unix平台。ITS4在C或C++源代码中寻找危险的函数调用。对于 某些调用,ITS4会加以分析,以确定其危险程度。ITS4还会提供包括漏洞的简 单描述和改进方法的分析报告。ITS4基于函数匹配进行代码扫描,不关心上下 文。它只是搜索C或C++源代码中与漏洞数据库相匹配的函数或应用程序接口 API(Application Program Interface)。如果漏洞函数存在,ITS4会发出警告, 并向程序员提供修改建议,以提高代码安全性。程序员可以选择危险等级(0 -5),从而降低误报率。ITS4还允许程序员忽略对某个特定函数名的检查,如 scanf。
RATS:一种用于C、C++、Python、Per和PHP代码的安全审计工具。它 能够对源代码进行扫描,找出潜在的危险函数调用。该工具的最终目标并不是 找出代码漏洞,而是为人工安全审计提供一个方便合理的起点。RATS结合了 ITS4的静态检查技术和MOPS的深度语义分析技术检查缓冲区溢出漏洞。RATS 遵守通用公共许可证GPL。同ITS4相比,RATS可以对整个工程代码进行检查, 而不是单一文件。同时,RATS还可以检查数组的边界。
BOON:BOON使用深度语义分析技术自动扫描C语言源代码中存在的缓 冲区溢出漏洞。BOON可以对整数范围进行分析从而确定C程序中的数组是否 越界。尽管BOON能够找到许多其它分析工具所遗漏的漏洞,但是仍不精确。
除了上述主要工具外,国内外在软件的安全性分析领域也做了大量研究, 提出了一些可行的静态的安全性分析方法,并且构造了相应的软件安全性分析 工具。目前静态的安全性分析方法可分为:模型检验,携带代码验证,词法分 析,简单语义分析,基于信息流的安全性分析等。下面对其分别进行简要介绍:
模型检验,其基础是有限状态自动机。它列举一个系统能够处于的所有可 能状态,检查每个状态是否违反由用户制定的规则和条件,并根据分析结果报 告导致不合法状态的步骤。模型检验的理论基础是时序逻辑和自动机理论。它 将所要检验的属性表示成时序逻辑公式,系统表示成有限状态自动机,在遍历 有限状态自动机时,检查自动机所有状态是否满足所给属性。
模型检验能够发现程序中存在复杂语义上的错误,从而准确发现程序中潜 在的安全性漏洞,但现存的模型检验工具通常是分析源程序的形式化的表示(数 学描述),而不是以源程序作为输入。如需要源程序的数学模型,通常可以通过 程序分析(如数据流分析、控制流分析、程序切片)工具来自动完成源程序模 型的生成。从程序切片提取程序的精简模型中不难看出,程序分析是基础。此 处的程序分析,除了语法分析外,更需要涉及语义的分析,包括控制流分析和 数据流分析。
携带验证代码PCC(Proof-Carrying Code)的基本思想十分类似于密码。首 先,为代码定义一组安全策略。然后,代码提供者在编制程序时必须遵守这些 安全策略,并在程序源代码中加入验证的代码,以证明源程序的代码遵守了这 些安全策略;最后由代码使用者确认这些代码的安全性。
词法扫描是基于词法分析的安全性扫描。对源代码只进行词法分析。通过 静态扫描源代码找出潜在的安全漏洞,一旦发现就给出警告信息。基本方法是 将一个或多个源代码文件作为输入,并将每个文件分解为词法记号流,比较记 号流中的标识符和预先定义的安全性漏洞字典。例如一旦发现C源程序中存在 strcpy,strcat等字符串操作函数,即认为存在缓冲区溢出的安全性漏洞,因为这 些函数可能引起缓冲区溢出,此时的安全性漏洞字典包含strcpy,strcat等。
简单语义分析是基于语法和简单语义分析的安全性检查,其工作原理非常 类似于编译器系统,它以语法分析和语义规则为基础,同时加入简单的控制流 分析和数据流分析,因此具有较高的分析效率和可扩展性,并且可以通过向程 序中加入面向对象程序切片中的数据流分析注释信息的方式发现软件中广泛存 在的安全性漏洞,如程序中出现机率最多的内存访问漏洞,包括存储区的非法 使用、空指针的脱引用、缓冲区溢出等等。它的另一个优点是可适用于对大规 模程序的分析。
信息流分析:长期以来,特别是随着网络技术的发展,计算机系统中的信 息安全一直倍受关注,主流方法是基于类型推理的信息流验证和检测。信息流 验证和检测方法通过建立安全信息流验证的格模型(latice model)来提出了一 种验证机制来确保程序中信息流的安全性。该方法为信息指定一个集合的“安 全类”,并用“流关系”定义安全类之间允许的信息流,将程序中每个存贮对象 绑定到特定的安全类。当一个操作(或一系列的操作)使用某些对象(如x)的值, 获得其他对象(如y)的值,则引起从x到y的信息流。当且仅当给定的流策略中x 的安全类可以流向y的安全类,从x到y的信息流是允许的。
综合上述,目前主流的静态代码分析引擎基本都是以可疑API字符串匹配 为主,某些算法在上下文关联上也做了不少工作,但总的来看,这些现有技术 存在的不足是:各算法所能实现的功能还是局限性比较大。比如
(1)字符串匹配的不足:以字符串匹配为基础的规则匹配技术是目前代码 分析技术使用最普遍的算法,其主要思想是通过预先制定好的规则,根据关键 字匹配,查找出对应的代码,并提示用户。例如,使用ITC4扫描代码时,会 将所有使用strcpy的代码全部报告,认为其不安全,需要使用strncpy进行替换。 但是,这种方法误报率太高,很多已经经过检测的API也被认为是危险的,开 发人员很难分辨哪里才是真正存在安全问题。
(2)目前上下文关联算法的不足:有一些程序可以做到一定程度的根据上 下文关联,例如RATS及BOON。这里以BOON为例,其能将相关代码转换成 特定的描述语言,并通过检测相关变量在全文是否经过检查来判断代码是否存 在缓冲区溢出。这样,在一定程度上解决了误报问题,但是还存在一些问题。 例如不能检测句柄(双重指针)、不能检测字符串偏移(strcpy(a+5,b)的形式) 等,并且只能解决字符串缓冲区溢出和整数溢出,不能解决边界条件、输入验 证等问题。
由于目前软件的安全威胁非常多,包括常见的缓冲区溢出、竞赛条件、输 入验证等。这些在开发中的安全威胁非常容易被黑客所利用,而且不容易被开 发人员发现。因此如何对软件源代码中检测安全漏洞的技术进行改进,就成为 业内技术人员关注的热点。

发明内容

有鉴于此,本发明的目的是提供一种基于源代码静态分析技术的软件安全 代码分析器及其检测方法,该软件安全代码分析器SSCA(Software Security Code Analyzer)是从源代码入手,解决软件面临的安全问题。该软件安全代码分析 器根据输入的源程序,根据语法与语义,分析程序的结构与关键特征,从而获 得程序的安全险,并报告给用户。此外,它还可以将代码分析的结果通过报 表,将发现的安全漏洞提交给用户进行审核与评估。
为了达到上述目的,本发明提供了一种基于源代码静态分析技术的软件安 全代码分析器,其特征在于:所述软件安全代码分析器包括有下述五个功能模
代码解析器,负责对源程序代码进行词法、语法分析,然后抽象出足够多 的信息并转换成抽象语法树AST(Abstract Syntax Tree)来表示,再送入代码分 析引擎,为后继分析提供便利;该模块还能够支持解析项目工程文件,获取工 程中全部源代码信息;
代码分析引擎,由分别完成各自功能的五个子功能模块:数据流分析器、 控制流分析器、结构分析器、安全分析调度器及安全分析接口所组成,负责根 据安全规则库分析程序的结构与关键特征,获得程序的安全风险,并通过安全 风险报告器将结果提交给用户接口;
安全风险报告器,负责根据代码分析引擎的结果,再参照安全规则库的相 关语法与语义进行比对,将发现的安全风险提交给用户接口;
安全规则库,负责为代码分析引擎提供使用可扩展标记语言XML配置的代 码分析规则,以及对应不同的安全性漏洞的安全风险支持;还能够提供风险改 进策略报告,即能够针对不同环境的软件系统的多样性和复杂性进行扩充;
用户接口,负责与用户进行交互,一方面接受用户扫描代码的请求,另一 方面则将扫描分析的结果向用户输出。
所述代码分析引擎中五个子模块的功能是:
数据流分析器,用于在代码解析的基础上,提取程序的数据流信息;它是 通过遍历抽象语法树AST,提取出包括指针变量、内存块、常量、函数结构的 数据信息,再根据代码分析规则对这些信息进行刷选,并向结构分析器提供接 口,以读取这些信息;
控制流分析器,用于在代码解析基础上,提取程序的控制流信息;它是根 据代码分析规则和通过遍历抽象语法树AST,生成对应的程序控制依赖图,并 向安全分析调度器提供接口,以读取这些信息;
结构分析器,用于在代码分析引擎提取出的抽象语法树AST基础上,根据 安全规则库提供的代码分析规则,提取程序的包括入口点、主要函数名和函数 关系的主要结构信息,再调度数据流分析器和控制流分析器,完成对代码分析 规则指定的关键变量的分析,并调用安全分析接口,完成对相关代码的安全性 检测;
安全分析调度器,作为代码分析引擎的主要调度模块,用于根据安全规则 库提供的信息,调度结构分析器进行安全性分析,并生成报告表,提供接口供 安全风险报告器调用;
安全分析接口,负责根据代码分析规则调用特定的安全分析方法,这些方 法利用抽象语法树AST和流分析结果,进行安全分析,并将分析结果提交给安 全风险报告器。
所述源程序代码是包括C、C++、C#、JAVA和Perl的主流开发语言。
所述软件安全代码分析器能够检测出来的软件安全漏洞包括以下多类:
输入验证Input Validation,包括:缓冲区溢出Buffer Overflow,命令注入 Command Injection,跨站脚本Cross-Site Scripting,格式化字符串Format String, 非法指针Illegal Pointer Value,整数溢出Integer Overflow,日志伪造Log Forging, 路径操纵Path Manipulation,进程控制Process Control,资源泄漏Resource Injection,SQL注入SQL Injection,字符串错误中止String Termination Error;
API误用,即API Abuse,包括:危险函数Dangerous Function,目录限制 Directory Restriction,未检测返回值Unchecked Return Value,堆检查Heap Inspection;
安全特征Security Features,包括:不安全的随机数Insecure Randomness, 最小权限违规Least Privilege Violation;
时间与状态Time and State,包括:文件访问竞赛条件File Access Race Condition:TOCTOU,不安全的临时文件Insecure Temporary File;
代码质量Code Quality,包括:双重释放Double Free,内存泄漏Memory Leak,空指针检查Null Dereference,废弃函数Obsolete,未初始化变量 Uninitialized Variable,未释放资源Unreleased Resource,释放后使用Use After Free。
为了达到上述目的,本发明还提供了一种基于源代码静态分析技术的软件 安全代码分析器的检测软件安全漏洞的方法,其特征在于:包括下列操作步骤:
(1)将用户配置好的需要进行检测的源代码目录、代码语言、头文件目录 送入软件安全代码分析器后,该软件安全代码分析器开始工作;
(2)先对输入的源代码进行预处理,将程序中已经定义的头文件和宏解开, 替换到源代码中相应的位置上;
(3)读取代码分析规则文件,解析存储代码分析规则所使用的可扩展标记 语言XML文件,获取所需要的代码分析规则;
(4)对每一个处理过的源文件进行语法解析,在经过宏解析和头文件处理 后,进行文法解析,将源代码解析成从左到右LL描述文法所描述的数据,此 后解析为标准的抽象语法树AST;
(5)根据代码分析规则和抽象语法树AST,对目标工程的源代码进行预分 析;如果发现不需要进行流分析就能发现的安全问题,则直接把分析结果提交 给结果处理模块,跳转执行步骤(8)的操作;否则,顺序执行后续操作;
(6)分别对抽象语法树AST作进一步的控制流分析与数据流分析,其中 数据流分析是将代码中所有变量的调用关系的数据集中到一个预先分配好的缓 冲池中,使用时告诉变量名和所在行号,以便查找其函数调用表;控制流分析 则是对特定行的控制关系进行统计,可以将代码中任意一行是否被控制、以及 被哪行控制都提交给相关接口;
(7)根据代码分析规则中配置的分析类名,通过安全分析调度器对代码的 安全问题进行分析,每一类安全问题对应于一个安全分析方法,由安全分析接 口动态调用这些安全分析方法进行安全性分析;这些安全分析方法针对的安全 漏洞至少包括:缓冲区溢出、资源泄漏、危险API和格式化字符串,该安全分 析调度器调度结构分析器进行安全性分析,结构分析器利用代码分析规则、抽 象语法树AST和流分析的结果进行具体分析,一旦发现安全问题后,即将分析 结果填充到结果缓冲池中;
(8)安全分析结束后,将存储在结果缓冲池中的分析结果取出,存储在本 地磁盘,并提交给用户审阅。
所述步骤(4)进一步包括下列操作内容:
(41)代码解析器中的语法解析模块先对输入的源文件的类型进行过滤, 根据扩展名提取所需的源代码;
(42)对提取的源代码进行预处理,解析代码中所有的头文件信息和宏信 息,并将其解开到指定的文件中;
(43)进行词法分析,将源代码转换为从左到右的LL描述文法;
(44)进行语法分析,将文法分析的结果转换成抽象语法树AST。
所述步骤(6)进一步包括下列操作内容:
(61)先进行控制流分析,即由软件安全代码分析器遍历抽象语法树AST, 寻找并获取其中包括if、while、for、switch的控制语句;
(62)如果存在所述包括if、while、for、switch的控制语句,则进行递归 计算,记录控制关系,直到找不到控制关系为止;如果不存在所述的控制语句, 则对已经分析出来的控制关系进行记录;
(63)进行到达/定值的数据流分析,获取每个参数的使用状况;
(64)如果存在参数引用的情况,则进行指针/别名分析,获取这些参数的 实际指向;
(65)根据参数的不同,分别进行变量查询、内存查询、或函数查询;
(66)将查询结果存储到对应的数据列表中,方便下一步使用。
所述步骤(64)中的别名分析是分析出两个或多个不同变量指向同一块数 据区的情况。
本发明是一种基于源代码静态分析技术的软件安全代码分析器及其检测方 法,该软件安全代码分析器中的安全代码分析引擎可以提取出程序结构并通过 基于全文的语法、语义来分析代码的安全问题。通过输入的源代码以及代码的 语法与语义,由该引擎分析出代码的结构和关键特征,由此获取程序的安全风 险并报告给用户。
相对于目前其他相关技术,本发明的技术创新点主要是:1、其中的代码分 析规则是通过XML进行配置的,因此SSCA支持的软件安全漏洞是可以扩充 的。2、可扩充的多编程语言支持:源代码是经过独立的转换器转换为抽象语法 树AST,再进行分析的,即编程语言是可扩充的。3、基于上下文的代码含义 理解技术:本发明在分析代码时使用了数据流分析技术和控制流分析技术,从 而保证分析代码时是经过上下文含义理解与分析的。4、安全分析器动态加载: 在流分析后根据规则动态加载安全分析器。因此,本发明的优点和效果是:
(1)全程考察API参数使用的正确性:例如:参数在使用之前的某个地方 已经做出是否越界的处理等,而不是仅限于当前行做出判断,更不是简单地根据 可疑API的使用与否。
本发明通过分析特定的API或变量,提取出关键信息并转换为特定的格式, 再通过预先制定好的约束条件,在上下文范围内对代码进行分析,从而确定代 码的安全问题。例如,对于string溢出问题,程序通过分析特定的API(如strcpy、 strncpy、sprintf等),对其调用的变量进行检查,根据上下文检测其是否经过了 检测(例如是否判断过字符串长度、是否限制过字符串长度等),并根据该函数 的约束条件,判断是否可能发生缓冲区溢出。
(2)基于语意深度检测:相对于其他技术,本发明是根据程序的代码逻辑, 理解代码的含义,从而做出最恰当的判断。例如在处理缓冲区溢出时,不再只 根据关键API名称进行检测,而可以对API的上下关系进行分析,通过流分析 技术,找出其使用的变量是否已经被判断,从而大大提高检测的准确率。
(3)多语言支持及扩充能:目前其他技术只能支持少数几种固定的语言, 例如RATS支持C、C++、Python、Per和PHP,BOON只能支持C/C++。本发 明可以支持C、C++、C#、JAVA、Perl等主流开发语言,并可支持对新的语言 的扩充能力。
(4)多种特征漏洞的检测及扩充能力:目前其他工具只能支持特定的漏洞, 例如BOON只能检测缓冲区溢出,RATS也只能检测少数代码漏洞。本发明目 前已支持数十种软件安全漏洞,并可以通过预先配置好的代码分析规则,动态 添加可以检测的安全漏洞。
(5)多操作系统支持:相对其他软件安全工具,本系统可以支持目前绝大 多数主流操作系统,包括:Windows系列,Unix,Linux,FreeBSD等。
因此,本发明具有很好的推广应用前景。
附图说明
图1是本发明软件安全代码分析器的组成结构方框图
图2是本发明软件安全代码分析器的检测方法的流程图
图3是本发明软件安全代码分析器检测方法中的语法解析流程图。
图4是本发明软件安全代码分析器检测方法中的流分析流程图。
图5是使用本发明进行软件开发的实施例流程图。
图6是使用本发明进行准入评估的实施例流程图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明作 进一步的详细描述。
参见图1,介绍本发明基于源代码静态分析技术的软件安全代码分析器 SSCA的结构组成,主要包括有下述五个功能模块:
1、代码解析器,负责对源程序进行词法、语法分析,然后抽象出足够多的 信息并转换成抽象语法树AST来表示,再送入代码分析引擎,为后继分析提供 便利;该模块还能够支持解析项目工程文件,获取工程中全部源代码信息;
2、代码分析引擎,负责根据规则库分析程序的结构与关键特征,获得程序 的安全风险,并通过安全风险报告器将结果提交给用户接口;由分别完成各自 功能的五个子功能模块:数据流分析器、控制流分析器、结构分析器、安全分 析调度器及安全分析接口所组成;下面分别介绍这五个子功能模块:
数据流分析器是在代码解析的基础上,提取程序的数据流信息;它是通过 遍历抽象语法树AST,提取出包括指针变量、内存块、常量、函数结构的数据 信息,再根据代码分析规则对这些信息进行刷选,并向结构分析器提供接口, 以读取这些信息;
控制流分析器是在代码解析基础上,提取程序的控制流信息;它是根据代 码分析规则和通过遍历抽象语法树AST,生成对应的程序控制依赖图,并向安 全分析调度器提供接口,以读取这些信息;
结构分析器是在代码分析引擎提取出的抽象语法树AST基础上,根据安全 规则库提供的代码分析规则,提取程序的主要结构(如入口点、主要函数名和 函数关系等)信息,再调度数据流分析器和控制流分析器,完成对代码分析规 则指定的关键变量的分析,并调用安全分析接口,完成对相关代码的安全性检 测;
安全分析调度器是代码分析引擎的主要调度模块,用于根据安全规则库提 供的信息,调度结构分析器进行安全性分析,并生成报告表,提供接口供安全 风险报告器调用;
安全分析接口是负责根据代码分析规则调用特定的安全分析方法。这些方 法利用抽象语法树AST和流分析结果,进行安全分析,并将分析结果提交给安 全风险报告器。
3、安全风险报告器,负责根据代码分析引擎的结果,再参照安全规则库的 相关语法与语义进行比对,将发现的安全风险提交给用户接口;
4、安全规则库,负责为代码分析引擎提供使用可扩展标记语言XML配置 的代码分析规则,以及对应不同的安全性漏洞的安全风险支持;还能够提供风 险改进策略报告,即能够针对不同环境的软件系统的多样性和复杂性进行扩充;
5、用户接口,负责与用户进行交互,一方面接受用户扫描代码的请求,另 一方面则将扫描分析的结果向用户输出。
本发明软件安全代码分析器SSCA的关键是安全代码分析引擎,该引擎 可根据输入的源程序,根据语法与语义,分析程序的结构与关键特征,从而 获得程序的安全风险,并报告给用户。其中源代码首先考虑支持 C/C++/C#/JAVA/Perl等主流开发语言。
由上文可知,程序分析方法和代码分析规则的内容,决定了分析的结果和 效率。程序分析是安全性检查的基础,负责提取程序信息,以便和安全性规则 相匹配,从而扫描出其中的安全性漏洞。在本发明中,程序分析从数据流分析 和控制流分析两个度切入。代码分析规则的构建在于寻求不同安全性漏洞的 安全模式
由于软件系统(特别是分布式环境的软件系统)的多样性和复杂性,使得 安全性漏洞种类繁多,不可能解决所有这些问题。目前,本发明装置能够支持 的软件安全漏洞主要类别有:Input Validation、API Abuse、Security Features、 Time and State、Code Quality等。
参见图2,介绍SSCA检测操作方法流程的主要处理步骤:
(1)将用户配置好的需要进行检测的源代码目录、代码语言、头文件目录 送入软件安全代码分析器后,该软件安全代码分析器开始工作;
(2)先对输入的源代码进行预处理,将程序中已经定义的头文件和宏解开, 替换到源代码中相应的位置上;
(3)读取代码分析规则文件,解析存储规则使用的可扩展标记语言XML 文件,获取所需的代码分析规则;
(4)对每一个处理过的源文件进行语法解析,在经过宏解析和头文件处理 后,进行文法解析,将源代码解析成LL文法描述的数据,此后解析为标准的 抽象语法树AST;该步骤可细分为下述各个具体操作内容(参见图3所示):
(41)代码解析器中的语法解析模块先对输入的源文件的类型进行过滤, 根据扩展名提取所需的源代码;
(42)对提取源代码进行预处理,解析代码中所有的头文件信息和宏信息, 并将其解开到指定的文件中;
(43)进行词法分析,将源代码转换为从左到右的LL描述文法;
(44)进行语法分析,将文法分析的结果转换成抽象语法树AST。
(5)根据代码分析规则和抽象语法树AST,对目标工程的源代码进行预分 析;如果发现不需要进行流分析就能发现的安全问题,则直接把分析结果提交 给结果处理模块,跳转执行步骤(8)的操作;否则,顺序执行后续操作;
(6)分别对抽象语法树AST作进一步的控制流分析与数据流分析,其中 数据流分析是将代码中所有变量的调用关系的数据集中到一个预先分配好的缓 冲池中,使用时告诉变量名和所在行号,以便查找其函数调用表;控制流分析 则是对特定行的控制关系进行统计,可以将代码中任意一行是否被控制、以及 被哪行控制都提交给相关接口;该步骤细分为下述各个具体操作内容(如图4 所示):
(61)先进行控制流分析,即由软件安全代码分析器遍历抽象语法树AST, 寻找并获取其中包括if、while、for、switch的控制语句的控制节点
(62)如果存在所述包括if、while、for、switch的控制语句,则进行递归 计算,记录控制关系,直到找不到控制关系为止;如果不存在所述的控制语句, 则对已经分析出来的控制关系的控制节点进行记录;
(63)进行到达/定值的数据流分析,获取每个参数的使用状况;
(64)如果存在参数引用的情况,则进行指针/别名分析,获取这些参数的 实际指向;
(65)根据参数的不同,分别进行变量查询、内存查询、或函数查询;
(66)将查询结果存储到对应的数据列表中,方便下一步使用。
(7)根据规则中配置的分析类名,通过分析调度器对代码的安全问题进行 分析,每一类安全问题对应于一个安全分析方法,由安全分析接口动态调用这 些安全分析方法进行安全性分析;这些安全分析方法针对的安全漏洞至少包括: 缓冲区溢出、资源泄漏、危险API和格式化字符串;安全分析调度器调度结构 分析器进行安全性分析,结构分析器利用代码分析规则、抽象语法树AST和流 分析的结果进行具体分析,一旦发现安全问题后,即将分析结果填充到结果缓 冲池中;
(8)安全分析结束后,将存储在结果缓冲池中的分析结果取出,存储在本 地磁盘,并提交给用户审阅。
本发明已经进行了两方面的实施试验,一个是软件开发的:进行软件开发 的企业和个人可以使用本发明对开发完成的源代码进行检测,从中查找出存在 的风险,并进行改进。这样其代码研发的改进流程如图5所示。另一个是准入 评估的:作为测评机构以及最终部署软件产品的单位,由于并不了解软件开发 的流程,只能对软件进行黑盒检测,软件中存在的安全隐患不能及时发现,对 这些单位的安全运营造成了极大的威胁。本发明可以有效解决这一问题,通过 代码扫描可以清楚地发现软件中存在的风险,保证软件的安全与稳定。其应用 流程如图6所示。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈