软件源代码安全缺陷检测技术研究进展综述摘要:软件安全缺陷检测已经成为软件行业非常重要的一项工作。安全关键软件设计使用的C/C++语言含有大量未定义行为,使用不当可能产生重大安全隐患。本文将根据八篇前沿论文,总结提出八种比较新的软件安全缺陷检测技术和算法。设计和实现了一个可扩展的源代码静态分析工具平台,并通过实验表明,相对于单个工具的检测结果而言,该平台明显降低了漏报率和误报率。关键字:源代码;安全缺陷;静态检测工具;缺陷描述Abstract:Softwaresecuritydetectionhasbecomeaveryimportantworkinthesoftwareindustry.FatalsecurityvulnerabilitiesarecausedbyundefinedbehaviorsofC/C++languageusedinSafety-Criticalsoftware.Thispaperwillgiveouteightkindsofnewtechnologyaboutthesoftwaresecuritydetectionbasedoneightcutting-edgepapers.design.Keywords:sourcecode;safetydefects;statictesttools;statisticalanalysis;defectivesdescription1引言:近年来,随着软件事业的发展,人们逐渐的认识到,想要开发出高质量的软件产品,必须对软件的开发过程进行改善。研究表明,相当数量的安全问题是由于软件自身的安全漏洞引起的。软件开发过程中引入的大量缺陷,是产生软件漏洞的重要原因之一。软件源代码安全性缺陷排除是软件过程改进的一项重要措施。当前,与源代码安全缺陷研究相关的组织有CWE、Nist、OWASP等。业界也出现了一批优秀的源代码安全检测工具,但是这些机构、组织或者公司对源代码发中缺表1CWE中缺陷描述字段表2SAMATE中评估实例描述方法陷的描述方法不一,业界没有统一的标准。在实际工作中,经过确认的缺陷需要提取,源代码需要用统一的方法描述。本文根据实际工作的需要,调研国内外相关资料,提出一种源代码缺陷描述方法。通常意义上的网络安全的最大威胁是程序上的漏洞,程序漏洞检测主要分为运行时检测和静态分析方法。运行时检测方法需要运行被测程序,其检测依赖外部环境和测试用例,具有一定的不确定性。开发人员在开发过程中会引入一些源代码缺陷,如SQL注入、缓冲区溢出、跨站脚本攻击等。同时一些应用程序编程接口本身也可能存在安全缺陷。而这些安全缺陷轻则导致应用程序崩溃,重则导致计算机死机,造成的经济和财产损失是无法估量的。目前的防护手段无法解决源代码层面的安全问题。因而创建一套科学、完整的源代码安全缺陷评价体系成为目前亟待解决的问题。目前与源代码安全缺陷研究相关的组织有CWE等,业界也出现了一批优秀的源代码安全检测工具,但是这些机构和组织对源代码中缺陷的描述方法不一,没有统一的标准。本文借鉴业界对源代码缺陷的描述,结合实际工作需要,提出了一种计算机源代码缺陷的描述方法。随着社会信息化的不断加深,人们不得不开始面对日益突出的信息安全问题。研究表明,相当数量的安全问题是由于软件自身的安全漏洞引起的。软件开发过程中引入的大量缺陷,是产生软件漏洞的重要原因之一。不同的软件缺陷会产生不同的后果,必须区别对待各类缺陷,分析原因,研究其危害程度,预防方法等。建立一个比较完整的缺陷分类信息,对预防和修复软件安全缺陷具有指导作用。软件缺陷一般按性质分类,目前已有很多不同的软件缺陷分类法,但在当前实际审查使用中,这些缺陷分类存在以下弊端:(1)专门针对代码审查阶段发现缺陷的分类较少。现有的分类法一般包括动态测试发现的缺陷类型和文档缺陷等,而在代码审查中这些缺陷类型并不是审查关注的重点。(2)有些代码缺陷分类中的缺陷类型不适应当前代码审查实情,而一些新的代码缺陷类型则没有被包括。(3)目前源代码缺陷分类种类繁多,标准不一,各有欠缺。没有一个专门针对源代码缺陷的,比较仔细,完善的分类。2软件源代码安全缺陷分析方法:一种软件源代码安全缺陷分析的方法,其特征在于,包括:设定源代码缺陷类型多个缺陷数据组,所述的缺陷数据组包括:缺陷原因数据组、缺陷结果数据组、缺陷表现形式数据组;调取源代码并解析缺陷原因、结果、表现形式;判断所述的缺陷原因、结果、表现形式是否处于所述的缺陷数据组中,若是,进入步骤S4,若否,进入步骤531,将所述的缺陷原因和/或结果和/或表现形式加入到所述的缺陷数据组中;生成所述的源代码原因、结果、表现形式并显示。所述的软件源代码安全缺陷分析的方法,其特征在于,所述的缺陷原因包括内因、外因、主客观原因。具体是:注入缺陷及验证、应用程序编程接口错误、访问控制及密码失效、资源共享与竞争、异常处理、不安全源码质量、边界处理、配置错误、恶意代码;缓冲区溢出、整数溢出、命令注入、跨站脚本、拒绝服务、路径操纵、进程控制、资源注入、配置操纵、SQL注入、内存溢出;格式化字符串、赋值的目标存储空间不够、未使用括号保证操作的优先级、尝试修改常量、引用未初始化的变量。2.1软件安全建模为有效表示和检测软件中存在的安全缺陷和隐患,提出了一种软件安全建模与检测技术层次融合安全建模与检测技术。该技术采用多点建模技术,通过结合抽象建模、应用建模和数据建模等机制来实现对安全特征的描述。此外该技术利用表示层、应用层等不同抽象层次的建模信息,通过自动机与模型合成技术来构建安全特征模型。最后结合基于应用切片技术对软件中的安全缺陷与隐患进行检测。该技术克服了常规安全建模与检测中存在的缺点,可以有效表示和检测各种安全特征,提高了安全模型的表达力、复用性和适用性,降低了安全检测的复杂度。软件安全问题随着Internet的飞速发展越来越引起人们的关注。多数软件安全问题来源于软件自身,有的问题是由于软件安全功能不够完善,或多或少存在着不安全的设计,有的问题则是人为蓄意设计的安全漏洞。软件安全检测技术的主要作用就是检测、分析软件或软件设计中存在的这些安全问题,从而指导软件进行安全性能改善。在安全检测的过程中需要解决两个问题:①软件安全缺陷与隐患的表示即软件安全建模②软件安全缺陷与隐患的检测即基于该建模技术的安全检测。2.1.1安全建模.软件安全建模的主要目的是为了表示软件中存在的安全缺陷与隐患即软件安全特征。在安全建模中需要解决安全特征模型的复用性、适用性及表达力等几个方面的问题,在这些方面常规模型存在模型复用性低、适用范围小和表达力差的缺点。为了有效解决这些问题与缺点,这里提出层次融合建模技术,该建模技术的基本思想是建立多抽象层次、多组成成分的安全模型来表示软件安全特征。在安全建模中,首先把安全模型分成三个不同的组成部分:抽象模型m、面向应用的模型m’和数据模型m’’。这三种模型对应不同抽象层次的安全特征,其中抽象模型m为通用模型;m’为面向应用的模型,m’与m存在关系:m’→m,m与m’为1:n关系,m’是针对不同的环境而设计的;除了上述两种模型还有一种数据安全模型m’’,它直接反映数据或变量的约束和条件。通过三种不同模型的结合可以表示各类安全特征,这样就克服了常规安全模型表达力不足的缺点。此外为了提高模型的复用性与适用性,该建模技术把模型分割成三个层次进行构建,即应用层、抽象层、表示层。其中assml(AbstractSubSecurityModel)表示抽象安全模型m,主要针对软件需求等前期开发阶段而设计的,此模型不含应用相关的信息,用于较高层次安全特征的表示与检测,属于抽象层。由于抽象层独立于应用,它具有较强的复用性,这是该模型与其它技术的主要区别之一。为了增加模型的应用范围和可扩性在建模中又引入了应用层,在应用层中包括cssml(ConcreteSubSecurityModel)和dssml(DataSubSecurityModel)。其中cssml用来表示面向应用的安全模型m’,它与抽象安全模型相反,是针对不同的应用而设计,用于表示或检测较低层次安全特征,它是抽象安全模型assml的实例,它主要用在详细设计和编码阶段。dssml表示数据安全模型m’’,它主要针对编码阶段中的数据或逻辑安全特征而设计,它所反映的问题一般是最低级的数据或逻辑问题。最底层的sml(SecurityModel)表示安全模型的模式说明,它是一种全局安全模型,用于说明各个模型之间的关系和关键状态,sml属于表示层。图1安全模型的层次2.1.2基于模型的安检及关键技术在安全模型建立后,接着要进行软件安全性检测与分析。安全检测所面临的一个重要问题是如何对程序进行精简减小安全检测的范围与路径。2.2基于模型的软件安全性技术[1]2.2.1基于模型的软件安全分析的关键技术基于模型的软件安全分析是通过搜索软件或系统状态空间来确定该软件或系统是否具有与安全模型存在相关性的过程,我们这里所指的相关性主要是针对软件的安全特性来讲的。在安全分析的过程采用的关键技术主要包括:2.2.2模型表示技术为了描述软件中出现的缺陷和脆弱点要抽象出安全模型,这里需要把现实软件设计中的安全特性或缺陷表示成公式化的形式,安全模型一般来源于公认的安全软件设计经验和结构体系,在实施过程中对代码或设计安全模型的行为抽象要借助于建模技术和形式化语言来完成。2.2.3软件抽象技术除了模型表示技术之外,软件抽象技术也是本课题所用的关键技术。通常软件和软件结构比较复杂,可能涉及许多不同状态,直接进行安全分析的难度和复杂性较大,为减少软件的复杂性、降低安全分析的难度,需要采取抽象(Abstraction)或切片(SlicingOsl)技术对软件进行相应变换,即对软件结构按指定要求(软件安全模型或规范)进行简化,提高软件安全检测的效率。本课题采用的抽象技术是一种基于应用的切片技术。2.2.4安全检测在软件安全检测的过程中,首先通过模型表示技术即安全建模技术把安全特征表示成安全模型,然后该模型与切片技术相结合对软件进行简化,最后对简化后的软件实施安全分析,产生安全报告。2.2.5模型无关组件及组件问安全性分析2.2.6模型无关组件安全分析在完成上述依赖vDcp、fDep和安全距离vD、fD及安全依赖图的计算后,模型无关组件的安全分析就变得较为简单。首先按缺陷点遍历安全依赖图,给出存在潜在安全隐患的预测路径;然后分别给出函数安全距离与变量安全距离等参数,为后期的软件排错和测试提供依据。2.2.7组件间安全分析组件间安全分析是通过分析各组件之间的依赖或关联关系来获得的,它首先在完成组件之间依赖xDep和安全距离xD计算后,生成组件间安全依赖图。在获得依赖vDep、fDep、xDep和安全距离vD、xD及安全依赖图这些数据后,组件间的安全分析也变得容易越来,其安全检测报告主要来自上述几种计算结果。首先按含缺陷点的组件遍历组件安全依赖图,给出存在潜在安全隐患的预测路径;然后进入组件内分别给出函数安全距离与变量安全距离等参数,这样就提供了一种组件间安全分析方法。2.2.8安全预测的意义通过前面的计算和结论,发现:安全预测可以提供以前安全检测无法提供的相关安全信息,深化了安全检测的领域和功能;由安全预测所提供的依赖性和距离的观念可以从整体上反映软件的安全性、可靠性和软件的质量;安全预测为长期困扰人们的组件间安全检测提供了一种有效手段。3软件源代码安全缺陷检测技术3.1系统漏洞检测工具的设计原理[2]从软件维护的角度可知,软件开发过程中,越早发现漏洞并提出解决方案,所花费的代价越小,在开发阶段修复一个bug要比在设计阶段修复bug花费十倍的时间,金钱和精力,而在测试阶段又要花费十倍于开发阶段的代价。因此,微软提出的安全软件开发流程在软件开发的每个阶段都引入了安全措施,以便能尽量在早期发现安全漏洞。在软件开发的每个阶段都加入了相关的安全措施。在可行性分析时就对软件运行环境进行考虑,分析其潜在安全;在需求分析阶段加入对安全需求的分析,对得到的