一种基于静态分析技术的源代码检测系统及方法与流程

文档序号:12747927阅读:618来源:国知局
一种基于静态分析技术的源代码检测系统及方法与流程

本发明涉及源代码检测领域,并且更具体地,涉及一种基于静态分析技术的源代码检测系统及方法。



背景技术:

随着网络技术和应用的飞速发展,信息系统安全正面临着前所未有的挑战。网络化和互联互通性已经成为当前软件和信息系统的发展方向。信息系统与互联网或其他网络的互连,使信息系统遭受攻击的概率增大,也导致了信息系统面临的安全威胁空前地增加。另一方面,随着构建在信息系统之上的各种业务应用的不断丰富,以及软件和信息系统复杂程度的不断提高,信息系统中隐藏的各种安全隐患也越来越多,并且通常难以被发现和消除。

最近几年,重大安全事件的频频发生揭示了当前信息系统安全形势的严峻性。仅仅依靠传统的安全防护机制来保障信息安全的做法已经逐渐力不从心。软件代码是构建系统信息的基础组件,软件代码中安全漏洞和未声明功能(后门)的存在是安全事件频繁发生的根源。忽视软件代码自身的安全性,而仅仅依靠外围的防护、事后的修补等方法,舍本逐末,必然事倍功半。只有通过管理和技术手段保障软件代码自身的安全性,再辅以各种安全防护手段,才是解决当前安全问题的根本解决之道。

然而,目前的源代码检测系统只能按照检测系统的检测规则进行检测,例如,进行检测系统预先确定的缺陷类型的检测。另一方面,当前主流的源代码安全检测产品通常是根据通用需求开发,而很多用户由于各自业务的不同,对源代码安全有很多个性化的需求,例如组织内部安全编码规范的自动化合规检测等。目前的工具对这种个性化需求的支持不足,导致国内用户在应用源代码安全检测产品时无法完全满足组织自身的需求。此外,现有技术中并没有在进行源代码分析时使用任何有效的静态分析技术的启示。



技术实现要素:

为了解决上述问题,提供一种基于静态分析技术的源代码检测系统,所述系统包括:

接口单元,用于接收待检测的源代码以及用户的标识;

源代码安全管理单元,对所述待检测的源代码进行识别,以确定所述待检测的源代码的编程语言和编译器版本,并且根据用户的标识获取预先设定的定制规则,向缺陷知识库发送包括所述预先设定的定制规则的检测请求;

缺陷知识库,用于存储多个规则库并且根据所述预先设定的定制规则从所述多个规则库获取至少一个检测规则;

集成编译器,根据所述待检测的源代码的编程语言和编译器版本对所述待检测的源代码进行编译,以获得编译信息;以及检测单元,根据所述至少一个检测规则对编译信息进行静态分析检测以确定检测结果。

优选地,根据所述至少一个检测规则对编译信息进行静态分析检测以确定检测结果包括:根据所述至少一个检测规则对编译信息进行模拟符号执行检测以确定检测结果,所述模拟符号执行检测能够避免对所述待检测的源代码中无法执行的路径进行检测,从而降低检测误报率。

优选地,所述模拟符号执行检测能够避免对源代码中无法执行的路径进行检测,从而降低检测误报率包括:所述模拟符号执行检测将待检测的源代码中的输入值用作符号值,针对每条执行路径进行符号模拟执行,在执行路径的分支处记录变量的约束信息并且对约束信求解,在判断所述分支处的分支路径无法执行时,不对所述分支路径进行检测,从而降低检测误报率。

优选地,根据所述至少一个检测规则对编译信息进行静态分析检测以确定检测结果包括:根据所述至少一个检测规则对编译信息进行数据流分析检测以确定检测结果。

优选地,其中所述数据流分析检测使用流不敏感分析、流敏感分析和路径敏感分析对编译信息进行数据流分析。

优选地,其中所述流不敏感分析用于确定编译信息中函数的整体数据流信息。

优选地,其中所述流敏感分析用于确定函数的控制流程中每个节点所对应的数据流信息,

优选地,所述路径敏感分析为函数的控制流程中沿不同路径到达同一节点的不同状态信息

优选地,其中所述源代码安全管理单元基于用户所属行业的代码安全规范确定所述预先设定的定制规则。

优选地,其中所述源代码安全管理单元基于用户预先输入的检测要求确定所述预先设定的定制规则。

优选地,其中所述集成编译器包括以下内容中的至少一个:C/C++编译器、Java/JSP编译器、C#编译器、Python编译器以及PHP编译器。

优选地,所述多个规则库为:缺陷检测规则库、合规检测规则库以及开源组件检测规则库。

优选地,所述缺陷检测规则库包括以下内容中的至少一个:常见缺陷列表、安全隐患列表以及编程错误列表。

优选地,所述合规检测规则库包括以下内容中的至少一个:计算机安全应急响应组CERT安全编码规范和汽车产业软件可靠性协会MISRA的C/C++安全编码规范。

优选地,所述开源组件检测规则库包括通过搜索引擎和/或大数据网络所收集的开源组件信息。

优选地,所述多个规则库还包括定制化规则库,所述定制化规则库用于存储与定制规则对应的至少一个检测规则。

优选地,所述源代码安全管理单元对检测结果进行分析以确定是否需要进行额外检测,如果不需要进行额外检测,则根据检测结果生成检测报告。

优选地,所述源代码安全管理单元对检测结果进行分析以确定是否需要进行额外检测,如果需要进行额外检测,则通过接口单元将检测结果中的缺陷信息发送给缺陷管理系统,以进行额外检测。

优选地,还包括采用离线或在线方式来更新缺陷知识库。

根据本发明的另一方面,提供一种基于静态分析技术的源代码检测方法,所述方法包括:

接收待检测的源代码以及用户的标识;

对所述待检测的源代码进行识别,以确定所述待检测的源代码的编程语言和编译器版本,并且根据用户的标识获取预先设定的定制规则,向缺陷知识库发送包括所述预先设定的定制规则的检测请求;

根据所述预先设定的定制规则从缺陷知识库中的多个规则库获取至少一个检测规则;

所述待检测的源代码的编程语言和编译器版本对所述待检测的源代码进行编译,以获得编译信息;以及

