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

文档序号:6573328阅读:579来源:国知局
专利名称:基于源代码静态分析的软件安全代码分析器及其检测方法
技术领域
本发明涉及一种在软件源代码中检测安全漏洞的技术,确切地说,涉及一种基于源代码静态分析技术的软件安全代码分析器及其检测方法,属于信息安全中的软件安全技术领域。
背景技术
目前,代码分析技术的研究很多,主流的开源软件包括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还可以检查数组的边界。
BOONBOON使用深度语义分析技术自动扫描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 CodeAnalyzer)是从源代码入手,解决软件面临的安全问题。该软件安全代码分析器根据输入的源程序,根据语法与语义,分析程序的结构与关键特征,从而获得程序的安全风险,并报告给用户。此外,它还可以将代码分析的结果通过报表,将发现的安全漏洞提交给用户进行审核与评估。
为了达到上述目的,本发明提供了一种基于源代码静态分析技术的软件安全代码分析器,其特征在于所述软件安全代码分析器包括有下述五个功能模块所组成代码解析器,负责对源程序代码进行词法、语法分析。然后抽象出足够多的信息并转换成抽象语法树AST(Abstract Syntax Tree)来表示,再送入代码分析引擎,为后继分析提供便利;该模块还可以支持解析项目工程文件,获取工程中全部源代码信息;代码分析引擎,由分别完成各自功能的五个子功能模块数据流分析器、控制流分析器、结构分析器、安全分析调度器及安全分析接口所组成,负责根据规则库分析程序的结构与关键特征,获得程序的安全风险,并通过安全风险报告器将结果提交给用户接口;安全风险报告器,负责根据代码分析引擎的结果,再参照规则库的相关语法与语义进行比对,将发现的安全风险提交给用户接口;安全规则库,负责为代码分析引擎提供使用可扩展标记语言XML配置的代码分析规则,以及对应不同的安全性漏洞的安全风险支持;还可以提供风险改进策略报告,即能够针对不同环境的软件系统的多样性和复杂性进行扩充;用户接口,负责与用户进行交互,一方面接受用户扫描代码的请求,另一方面则将扫描分析的结果向用户输出。
所述代码分析引擎中五个子模块的功能是数据流分析器,用于在代码解析的基础上,提取程序的数据流信息;它是通过遍历抽象语法树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,资源泄漏ResourceInjection,SQL注入SQL Injection,字符串错误中止String Termination Error;API误用,即API Abuse,包括危险函数Dangerous Function,目录限制Directory Restriction,未检测返回值Unchecked Return Value,堆检查HeapInspection;安全特征Security Features,包括不安全的随机数Insecure Randomness,最小权限违规Least Privilege Violation;时间与状态Time and State,包括文件访问竞赛条件File Access RaceConditionTOCTOU,不安全的临时文件Insecure Temporary File;代码质量Code Quality,包括双重释放Double Free,内存泄漏MemoryLeak,空指针检查Null Dereference,废弃函数Obsolete,未初始化变量Uninitialized Variable,未释放资源Unreleased Resource,释放后使用Use AfterFree。
为了达到上述目的,本发明还提供了一种基于源代码静态分析技术的软件安全代码分析器的检测软件安全漏洞的方法,其特征在于包括下列操作步骤(1)将用户配置好的需要进行检测的源代码目录、代码语言、头文件目录送入软件安全代码分析器后,该检测装置开始工作;(2)先对输入的源代码进行预处理,将程序中已经定义的头文件和宏解开,替换到源代码中相应的位置上;(3)读取规则文件,解析存储规则所使用的可扩展标记语言XML文件,获取所需要的安全分析规则;(4)对每一个处理过的源文件进行语法解析,在经过宏解析和头文件处理后,进行文法解析,将源代码解析成从左到右LL描述文法所描述的数据,此后解析为标准的AST语法树;(5)根据安全规则和AST语法树,对目标工程的源代码进行预分析;如果发现不需要进行流分析就能发现的安全问题,则直接把分析结果提交给结果处理模块;否则,将AST树与安全规则交给控制流分析器、数据流分析器和安全分析调度器,作进一步处理;(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,生成对应的程序控制依赖图,并向安全分析调度器提供接口,以读取这些信息;结构分析器是在代码分析引擎提取出的语法树基础上,根据安全规则库提供的代码分析规则,提取程序的主要结构(如入口点、主要函数名和函数关系等)信息,再调度数据流分析器和控制流分析器,完成对规则指定的关键变量的分析,并调用安全分析接口,完成对相关代码的安全性检测;安全分析调度器是代码分析引擎的主要调度模块,用于根据安全规则库提供的信息,调度结构分析器进行安全性分析,并生成报告表,提供接口供安全分析报告器调用;安全分析接口是负责根据安全规则调用特定的安全分析方法。这些方法利用语法树和流分析结果,进行安全分析,并将分析结果提交给安全风险报告器。
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语法树,对目标工程的源代码进行预分析;如果发现不需要进行流分析就能发现的安全问题,则直接把分析结果提交给结果处理模块;否则,将AST树与安全规则交给控制流分析器、数据流分析器和安全分析调度器,作进一步处理;(6)分别对AST语法树作进一步的控制流分析与数据流分析,其中数据流分析是将代码中所有变量的调用关系的数据集中到一个预先分配好的缓冲池中,使用时告诉变量名和所在行号,以便查找其函数调用表;控制流分析则是对特定行的控制关系进行统计,可以将代码中任意一行是否被控制、以及被哪行控制都提交给相关接口;该步骤细分为下述各个具体操作内容(如图4所示)(61)先进行控制流分析,即由软件安全代码分析器遍历AST语法树,寻找并获取其中包括if、while、for、switch的控制语句的控制节点;(62)如果存在所述包括if、while、for、switch的控制语句,则进行递归计算,记录控制关系,直到找不到控制关系为止;如果不存在所述的控制语句,则对已经分析出来的控制关系的控制节点进行记录;(63)进行到达/定值的数据流分析,获取每个参数的使用状况;
(64)如果存在参数引用的情况,则进行指针/别名分析,获取这些参数的实际指向;(65)根据参数的不同,分别进行变量查询、内存查询、或函数查询;(66)将查询结果存储到对应的数据列表中,方便下一步使用。
(7)根据规则中配置的分析类名,通过分析调度器对代码的安全问题进行分析,每一类安全问题对应于一个安全分析方法,由安全分析接口动态调用这些安全分析方法进行安全性分析;这些分析方法针对的安全漏洞至少包括缓冲区溢出、资源泄漏、危险API和格式化字符串,这些结构分析器利用安全规则、AST语法树和流分析的结果进行具体分析,一旦发现安全问题后,即将分析结果填充到结果缓冲池中;(8)安全分析结束后,将存储在结果缓冲池中的分析结果取出,存储在本地磁盘,并提交给用户审阅;本发明已经进行了两方面的实施试验,一个是软件开发的进行软件开发的企业和个人可以使用本发明对开发完成的源代码进行检测,从中查找出存在的风险,并进行改进。这样其代码研发的改进流程如图5所示。另一个是准入评估的作为测评机构以及最终部署软件产品的单位,由于并不了解软件开发的流程,只能对软件进行黑盒检测,软件中存在的安全隐患不能及时发现,对这些单位的安全运营造成了极大的威胁。本发明可以有效解决这一问题,通过代码扫描可以清楚地发现软件中存在的风险,保证软件的安全与稳定。其应用流程如图6所示。
权利要求
1.一种基于源代码静态分析技术的软件安全代码分析器,其特征在于所述软件安全代码分析器包括有下述五个功能模块所组成代码解析器,负责对源程序代码进行词法、语法分析。然后抽 象出足够多的信息并转换成抽象语法树AST来表示,再送入代码分析引擎,为后继分析提供便利;该模块还可以支持解析项目工程文件,获取工程中全部源代码信息;代码分析引擎,由分别完成各自功能的五个子功能模块数据流分析器、控制流分析器、结构分析器、安全分析调度器及安全分析接口所组成,负责根据规则库分析程序的结构与关键特征,获得程序的安全风险,并通过安全风险报告器将结果提交给用户接口;安全风险报告器,负责根据代码分析引擎的结果,再参照规则库的相关语法与语义进行比对,将发现的安全风险提交给用户接口;安全规则库,负责为代码分析引擎提供使用可扩展标记语言XML配置的代码分析规则,以及对应不同的安全性漏洞的安全风险支持;还可以提供风险改进策略报告,即能够针对不同环境的软件系统的多样性和复杂性进行扩充;用户接口,负责与用户进行交互,一方面接受用户扫描代码的请求,另一方面则将扫描分析的结果向用户输出。
2.根据权利要求1所述的软件安全代码分析器,其特征在于所述代码分析引擎中五个子模块的功能是数据流分析器,用于在代码解析的基础上,提取程序的数据流信息;它是通过遍历抽象语法树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,资源泄漏ResourceInjection,SQL注入SQL Injection,字符串错误中止String Termination Error;API误用,即API Abuse,包括危险函数Dangerous Function,目录限制Directory Restriction,未检测返回值Unchecked Return Value,堆检查HeapInspection;安全特征Security Features,包括不安全的随机数Insecure Randomness,最小权限违规Least Privilege Violation;时间与状态Time and State,包括文件访问竞赛条件File Access RaceConditionTOCTOU,不安全的临时文件Insecure Temporary File;代码质量Code Quality,包括双重释放Double Free,内存泄漏MemoryLeak,空指针检查Null Dereference,废弃函数Obsolete,未初始化变量Uninitialized Variable,未释放资源Unreleased Resource,释放后使用Use AfterFree。
5.一种基于源代码静态分析技术的软件安全代码分析器的检测软件安全漏洞的方法,其特征在于包括下列操作步骤(1)将用户配置好的需要进行检测的源代码目录、代码语言、头文件目录送入软件安全代码分析器后,该检测装置开始工作;(2)先对输入的源代码进行预处理,将程序中已经定义的头文件和宏解开,替换到源代码中相应的位置上;(3)读取规则文件,解析存储规则所使用的可扩展标记语言XML文件,获取所需要的安全分析规则;(4)对每一个处理过的源文件进行语法解析,在经过宏解析和头文件处理后,进行文法解析,将源代码解析成从左到右LL描述文法所描述的数据,此后解析为标准的AST语法树;(5)根据安全规则和AST语法树,对目标工程的源代码进行预分析;如果发现不需要进行流分析就能发现的安全问题,则直接把分析结果提交给结果处理模块;否则,将AST树与安全规则交给控制流分析器、数据流分析器和安全分析调度器,作进一步处理;(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.根据权利要求5所述的检测软件安全漏洞的方法,其特征在于所述步骤64中的别名分析是分析出两个或多个不同变量指向同一块数据区的情况。
全文摘要
一种基于源代码静态分析的软件安全代码分析器及其检测方法,软件安全代码分析器包括五个功能模块代码解析器、代码分析引擎、安全风险报告器、安全规则库和用户接口,其中代码分析引擎由数据流分析器、控制流分析器、结构分析器、安全分析调度器及安全分析接口所组成,负责提取程序结构并通过基于全文的语法、语义来分析代码的安全问题;通过输入的源代码和代码的语法与语义,由该引擎分析代码的结构和关键特征,由此获取程序的安全风险并报告给用户。本发明根据输入的源程序,根据语法与语义,分析程序的结构与关键特征,从而获得程序的安全风险,并报告给用户;还可将代码分析结果通过报表,将发现的安全漏洞提交给用户进行审核与评估。
文档编号G06F11/36GK101017458SQ20071006415
公开日2007年8月15日 申请日期2007年3月2日 优先权日2007年3月2日
发明者徐国爱, 张淼, 徐国胜, 梁婕, 陈爱国 申请人:北京邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1