根据所述至少一个检测规则对编译信息进行静态分析检测以确定检测结果。

优选地,根据所述至少一个检测规则对编译信息进行静态分析检测以确定检测结果包括:根据所述至少一个检测规则对编译信息进行模拟符号执行检测以确定检测结果,所述模拟符号执行检测能够避免对所述待检测的源代码中无法执行的路径进行检测,从而降低检测误报率。

优选地,所述模拟符号执行检测能够避免对源代码中无法执行的路径进行检测,从而降低检测误报率包括:所述模拟符号执行检测将待检测的源代码中的输入值用作符号值,针对每条执行路径进行符号模拟执行,在执行路径的分支处记录变量的约束信息并且对约束信求解,在判断所述分支处的分支路径无法执行时,不对所述分支路径进行检测,从而降低检测误报率。

优选地,根据所述至少一个检测规则对编译信息进行静态分析检测以确定检测结果包括:根据所述至少一个检测规则对编译信息进行数据流分析检测以确定检测结果。

优选地,其中所述数据流分析检测使用流不敏感分析、流敏感分析和路径敏感分析对编译信息进行数据流分析。

优选地,其中所述流不敏感分析用于确定编译信息中函数的整体数据流信息。

优选地,其中所述流敏感分析用于确定函数的控制流程中每个节点所对应的数据流信息,

优选地,所述路径敏感分析为函数的控制流程中沿不同路径到达同一节点的不同状态信息

优选地,其中基于用户所属行业的代码安全规范确定所述预先设定的定制规则。

优选地,其中基于用户预先输入的检测要求确定所述预先设定的定制规则。

优选地,其中所述编译器包括以下内容中的至少一个:C/C++编译器、Java/JSP编译器、C#编译器、Python编译器以及PHP编译器。

优选地,所述多个规则库为:缺陷检测规则库、合规检测规则库以及开源组件检测规则库。

优选地,所述缺陷检测规则库包括以下内容中的至少一个:常见缺陷列表、安全隐患列表以及编程错误列表。

优选地,所述合规检测规则库包括以下内容中的至少一个:计算机安全应急响应组CERT安全编码规范和汽车产业软件可靠性协会MISRA的C/C++安全编码规范。

优选地,所述开源组件检测规则库包括通过搜索引擎和/或大数据网络所收集的开源组件信息。

优选地,所述多个规则库还包括定制化规则库,所述定制化规则库用于存储与定制规则对应的至少一个检测规则。

优选地,所述源代码安全管理单元对检测结果进行分析以确定是否需要进行额外检测,如果不需要进行额外检测,则根据检测结果生成检测报告。

优选地,所述源代码安全管理单元对检测结果进行分析以确定是否需要进行额外检测,如果需要进行额外检测,则通过接口单元将检测结果中的缺陷信息发送给缺陷管理系统,以进行额外检测。

优选地,还包括采用离线或在线方式来更新缺陷知识库。

附图说明

通过参考下面的附图,可以更为完整地理解本发明的示例性实施方式:

图1为根据本发明优选实施方式的基于静态分析技术的源代码检测系统的结构示意图;

图2为根据本发明优选实施方式的接口单元的结构示意图;

图3为根据本发明优选实施方式的集成编译器的结构示意图;

图4为根据本发明优选实施方式的检测单元的结构示意图;

图5为根据本发明优选实施方式的缺陷知识库的结构示意图;以及

图6为根据本发明优选实施方式的基于静态分析技术的源代码检测方法的流程图。

具体实施方式

现在参考附图介绍本发明的示例性实施方式,然而,本发明可以用许多不同的形式来实施,并且不局限于此处描述的实施例,提供这些实施例是为了详尽地且完全地公开本发明,并且向所属技术领域的技术人员充分传达本发明的范围。对于表示在附图中的示例性实施方式中的术语并不是对本发明的限定。在附图中,相同的单元/元件使用相同的附图标记。

除非另有说明,此处使用的术语(包括科技术语)对所属技术领域的技术人员具有通常的理解含义。另外,可以理解的是,以通常使用的词典限定的术语,应当被理解为与其相关领域的语境具有一致的含义,而不应该被理解为理想化的或过于正式的意义。

图1为根据本发明优选实施方式的基于静态分析技术的源代码检测系统100的结构示意图。源代码检测系统100针对源代码安全需求,在对源代码进行高精度的定制安全缺陷分析及溯源检测的基础上,还可与源代码版本管理系统(例如,版本控制系统SVN、分布式版本控制系统GIT)、缺陷管理系统(例如,缺陷跟踪系统Bugzilla,Bug-Tracking System)等进行无缝对接,以最小代价实现源代码安全的可视化管理,大幅提升的软件安全质量。源代码检测系统100采用源代码静态分析技术,自动将获取到的待检测软件源代码在相应的编译环境中进行编译,再通过数据流分析技术、符号执行技术、内存精确建模技术等进行分析并根据定制规则检查源代码程序的语法、结构、过程、接口等来确定源代码的安全性。

源代码检测系统100分析及检测的策略源自于多年的源代码安全积累,并兼容国际权威源代码安全标准和规范,包括常见缺陷列表(CWE,Common Weakness Enumeration)、开放式Web应用程序安全项目(OWASP,Open Web Application Security Project)、一般弱点列举(CWE,Common Weakness Enumeration)、计算机安全应急响应组(CERT,Computer Emergency Response Team)的安全编程标准及汽车产业软件可靠性协会(MISRA,Motor Industry Software Reliability Association)的C/C++安全编码规范等。源代码检测系统100支持代码注入、跨站脚本、输入验证、API误用、密码管理、资源管理错误、配置错误、不良实现、异常处理、代码风格、代码质量及危险函数等13个大类,600多个小类的检测策略,从而确保源代码安全检测结果的精准和权威性。

如图1所示,源代码检测系统100包括:接口单元101、源代码安全管理单元102、缺陷知识库103、集成编译器104以及检测单元105。优选地,接口单元101用于实现源代码检测系统100与外部设备或系统的信息交换。例如,接口单元101可以从代码源用于接收待检测的源代码以及用户的标识。其中,待检测的源代码可以由各种类型程序语言所编写的代码,例如,C、C++、Java、JSP、C#、Python以及PHP等。所属领域技术人员应当了解的是,本发明并不限于对上述程序语言进行检测,而是可以对任何已知的程序语言进行检测。其中,源代码检测系统100可以根据用户的标识来获取预先设定的定制规则。定制规则可以涉及各种检测类型,并且检测类型用于区分待检测的源代码要进行的检测项目,例如,缺陷检测、合规检测和/或开源组件检测。优选地,检测项目可以是缺陷检测、合规检测和/或开源组件检测中的任意一项、两项或全部。检测类型可以使用代码或任何方式来表示这7种检测项目,例如,使用代码1表示检测项目为缺陷检测、代码2表示检测项目为合规检测、代码3表示检测项目为开源组件检测、代码4表示检测项目为缺陷检测和合规检测、代码5表示检测项目为缺陷检测和开源组件检测、代码6表示检测项目为合规检测和开源组件检测以及代码7表示检测项目为缺陷检测、合规检测和开源组件检测。优选地,预先设定的定制规则可以仅涉及特定检测规则的全部或一部分。例如,预先设定的定制规则包括缺陷检测中涉及内存溢出的检测规则、合规检测中的计算机安全应急响应组CERT安全编码规范以及开源组件检测中的计算机应用组件。

此外,当源代码检测系统100对检测结果进行分析并且确定需要进行额外检测时,接口单元101将检测结果发送给缺陷管理系统。以及,当用户希望对待检测的源代码复检时,接口单元101将检测结果发送给第三方检测系统。通常,缺陷管理系统可以将源代码检测系统100的检测结果与自身的检测结果进行整合。其中,检测结果中可以包括BUG信息。此外,源代码检测系统100接收缺陷管理系统反馈的BUG信息以提供定制化开发服务。第三方检测系统通常将检测结果作为参考或比对对象,并且根据自身的检测逻辑对待检测源代码进行独立检测。接口单元101实现第三方检测工具对接,实现驱动第三方检测系统完成检测任务并接收检测结果的功能。此外,源代码检测系统100还可以通过接口单元101从第三方检测系统获取其针对待检测的源代码进行检测的检测结果。

优选地,源代码安全管理单元102是源代码检测系统100的枢纽单元。源代码安全管理单元102提供人机交互界面、负责接收用户的指令、从外部获取并存储待检测的软件源代码、对集成编译器、缺陷知识库及检测单元等模块下发工作指令并接收反馈结果。用户可以通过源代码安全管理单元102的交互界面完成用户管理、角色管理、检测项目管理、源码管理、普通任务管理、计划任务管理、统计分析等操作。

优选地,源代码安全管理单元102对所述待检测的源代码进行识别,以确定所述待检测的源代码的编程语言和编译器版本。通常,在对待检测的源代码进行编译之前,需要获得与源代码相关的信息。源代码的编程语言和编译器版本是对源代码进行编译所必需的信息。例如,在对待检测的源代码进行识别后,确定源代码为C、C++、Java、JSP、C#、Python或者PHP。在确定了编程语言和编译器版本后才能对源代码进行正确地编译。此外,源代码安全管理单元102还可以识别所述待检测的源代码的其他信息,例如代码行数等信息。

优选地,源代码安全管理单元102根据用户的标识获取预先设定的定制规则。通常,预先设定的定制规则可以涉及各种检测类型,例如,缺陷检测、合规检测和/或开源组件检测。并且,预先设定的定制规则可以仅涉及特定检测规则的全部或一部分。例如,预先设定的定制规则包括缺陷检测中涉及内存溢出的检测规则、合规检测中的计算机安全应急响应组CERT安全编码规范以及开源组件检测中的计算机应用组件。

优选地,源代码安全管理单元102可以基于用户所属行业的代码安全规范确定所述预先设定的定制规则。通常,用户的标识可以确定用户的身份,并且根据用户的身份可以确定用户所属的行业。此处,用户可以是个人用户、公司用户等。由于大部分行业均制定了各自的代码安全规范,因此根据用户所属行业可以确定上述定制规则。此外,用户还可以对这种基于所属行业的定制规则进行进一步修改。例如,增加、删除或修改定制规则中的相关规则。优选地,源代码安全管理单元102基于用户预先输入的检测要求确定所述预先设定的定制规则。通常,用户可以确定其想要进行检测的项目,因此根据用户预先输入的检测要求确定预先设定的定制规则能够更加准确地反映用户需求。

优选地,源代码安全管理单元102向缺陷知识库发送包括所述预先设定的定制规则的检测请求,以向缺陷库指示在进行源代码检测时需要特定规则库中的哪些规则。

此外,源代码安全管理单元102还用与对检测单元所确定的检测结果进行分析以确定是否需要进行额外检测。如果不需要进行额外检测,则根据检测结果生成检测报告;如果需要进行额外检测,则通过接口单元将检测结果、待检测的源代码以及检测类型发送给缺陷管理系统,以进行额外检测。缺陷管理系统可以根据检测结果、待检测的源代码以及检测类型对待检测的源代码进行检测,并且可能根据检测结果来提供针对性的策略。

例如,当检测单元所确定的检索结果中的缺陷数量远低于平均值时,可能会触发额外检测。通畅地,普通软件工程师的缺陷密度一般为50~250个缺陷/KLOC(缺陷/千行源代码)。由于有严格的软件开发质量管理机制和多重测试环节,成熟的软件公司的缺陷率要低得多,普通软件开发公司的缺陷密度为4~40个缺陷/KLOC、并且高水平的软件公司的缺陷密度为2~4个缺陷/KLOC。目前,国产软件平均的缺陷密度为6个缺陷/KLOC。针对不同的用户,当缺陷/千行源代码明显低于行业平均值时,源代码安全管理单元102会触发额外检测。例如,如果检测结果中表明,普通软件开发公司的源代码的缺陷/千行源代码小于0.1,那么可能触发额外检测。

优选地,缺陷知识库103是存储源代码检测策略的数据库。缺陷知识库103存储多个规则库,包括缺陷检测规则库、合规检测规则库以及开源组件检测规则库等。缺陷知识库103可以提供的检测缺陷种类包括缓冲区溢出、SQL注入、跨站脚本、代码质量、危险函数等13个大类,600多个小类,并且可检测的开源组件规则库达60万条。

优选地,缺陷检测规则库源自多年的源代码安全积累,并兼容国际权威源代码安全标准和规范,例如以下3个国际标准或规范:常见缺陷列表CWE,是MITRE公司继CVE之后的又一个安全漏洞词典。CWE为程序员和安全从业者提供了一个有条理的软件缺陷类型库。CWE旨在让人们更好地理解软件缺陷并创建能够识别、修复以及阻止此类缺陷的自动化工具;OWASP TOP 10:开放式web应用程序安全项目十大安全隐患列表,是OWASP最重要的项目之一。OWASP TOP 10不但总结了web应用程序最可能、最常见、最危险的十大安全隐患,还包括了如何消除这些隐患的建议;以及CWE/SANS 25种最危险的编程错误,是SANS学院、MITRE公司及美国和欧洲很多顶级软件安全专家共同合作的成果。CWE/SANS TOP 25可以帮助程序员编写更安全的代码,帮助用户衡量软件是否安全。

优选地,合规检测规则库支持主流国际标准和规范的代码合规检测规则,包括:计算机安全应急响应组CERT安全编程标准、汽车产业软件可靠性协会MISRA的C/C++安全编码规范等。其中CERT创建的源代码分析实验室为软件系统提供了适用于CERT安全编码标准的一致性测试。这种测试包括用于Java的CERT Oracle安全编码标准、用于C的CERT C语言安全编码标准、用于C++的CERT C++语言安全编码标准,用于Perl的CERT Perl安全编码标准。汽车产业软件可靠性协会MISRA的C/C++安全编码规范是MISRA针对C、C++语言提出的开发标准,旨在增进嵌入式系统的安全性及可移植性。

优选地,开源组件检测规则库包括通过搜索引擎和/或大数据网络所收集的开源组件信息。由于开源组件存在的已知漏洞和授权协议会给软件带来风险,而个别研发人员为了贪图方便,直接引用来自互联网的开源组件进行编码,这些开源组件往往已经存在漏洞,这将降低开发软件的整体安全性。因此,本发明在现有搜索引擎爬虫的基础上,建立了开源组件检测规则库,以使得溯源检测器(下面将会详细介绍)通过加载该规则库,检测源代码中是否引用了开源组件。进一步地,确定所使用的开源组件是否存在软件使用授权的问题,从而帮助用户规避开源组件的法律风险。同时,本发明还可检测软件中引用的开源组件存在哪些安全漏洞,从而最大程度降低开源代码引入的安全风险并且解决传统源代码检测技术无法进行溯源检测的问题。

优选地,缺陷知识库103根据所述预先设定的定制规则从所述多个规则库获取至少一个检测规则,其中每个规则库与一种检测策略相关联。通常,预先设定的定制规则可以涉及各种检测类型,例如,缺陷检测、合规检测和/或开源组件检测。因此,为了获取检测规则,缺陷知识库103根据所述预先设定的定制规则从所述多个规则库获取至少一个检测规则。并且,预先设定的定制规则可以仅涉及特定规则库中的全部内容或一部分内容。例如,预先设定的定制规则包括缺陷检测规则库中涉及内存溢出的检测规则、合规检测规则库中的计算机安全应急响应组CERT安全编码规范检测规则以及开源组件检测规则库中的计算机应用组件检测规则。

优选地,缺陷知识库103会定期或不定期进行更新。其中定期更新可以是例如,每天、每周或每月进行更新。不定期更新通常是在缺陷知识库103中的任意规则库的内容发生改变时进行更新。此外,通常会通过在线或离线的方式来更新缺陷知识库103。

优选地,集成编译器104根据所述待检测的源代码的编程语言和编译器版本对所述待检测的源代码进行编译,以获得编译信息。集成编译器104用于为主要的编程语言提供编译环境,例如为C、C++、JAVA、JSP、C#、Python等编程语言的源代码提供编译环境,从而使相应的源代码能够完成编译以生成编译信息。在编译的过程中,集成编译器104能够产生函数调用关系、控制流信息、变量别名信息、指针信息、数据依赖关系及接口等信息。然后,集成编译器104能够这些信息统一汇总后传递给相应的编程语言检测引擎进行安全检测。优选地,集成编译器104包括C/C++编译器、Java/JSP编译器、C#编译器、Python编译器以及PHP编译器等。

优选地,集成编译器104使用C/C++编译器对C/C++源代码进行编译以获得的编译信息;使用Java/JSP编译器对Java/JSP源代码进行编译以获得的编译信息;使用C#编译器对C#源代码进行编译以获得的编译信息;使用Python编译器对Python源代码进行编译以获得的编译信息;以及使用PHP编译器对PHP编译器源代码进行编译以获得的编译信息。

优选地,检测单元105根据所述至少一个检测规则对编译信息进行静态分析检测以确定检测结果。检测单元105包括:C/C++检测器、Java/JSP检测器、C#检测器、Python检测器、PHP检测器以及溯源检测器等。各个检测器接收来自集成编译器的相应编程语言的编译信息,结合缺陷知识库提供的至少一个检测规则(其中至少一个检测规则对应于预先设定的定制规则)对源代码进行静态分析检测。其中,对源代码进行静态分析检测包括:根据所述至少一个检测规则并且基于静态分析对编译信息进行符号模拟执行检测以确定检测结果,所述模拟符号执行检测能够避免对所述待检测的源代码中无法执行的路径进行检测,从而降低检测误报率。模拟符号执行检测能够避免对源代码中无法执行的路径进行检测,从而降低检测误报率包括:所述模拟符号执行检测将待检测的源代码中的输入值用作符号值,针对每条执行路径进行符号模拟执行,在执行路径的分支处记录变量的约束信息并且对约束信求解,在判断所述分支处的分支路径无法执行时,不对所述分支路径进行检测,从而降低检测误报率。

其中,对源代码进行静态分析检测包括:根据所述至少一个检测规则并且基于静态分析对编译信息进行数据流分析检测以确定检测结果。其中所述数据流分析检测使用流不敏感分析、流敏感分析和路径敏感分析对编译信息进行数据流分析。其中所述流不敏感分析用于确定编译信息中函数的整体数据流信息。其中所述流敏感分析用于确定函数的控制流程中每个节点所对应的数据流信息,并且所述路径敏感分析为函数的控制流程中沿不同路径到达同一节点的不同状态信息。

检测单元105将检测结果反馈到源代码安全管理单元102。优选地,检测结果可以包括BUG信息、缺陷类型、缺陷起始位置、缺陷结束位置等信息。

具体地,检测单元105从集成编译器104接收C/C++源代码的编译信息并且将其传输到C/C++检测器,C/C++检测器根据加载的C/C++检测策略进行静态分析,得出分析结果。检测单元105从集成编译器104接收Java/JSP/html/xml源代码的编译信息并且将其传输到Java/JSP检测器,Java/JSP检测器根据加载的Java/JSP/html/xml检测策略进行静态分析,得出分析结果。检测单元105从集成编译器104接收C#/ASPX源代码的编译信息并且将其传输到C#/ASPX检测器,C#/ASPX检测器根据加载的C#检测策略进行静态分析,得出分析结果。检测单元105从集成编译器104接收Python源代码的编译信息并且将其传输到Python检测器,Python检测器根据加载的Python检测策略进行静态分析,得出分析结果。以及,检测单元105从集成编译器104接收PHP源代码的编译信息并且将其传输到PHP检测器,PHP检测器根据加载的PHP检测策略进行静态分析,得出分析结果。

图2为根据本发明优选实施方式的接口单元200的结构示意图。接口单元200用于实现源代码检测系统与外部设备或系统的信息交换。例如,接口单元200负责与外部的代码源、外部代码版本管理系统、缺陷管理系统以及第三方系统等进行对接,从而从SVN、GIT等代码库读取待检测的源代码并传送到源代码安全管理单元等待检测。并且,接口单元200能够将源代码安全管理单元发送的源代码的BUG信息传输到Bugzilla等缺陷管理系统,同时接收缺陷管理系统反馈的BUG信息并转发回源代码安全管理单元。为了提供定制化开发服务,接口单元200与第三方检测工具对接,实现驱动第三方检测引擎完成检测任务并接收检测结果的功能。即,接口单元200通过与代码库SVN、GIT及Bugzilla等系统对外开放的通用接口对接,实现源代码的读取及BUG信息的交互。通过定制化开发与第三方检测引擎接口对接,实现检测任务的下发和检测结果的接收。

如图2所示,接口单元200包括:代码源接口201、缺陷管理系统接口202以及第三方检测系统接口203。其中,代码源接口201用于与代码源204进行通信,并且代码源可以是各种类型的设备,例如外部代码库SVN、GIT、用户终端、个人计算机等。代码源接口201可以从代码源204接收待检测的源代码以及用户的标识。其中,待检测的源代码可以由各种类型程序语言所编写的代码,例如,C、C++、Java、JSP、C#、Python以及PHP等。其中,用户的标识用于获取预先设定的定制规则并且定制规则用于确定待检测的源代码要进行的检测项目,例如,缺陷检测、合规检测和/或开源组件检测。优选地,检测项目可以是缺陷检测、合规检测和/或开源组件检测中的任意一项、两项或全部。根据本发明的实施方式,检测项目可以包括缺陷检测、合规检测和/或开源组件检测的内容中的任意一部分或全部。

缺陷管理系统接口202用于与缺陷管理系统205进行通信。缺陷管理系统205例如是Bugzilla等。当源代码检测系统对检测结果进行分析并且确定需要进行额外检测时,缺陷管理系统接口202将检测结果发送给缺陷管理系统205。通常,缺陷管理系统205可以将源代码检测系统的检测结果与自身的检测结果进行整合。其中,检测结果中可以包括BUG信息。此外,源代码检测系统接收缺陷管理系统205反馈的BUG信息以提供定制化开发服务和更好地进行软件源代码缺陷管理。

第三方检测系统接口203用于与第三方检测系统205进行通信。第三方检测系统接口203为非标配接口,按用户需求提供个性化开发。第三方检测系统接口203负责给第三方检测系统206下达检测命令,并接收第三方检测工具的检测结果。针对已经购买了Fortify SCA、Checkmarx及Coverity Scan等工具的用户,本发明通过提供第三方检测系统接口203,可驱动以上3个工具对源代码进行复检,并统一反馈检测结果,既互补优化源代码检测结果,也保护了用户的原有投入。第三方检测系统206通常将检测结果作为参考或比对对象,并且根据自身的检测逻辑对待检测源代码进行独立检测。此外,源代码检测系统还可以通过第三方检测系统接口203从第三方检测系统206获取其针对待检测的源代码进行检测的检测结果。

接口单元200是安全开发生命周期管理功能实现的基础。通过接口单元200,报名费可将源代码安全检测工作融入到已有开发和测试流程中,最大程度帮助用户自动化完成源代码安全检测工作,从而降低源代码检测成本开销。

图3为根据本发明优选实施方式的集成编译器300的结构示意图。集成编译器300根据所述待检测的源代码的编程语言和编译器版本对所述待检测的源代码进行编译,以获得编译信息。集成编译器300用于为主要的编程语言提供编译环境,例如为C、C++、JAVA、JSP、C#、Python等编程语言的源代码提供编译环境,从而使相应的源代码能够完成编译以生成编译信息。在编译的过程中,集成编译器104能够产生函数调用关系、控制流信息、变量别名信息、指针信息、数据依赖关系及接口等信息。然后,集成编译器300能够这些信息统一汇总后传递给相应的编程语言检测引擎进行安全检测。

如图3所示,集成编译器300包括:C/C++编译器301、Java/JSP编译器302、C#编译器303、Python编译器304以及PHP编译器305。优选地,C/C++编译器301对C/C++源代码进行编译以获得的编译信息。Java/JSP编译器302对Java/JSP源代码进行编译以获得的编译信息。C#编译器303对C#源代码进行编译以获得的编译信息。Python编译器304对Python源代码进行编译以获得的编译信息。PHP编译器305对PHP编译器源代码进行编译以获得的编译信息。

集成编译器300内的5个编译器根据所述待检测的源代码的编程语言和编译器版本完成对相应编程语言的源代码的编译动作后,将产生的编译信息传递给相应编程语言检测器进行检测。源代码静态检测技术一般有直接语法分析和编译源代码后进行分析两种方式,优选地,本发明以第二种方式作为实例进行说明,但是本发明的思路也适用于第一种方式。优选地,本发明编译源代码后进行分析可探测程序执行路径,避免虚假路径带来的误报,同时编译后产生的函数调用关系、控制流信息、变量别名信息、指针信息、数据依赖关系及接口等信息,让采用这种方式的源代码分析工具提供更好的检测效果。但是,操作人员手动创建编译环境不是一件简单的事情,本发明的集成编译器300可自动为待检测的源代码创建编译环境,并且对使用者完全透明,在保证检测精度的同时极大的提高了源代码检测工作的效率。

图4为根据本发明优选实施方式的检测单元400的结构示意图。检测单元400根据所述至少一个检测规则对编译信息进行静态分析以确定检测结果。其中,对源代码进行静态分析检测包括:根据所述至少一个检测规则并且基于静态分析对编译信息进行符号模拟执行检测以确定检测结果,所述模拟符号执行检测能够避免对所述待检测的源代码中无法执行的路径进行检测,从而降低检测误报率。模拟符号执行检测能够避免对源代码中无法执行的路径进行检测,从而降低检测误报率包括:所述模拟符号执行检测将待检测的源代码中的输入值用作符号值,针对每条执行路径进行符号模拟执行,在执行路径的分支处记录变量的约束信息并且对约束信求解,在判断所述分支处的分支路径无法执行时,不对所述分支路径进行检测,从而降低检测误报率。

其中,对源代码进行静态分析检测包括:根据所述至少一个检测规则并且基于静态分析对编译信息进行数据流分析检测以确定检测结果。其中所述数据流分析检测使用流不敏感分析、流敏感分析和路径敏感分析对编译信息进行数据流分析。其中所述流不敏感分析用于确定编译信息中函数的整体数据流信息。其中所述流敏感分析用于确定函数的控制流程中每个节点所对应的数据流信息,并且所述路径敏感分析为函数的控制流程中沿不同路径到达同一节点的不同状态信息。

检测单元400包括:C/C++检测器401、Java/JSP检测器402、C#检测器403、Python检测器404、PHP检测器405以及溯源检测器406。各个检测器接收来自集成编译器的相应编程语言的编译信息,结合缺陷知识库提供的至少一个检测规则(其中至少一个检测规则对应于预先设定的定制规则)对源代码进行检测。检测单元400将检测结果反馈到源代码安全管理单元。优选地,检测结果可以包括BUG信息、缺陷类型、缺陷起始位置、缺陷结束位置等信息。

具体地,检测单元400从集成编译器接收C/C++源代码的编译信息并且将其传输到C/C++检测器401,C/C++检测器401根据加载的C/C++检测策略进行静态分析检测,得出分析结果。检测单元500从集成编译器接收Java/JSP/html/xml源代码的编译信息并且将其传输到Java/JSP检测器402,Java/JSP检测器402根据加载的Java/JSP/html/xml检测策略进行静态分析检测,得出分析结果。检测单元400从集成编译器接收C#/ASPX源代码的编译信息并且将其传输到C#/ASPX检测器403,C#/ASPX检测器403根据加载的C#检测策略进行静态分析检测,得出分析结果。检测单元400从集成编译器接收Python源代码的编译信息并且将其传输到Python检测器404,Python检测器404根据加载的Python检测策略进行静态分析检测,得出分析结果。以及,检测单元400从集成编译器接收PHP源代码的编译信息并且将其传输到PHP检测器405,PHP检测器405根据加载的PHP检测策略进行静态分析检测,得出分析结果。

优选地,检测单元400采用数据流分析、符号执行、内存精确建模技术等源代码静态分析技术,在保证源代码安全检测效率的前提下极大地提高了检测精度。其中,数据流分析是一种在不运行程序的条件下,从程序中获取数据流信息的技术。数据流信息最终被传递给检测单元进行进一步缺陷分析。在数据流信息获取方面,分析的精度问题至关重要。本发明的检测单元主要从流不敏感、流敏感和路径敏感三个方面来增加分析的精度。例如:流不敏感分析给出的是一个函数整体的数据流信息;流敏感的分析给出函数控制流图上每一个点对应的信息;以及路径敏感分析对函数控制流图上每个点可能给出多个信息,沿着不同的路径到达同一个程序点可能会产生不同的状态信息,路径敏感分析保留这些不同的信息。

优选地,符号执行的目的是降低检测的误报率。在本发明的检测单元中引入模拟符号执行,忽略程序中不可达的代码路径中存在的缺陷。符号模拟执行是假设程序的所有输入值都是符号值,根据程序中的每条路径对程序进行符号模拟执行。在程序分支处,记录程序对变量的约束信息,同时求解约束条件,判断该条路径是否可执行,从而可以剪除不可执行路径。采用这种方式的优点是最大可能的检测了程序的所有路径;并且避免了虚假路径带来的误报问题。

传统静态分析技术不能对内存进行更精确分析,因此本发明的检测单元采用内存精确建模技术,可以精确的模拟指针运算,多级指针解引用以及区分内存中数组的每个不同的元素和结构体的不同的域。通过对内存建模,可以对指针表达式的值进行精确分析,并区分指向同一个对象内部的指针各自不同的偏移量,使得针对指针的检测更加精确。指针在源代码中非常普遍,使用指针能够有速度快、节约内存等优点,但指针的使用不当也会造成安全隐患,如空指针解引用就可能会造成系统崩溃。因此,对指针的精确模拟,可以有效地检测源代码中的指针相关安全问题。

优选地,溯源检测器406根据开源组件检测规则库对待检测的源代码中使用的开源组件进行检测。本发明在现有搜索引擎爬虫的基础上,建立了开源组件检测规则库,以使得溯源检测器406通过加载该规则库,检测源代码中是否引用了开源组件。进一步地,确定所使用的开源组件是否存在软件使用授权的问题,从而帮助用户规避开源组件的法律风险。同时,本发明还可检测软件中引用的开源组件存在哪些安全漏洞,从而最大程度降低开源代码引入的安全风险并且解决传统源代码检测技术无法进行溯源检测的问题。

溯源检测器406遍历待检测的源代码的组件信息,与缺陷知识库的开源组件检测规则库进行比对,如匹配到具体的开源组件,便将该组件的信息及存在的安全漏洞信息反馈到源代码安全管理单元。溯源检测器406结合了互联网基础,通过搜索引擎和大数据技术,可确保获取到的开源组件信息是最多且最全的。通过海量的开源组件规则库可帮助企业及时发现软件中存在哪些开源组件,存在哪些安全风险。

图5为根据本发明优选实施方式的缺陷知识库500的结构示意图。如图5所示,缺陷知识库500包括:缺陷检测规则库501、合规检测规则库502、开源组件检测规则库503以及定制规则库504。缺陷知识库103可以提供的检测缺陷种类包括缓冲区溢出、SQL注入、跨站脚本、代码质量、危险函数等13个大类,600多个小类,并且可检测的开源组件规则库达60万条。

优选地,缺陷检测规则库501源自多年的源代码安全积累,并兼容国际权威源代码安全标准和规范,例如以下3个国际标准或规范:常见缺陷列表CWE,是MITRE公司继CVE之后的又一个安全漏洞词典。CWE为程序员和安全从业者提供了一个有条理的软件缺陷类型库。CWE旨在让人们更好地理解软件缺陷并创建能够识别、修复以及阻止此类缺陷的自动化工具;OWASP TOP 10:开放式web应用程序安全项目十大安全隐患列表,是OWASP最重要的项目之一。OWASP TOP 10不但总结了web应用程序最可能、最常见、最危险的十大安全隐患,还包括了如何消除这些隐患的建议;以及CWE/SANS 25种最危险的编程错误,是SANS学院、MITRE公司及美国和欧洲很多顶级软件安全专家共同合作的成果。CWE/SANS TOP 25可以帮助程序员编写更安全的代码,帮助用户衡量软件是否安全。

优选地,合规检测规则库502支持主流国际标准和规范的代码合规检测规则,包括:计算机安全应急响应组CERT安全编程标准、汽车产业软件可靠性协会MISRA的C/C++安全编码规范等。其中CERT创建的源代码分析实验室为软件系统提供了适用于CERT安全编码标准的一致性测试。这种测试包括用于Java的CERT Oracle安全编码标准、用于C的CERT C语言安全编码标准、用于C++的CERT C++语言安全编码标准,用于Perl的CERT Perl安全编码标准。汽车产业软件可靠性协会MISRA的C/C++安全编码规范是MISRA针对C、C++语言提出的开发标准,旨在增进嵌入式系统的安全性及可移植性。

优选地,开源组件检测规则库503包括通过搜索引擎和/或大数据网络所收集的开源组件信息。由于开源组件存在的已知漏洞和授权协议会给软件带来风险,而个别研发人员为了贪图方便,直接引用来自互联网的开源组件进行编码,这些开源组件往往已经存在漏洞,这将降低开发软件的整体安全性。因此,本发明在现有搜索引擎爬虫的基础上,建立了开源组件检测规则库,以使得溯源检测器(下面将会详细介绍)通过加载该规则库,检测源代码中是否引用了开源组件。进一步地,确定所使用的开源组件是否存在软件使用授权的问题,从而帮助用户规避开源组件的法律风险。同时,本发明还可检测软件中引用的开源组件存在哪些安全漏洞,从而最大程度降低开源代码引入的安全风险并且解决传统源代码检测技术无法进行溯源检测的问题。

优选地,为了获取检测规则,定制规则库504根据预先设定的定制规则从缺陷检测规则库501、合规检测规则库502以及开源组件检测规则库503获取至少一个检测规则。优选地,定制规则库504可以存储与一个或多个用户相对应的检测规则。其中每个用户的定制规则可以包括至少一个检测规则。并且至少一个检测规则是基于用户所属行业的代码安全规范或基于用户预先输入的检测要求来确定的。预先设定的定制规则可以涉及各种检测类型,例如,缺陷检测、合规检测和/或开源组件检测。预先设定的定制规则可以涉及特定规则库中的全部内容或一部分内容。例如,预先设定的定制规则包括缺陷检测规则库中涉及内存溢出的检测规则、合规检测规则库中的计算机安全应急响应组CERT安全编码规范检测规则以及开源组件检测规则库中的计算机应用组件检测规则。

优选地,缺陷知识库500会定期或不定期进行更新。其中定期更新可以是例如,每天、每周或每月进行更新。不定期更新通常是在缺陷知识库500中的任意规则库的内容发生改变时进行更新。此外,通常会通过在线或离线的方式来更新缺陷知识库500。

图6为根据本发明优选实施方式的基于静态分析的源代码检测方法600的流程图。源代码检测方法600针对源代码安全需求,在对源代码进行高精度的定制安全缺陷分析及溯源检测的基础上,还可与源代码版本管理系统(例如,版本控制系统SVN、分布式版本控制系统GIT)、缺陷管理系统(例如,缺陷跟踪系统Bugzilla,Bug-Tracking System)等进行信息交换,以最小代价实现源代码安全的可视化管理,大幅提升的软件安全质量。源代码检测方法600采用源代码静态分析技术,自动将获取到的待检测软件源代码在相应的编译环境中进行编译,再通过数据流分析技术、符号执行技术、内存精确建模技术等进行分析并根据定制规则检查源代码程序的语法、结构、过程、接口等来确定源代码的安全性。源代码检测方法600支持代码注入、跨站脚本、输入验证、API误用、密码管理、资源管理错误、配置错误、不良实现、异常处理、代码风格、代码质量及危险函数等13个大类,600多个小类的检测策略,从而确保源代码安全检测结果的精准和权威性。

如图6所示,源代码检测方法600从步骤601处开始。在步骤601,接收待检测的源代码以及用户的标识。其中,待检测的源代码可以由各种类型程序语言所编写的代码,例如,C、C++、Java、JSP、C#、Python以及PHP等。其中,定制规则可以涉及各种检测类型并且检测类型用于区分待检测的源代码要进行的检测项目,例如,缺陷检测、合规检测和/或开源组件检测。优选地,检测项目可以是缺陷检测、合规检测和/或开源组件检测中的任意一项、两项或全部。优选地,预先设定的定制规则可以仅涉及特定检测规则的全部或一部分。例如,预先设定的定制规则包括缺陷检测中涉及内存溢出的检测规则、合规检测中的计算机安全应急响应组CERT安全编码规范以及开源组件检测中的计算机应用组件。

在步骤602,对所述待检测的源代码进行识别,以确定所述待检测的源代码的编程语言和编译器版本,并且根据用户的标识获取预先设定的定制规则,向缺陷知识库发送包括所述预先设定的定制规则的检测请求。通常,在对待检测的源代码进行编译之前,需要获得与源代码相关的信息。源代码的编程语言和编译器版本是对源代码进行编译所必需的信息。例如,在对待检测的源代码进行识别后,确定源代码为C、C++、Java、JSP、C#、Python或者PHP。在确定了编程语言和编译器版本后才能对源代码进行正确地编译。此外,源代码检测方法600还可以识别所述待检测的源代码的其他信息,例如代码行数等信息。优选地,根据用户的标识获取预先设定的定制规则,源代码检测方法600向缺陷知识库发送包括所述预先设定的定制规则的检测请求,以向缺陷库指示在进行源代码检测时需要哪些规则库或特定规则库中的哪些规则。

优选地,在步骤603。根据所述预先设定的定制规则从缺陷知识库中的多个规则库获取至少一个检测规则。通常,预先设定的定制规则可以涉及各种检测类型,例如,缺陷检测、合规检测和/或开源组件检测。并且,预先设定的定制规则可以仅涉及特定检测规则的全部或一部分。例如,预先设定的定制规则包括缺陷检测中涉及内存溢出的检测规则、合规检测中的计算机安全应急响应组CERT安全编码规范以及开源组件检测中的计算机应用组件。

优选地,在步骤604,所述待检测的源代码的编程语言和编译器版本对所述待检测的源代码进行编译,以获得编译信息。优选地,使用C/C++编译器对C/C++源代码进行编译以获得的编译信息;使用Java/JSP编译器对Java/JSP源代码进行编译以获得的编译信息;使用C#编译器对C#源代码进行编译以获得的编译信息;使用Python编译器对Python源代码进行编译以获得的编译信息;以及使用PHP编译器对PHP编译器源代码进行编译以获得的编译信息。

优选地,在步骤605,根据所述至少一个检测规则对编译信息进行静态分析检测以确定检测结果。其中,对源代码进行静态分析检测包括:根据所述至少一个检测规则并且基于静态分析对编译信息进行符号模拟执行检测以确定检测结果,所述模拟符号执行检测能够避免对所述待检测的源代码中无法执行的路径进行检测,从而降低检测误报率。模拟符号执行检测能够避免对源代码中无法执行的路径进行检测,从而降低检测误报率包括:所述模拟符号执行检测将待检测的源代码中的输入值用作符号值,针对每条执行路径进行符号模拟执行,在执行路径的分支处记录变量的约束信息并且对约束信求解,在判断所述分支处的分支路径无法执行时,不对所述分支路径进行检测,从而降低检测误报率。

其中,对源代码进行静态分析检测包括:根据所述至少一个检测规则并且基于静态分析对编译信息进行数据流分析检测以确定检测结果。其中所述数据流分析检测使用流不敏感分析、流敏感分析和路径敏感分析对编译信息进行数据流分析。其中所述流不敏感分析用于确定编译信息中函数的整体数据流信息。其中所述流敏感分析用于确定函数的控制流程中每个节点所对应的数据流信息,并且所述路径敏感分析为函数的控制流程中沿不同路径到达同一节点的不同状态信息。

根据所述至少一个检测规则对编译信息进行检测以确定检测结果。优选地,在根据至少一个检测规则的基础上,源代码检测方法600接收C/C++源代码的编译信息并且根据加载的C/C++检测策略进行检测,得出分析结果;接收Java/JSP/html/xml源代码的编译信息并且根据加载的Java/JSP/html/xml检测策略进行检测,得出分析结果;接收C#/ASPX源代码的编译信息并且根据加载的C#检测策略进行检测,得出分析结果;接收Python源代码的编译信息并且根据加载的Python检测策略进行检测,得出分析结果;以及,接收PHP源代码的编译信息并且根据加载的PHP检测策略进行检测,得出分析结果。优选地,缺陷知识库直接将开源组件检测策略加载到溯源检测器,溯源检测器分析源代码中存在哪些开源组件,这些开源组件存在哪些安全漏洞。

优选地,源代码检测方法600将得出的检测结果反馈到源代码安全管理单元,以进行复核、统计分析及生成报告。源代码检测方法600将有需要提交到Bugzilla缺陷管理系统的BUG信息传输到外部系统接口等待上传,同时接收缺陷管理系统的反馈信息。外部系统接口将提交的缺陷信息与Bugzilla等缺陷管理系统进行数据交互,传输BUG信息,接收缺陷管理系统的反馈及更新信息。源代码检测方法600通过定制化开发服务和外部系统接口可与第三方检测引擎对接(如Fortify SCA、Checkmarx等),实现检测任务下发,检测结果回收等功能。源代码检测方法600可定期或不定期通过源代码安全管理单元更新缺陷知识库。更新方式采用离线或在线更新的方式,由源代码安全管理单元对获取到的升级进行解析并下发到缺陷知识库进行存储。

已经通过参考少量实施方式描述了本发明。然而,本领域技术人员所公知的,正如附带的专利权利要求所限定的,除了本发明以上公开的其他的实施例等同地落在本发明的范围内。

通常地,在权利要求中使用的所有术语都根据他们在技术领域的通常含义被解释,除非在其中被另外明确地定义。所有的参考“一个/所述/该[装置、组件等]”都被开放地解释为所述装置、组件等中的至少一个实例,除非另外明确地说明。这里公开的任何方法的步骤都没必要以公开的准确的顺序运行,除非明确地说明。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1