一种基于序列化中间表示的源代码分布式检测系统及方法
技术领域
本发明涉及源代码检测领域,并且更具体地,涉及一种基于序列化中间表示的源代码分布式检测系统及方法。
背景技术
随着网络技术和应用的飞速发展,信息系统安全正面临着前所未有的挑战。网络化和互联互通性已经成为当前软件和信息系统的发展方向。信息系统与互联网或其他网络的互连,使信息系统遭受攻击的概率增大,也导致了信息系统面临的安全威胁空前地增加。另一方面,随着构建在信息系统之上的各种业务应用的不断丰富,以及软件和信息系统复杂程度的不断提高,信息系统中隐藏的各种安全隐患也越来越多,并且通常难以被发现和消除。
最近几年,重大安全事件的频频发生揭示了当前信息系统安全形势的严峻性。仅仅依靠传统的安全防护机制来保障信息安全的做法已经逐渐力不从心。软件代码是构建系统信息的基础组件,软件代码中安全漏洞和未声明功能(后门)的存在是安全事件频繁发生的根源。忽视软件代码自身的安全性,而仅仅依靠外围的防护、事后的修补等方法,舍本逐末,必然事倍功半。只有通过管理和技术手段保障软件代码自身的安全性,再辅以各种安全防护手段,才是解决当前安全问题的根本解决之道。
然而,随着软件开发技术以及应用需求的不断发展,软件中的代码量也在不断地增加。有些软件工程或应用的代码量甚至达到了海量。目前的各种源代码检测工具均集成开发工具中,而当需要进行检测的源代码的量过大时,本地开发工具通常需要花费超乎寻常的时间。并且,由于本地计算资源的局限性,对海量源代码进行检测时通常会导致计算机失去响应。这种情况会导致用户体验差且无法获得有效的检测结果。
发明内容
为了解决上述问题,本发明提供一种分布式源代码检测系统,所述系统包括:
协调节点,对待检测的源代码进行识别,以确定所述待检测的源代码的编程语言和编译器版本,使用集成编译器根据所述编程语言和编译器版本对待检测的源代码进行编译以生成中间表示,以代码翻译单元为单位对中间表示进行序列化从而生成关联中间表示文件和至少一个独立中间表示文件,其中在关联中间表示文件中标识关联关系;以及对独立代码检测结果和关联代码检测结果进行汇总分析,以确定分布式源代码检测结果;
至少一个代理检测节点,根据检测类型从多个规则库中选择至少一个规则库,并且使用所述至少一个规则库对所述至少一个独立中间表示文件进行检测,以确定至少一个独立代码检测结果;以及
关联检测节点,根据所述检测关联关系以及至少一个独立代码检测结果对所述关联中间表示文件进行检测,以确定关联代码检测结果。
优选地,其中所述至少一个代理检测节点中的每个均包括:
缺陷知识库,用于存储多个规则库并且根据检测类型从多个规则库中选择至少一个规则库。
优选地,其中所述集成编译器包括以下内容中的至少一个:C/C++编译器、Java/JSP编译器、C#编译器、Python编译器以及PHP编译器。
优选地,所述多个规则库为:缺陷检测规则库、合规检测规则库及开源组件检测规则库。
优选地,所述缺陷检测规则库包括以下内容中的至少一个:常见缺陷列表、安全隐患列表以及编程错误列表。
优选地,所述合规检测规则库包括以下内容中的至少一个:计算机安全应急响应组CERT安全编码规范和汽车产业软件可靠性协会MISRA的C/C++安全编码规范。
优选地,所述开源组件检测规则库包括通过搜索引擎和/或大数据网络所收集的开源组件信息。
优选地,所述至少一个代理检测节点和关联检测节点均包括以下内容中的至少一个:C/C++检测器、Java/JSP检测器、C#检测器、Python检测器、PHP检测器以及溯源检测器。
优选地,所述协调节点对分布式源代码检测结果进行分析以确定是否需要进行额外检测,
如果不需要进行额外检测,则根据分布式源代码检测结果生成检测报告;以及
如果需要进行额外检测,则通过接口单元将分布式源代码检测结果、待检测的源代码以及检测类型发送给缺陷管理系统,以进行额外检测。
优选地,还包括采用离线或在线方式来更新所述缺陷知识库。
根据本发明的另一方面,提供一种分布式源代码检测方法,所述方法包括:
对待检测的源代码进行识别,以确定所述待检测的源代码的编程语言和编译器版本,
使用集成编译器根据所述编程语言和编译器版本对待检测的源代码进行编译以生成中间表示,
以代码翻译单元为单位对中间表示进行序列化从而生成关联中间表示文件和至少一个独立中间表示文件,其中在关联中间表示文件中标识关联关系;
根据检测类型从多个规则库中选择至少一个规则库,并且使用所述至少一个规则库对所述至少一个独立中间表示文件进行检测,以确定至少一个独立代码检测结果;
根据所述检测关联关系以及至少一个独立代码检测结果对所述关联中间表示文件进行检测,以确定关联代码检测结果;以及
对独立代码检测结果和关联代码检测结果进行汇总分析,以确定分布式源代码检测结果。
优选地,还包括使用缺陷知识库来存储多个规则库。
优选地,其中所述集成编译器包括以下内容中的至少一个:C/C++编译器、Java/JSP编译器、C#编译器、Python编译器以及PHP编译器。
优选地,所述多个规则库为:缺陷检测规则库、合规检测规则库及开源组件检测规则库。
优选地,,所述缺陷检测规则库包括以下内容中的至少一个:常见缺陷列表、安全隐患列表以及编程错误列表。
优选地,所述合规检测规则库包括以下内容中的至少一个:计算机安全应急响应组CERT安全编码规范和汽车产业软件可靠性协会MISRA的C/C++安全编码规范。
优选地,所述开源组件检测规则库包括通过搜索引擎和/或大数据网络所收集的开源组件信息。
优选地,还包括对分布式源代码检测结果进行分析以确定是否需要进行额外检测,如果不需要进行额外检测,则根据分布式源代码检测结果生成检测报告。
优选地,还包括对分布式源代码检测结果进行分析以确定是否需要进行额外检测,如果需要进行额外检测,则将分布式源代码检测结果、待检测的源代码以及检测类型发送给缺陷管理系统,以进行额外检测。
优选地,还包括采用离线或在线方式来更新所述缺陷知识库。
附图说明
通过参考下面的附图,可以更为完整地理解本发明的示例性实施方式:
图1为根据本发明优选实施方式的分布式源代码检测系统的结构示意图;
图2为根据本发明优选实施方式的接口单元的结构示意图;
图3为根据本发明优选实施方式的集成编译器的结构示意图;
图4为根据本发明优选实施方式的分布式检测单元的结构示意图;以及
图5为根据本发明优选实施方式的分布式源代码检测方法的流程图。
具体实施方式
现在参考附图介绍本发明的示例性实施方式,然而,本发明可以用许多不同的形式来实施,并且不局限于此处描述的实施例,提供这些实施例是为了详尽地且完全地公开本发明,并且向所属技术领域的技术人员充分传达本发明的范围。对于表示在附图中的示例性实施方式中的术语并不是对本发明的限定。在附图中,相同的单元/元件使用相同的附图标记。
除非另有说明,此处使用的术语(包括科技术语)对所属技术领域的技术人员具有通常的理解含义。另外,可以理解的是,以通常使用的词典限定的术语,应当被理解为与其相关领域的语境具有一致的含义,而不应该被理解为理想化的或过于正式的意义。
图1为根据本发明优选实施方式的分布式源代码检测系统100的结构示意图。分布式源代码检测系统100针对源代码安全需求,在对源代码进行分布式的高精度安全缺陷分析及溯源检测的基础上,还可与源代码版本管理系统(例如,版本控制系统SVN、分布式版本控制系统GIT)、缺陷管理系统(例如,缺陷跟踪系统Bugzilla,Bug-Tracking System)等进行无缝对接,以最小代价实现源代码安全的可视化管理,大幅提升的软件安全质量。分布式源代码检测系统100采用源代码静态分析技术,自动将获取到的待检测软件源代码在相应的编译环境中进行编译,再通过数据流分析技术、符号执行技术、内存精确建模技术等进行分布式分析并检查源代码程序的语法、结构、过程、接口等来确定源代码的安全性。
分布式源代码检测系统100分析及检测的策略源自于多年的源代码安全积累,并兼容国际权威源代码安全标准和规范,包括常见缺陷列表(CWE,Common WeaknessEnumeration)、开放式Web应用程序安全项目(OWASP,Open Web Application SecurityProject)、一般弱点列举(CWE,Common Weakness Enumeration)、计算机安全应急响应组(CERT,Computer Emergency Response Team)的安全编程标准及汽车产业软件可靠性协会(MISRA,Motor Industry Software Reliability Association)的C/C++安全编码规范等。分布式源代码检测系统100支持代码注入、跨站脚本、输入验证、API误用、密码管理、资源管理错误、配置错误、不良实现、异常处理、代码风格、代码质量及危险函数等13个大类,600多个小类的检测策略,从而确保源代码安全检测结果的精准和权威性。
如图1所示,分布式源代码检测系统100包括:协调节点101、关联检测节点106和代理检测节点107-1、107-2、…、107-N。其中协调节点101包括:接口单元102、源代码安全管理单元103、集成编译器104以及汇总分析单元105。其中关联检测节点106包括缺陷知识库、C/C++检测器、Java/JSP检测器、C#检测器、Python检测器、PHP检测器以及溯源检测器。其中,代理检测节点107-1、107-2、…、107-N包括缺陷知识库、C/C++检测器、Java/JSP检测器、C#检测器、Python检测器、PHP检测器以及溯源检测器。其中,关联检测节点106和代理检测节点107-1、107-2、…、107-N可以构成分布式检测单元。
优选地,接口单元102用于实现分布式源代码检测系统100与外部设备或系统的信息交换。例如,接口单元102可以从代码源接收待检测的源代码以及检测类型。其中,待检测的源代码可以由各种类型程序语言所编写的代码,例如,C、C++、Java、JSP、C#、Python以及PHP等。所属领域技术人员应当了解的是,本发明并不限于对上述程序语言进行检测,而是可以对任何已知的程序语言进行检测。其中,检测类型用于区分待检测的源代码要进行的检测项目,例如,缺陷检测、合规检测和/或开源组件检测。优选地,检测项目可以是缺陷检测、合规检测和/或开源组件检测中的任意一项、两项或全部。检测类型可以使用代码或任何方式来表示这7种检测项目,例如,使用代码1表示检测项目为缺陷检测、代码2表示检测项目为合规检测、代码3表示检测项目为开源组件检测、代码4表示检测项目为缺陷检测和合规检测、代码5表示检测项目为缺陷检测和开源组件检测、代码6表示检测项目为合规检测和开源组件检测以及代码7表示检测项目为缺陷检测、合规检测和开源组件检测。此外,当分布式源代码检测系统100对检测结果进行分析并且确定需要进行额外检测时,接口单元102将检测结果发送给缺陷管理系统。以及,当用户希望对待检测的源代码复检时,接口单元102将检测结果发送给第三方检测系统。通常,缺陷管理系统可以将分布式源代码检测系统100的检测结果与自身的检测结果进行整合。其中,检测结果中可以包括BUG信息。此外,分布式源代码检测系统100接收缺陷管理系统反馈的BUG信息以提供定制化开发服务。第三方检测系统通常将检测结果作为参考或比对对象,并且根据自身的检测逻辑对待检测源代码进行独立检测。接口单元102实现第三方检测工具对接,实现驱动第三方检测系统完成检测任务并接收检测结果的功能。此外,分布式源代码检测系统100还可以通过接口单元102从第三方检测系统获取其针对待检测的源代码进行检测的检测结果。
优选地,源代码安全管理单元103是分布式源代码检测系统100的枢纽单元。源代码安全管理单元103提供人机交互界面、负责接收用户的指令、从外部获取并存储待检测的软件源代码、对集成编译器、缺陷知识库及检测单元等模块下发工作指令并接收反馈结果。用户可以通过源代码安全管理单元103的交互界面完成用户管理、角色管理、检测项目管理、源码管理、普通任务管理、计划任务管理、统计分析等操作。
优选地,源代码安全管理单元103对所述待检测的源代码进行识别,以确定所述待检测的源代码的编程语言和编译器版本。通常,在对待检测的源代码进行编译之前,需要获得与源代码相关的信息。源代码的编程语言和编译器版本是对源代码进行编译所必需的信息。例如,在对待检测的源代码进行识别后,确定源代码为C、C++、Java、JSP、C#、Python或者PHP。在确定了编程语言和编译器版本后才能对源代码进行正确地编译。此外,源代码安全管理单元103还可以识别所述待检测的源代码的其他信息,例如代码行数等信息。优选地,源代码安全管理单元103向缺陷知识库发送包括所述检测类型的检测请求,以向缺陷库指示在进行源代码检测时需要哪些规则库。
此外,源代码安全管理单元103还用与对所确定的分布式源代码检测结果进行分析以确定是否需要进行额外检测。如果不需要进行额外检测,则根据分布式源代码检测结果生成检测报告;如果需要进行额外检测,则通过接口单元将分布式源代码检测结果、待检测的源代码以及检测类型发送给缺陷管理系统,以进行额外检测。缺陷管理系统可以根据分布式源代码检测结果、待检测的源代码以及检测类型对待检测的源代码进行检测,并且可能根据检测结果来提供针对性的策略。
例如,当汇总分析单元105所确定的检索结果中的缺陷数量远低于平均值时,可能会触发额外检测。通畅地,普通软件工程师的缺陷密度一般为50~250个缺陷/KLOC(缺陷/千行源代码)。由于有严格的软件开发质量管理机制和多重测试环节,成熟的软件公司的缺陷率要低得多,普通软件开发公司的缺陷密度为4~40个缺陷/KLOC、并且高水平的软件公司的缺陷密度为2~4个缺陷/KLOC。目前,国产软件平均的缺陷密度为6个缺陷/KLOC。针对不同的用户,当缺陷/千行源代码明显低于行业平均值时,源代码安全管理单元103会触发额外检测。例如,如果检测结果中表明,普通软件开发公司的源代码的缺陷/千行源代码小于0.1,那么可能触发额外检测。
优选地,集成编译器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编译器源代码进行编译以获得的编译信息。
优选地,集成编译器104根据所述编程语言和编译器版本对待检测的源代码进行编译以生成中间表示,以代码翻译单元为单位对中间表示进行序列化从而生成关联中间表示文件和至少一个独立中间表示文件,其中在关联中间表示文件中标识关联关系。例如,由代码部分A和D组成的关联代码部分进行编译和序列化以生成与代码部分A和D相关联的关联中间表示文件。此外,集成编译器104对至少一个独立代码部分进行编译和序列化以生成至少一个独立中间表示文件。例如,对由代码部分B、C和E进行编译和序列化以生成与代码部分B、C和E分别对应的独立中间表示文件B、C和E。此外,集成编译器104在关联代码编译文件中标识检测关联关系。由于各个代码部分A-E之间具有诸如调用之类的关联关系,必须对这种关联关系进行标识以用于后续对独立检测结果进行汇总。通常,本发明将检测关联关系放置于关联中间表示文件中,这是因为对关联中间表示文件进行检测的节点为分布式源代码检测系统100的关联检测节点。
优选地,缺陷知识库(图1中未示出)是存储源代码检测策略的数据库。缺陷知识库存储多个规则库,包括缺陷检测规则库、合规检测规则库以及开源组件检测规则库等。缺陷知识库可以提供的检测缺陷种类包括缓冲区溢出、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++语言提出的开发标准,旨在增进嵌入式系统的安全性及可移植性。
优选地,开源组件检测规则库包括通过搜索引擎和/或大数据网络所收集的开源组件信息。由于开源组件存在的已知漏洞和授权协议会给软件带来风险,而个别研发人员为了贪图方便,直接引用来自互联网的开源组件进行编码,这些开源组件往往已经存在漏洞,这将降低开发软件的整体安全性。因此,本发明在现有搜索引擎爬虫的基础上,建立了开源组件检测规则库,以使得溯源检测器(下面将会详细介绍)通过加载该规则库,检测源代码中是否引用了开源组件。进一步地,确定所使用的开源组件是否存在软件使用授权的问题,从而帮助用户规避开源组件的法律风险。同时,本发明还可检测软件中引用的开源组件存在哪些安全漏洞,从而最大程度降低开源代码引入的安全风险并且解决传统源代码检测技术无法进行溯源检测的问题。
优选地,缺陷知识库根据检测类型将所述多个规则库中的至少一个规则库发送给用于进行检测的部件,其中每个规则库与一种检测策略相关联。如上所述,检测类型可以使用代码或任何方式来表示检测项目。例如,在检测类型的代码为1时,缺陷知识库将缺陷检测规则库发送给用于进行检测的部件;在检测类型的代码为2时,缺陷知识库103将合规检测规则库发送给用于进行检测的部件;在检测类型的代码为3时,缺陷知识库103将开源组件检测规则库发送给用于进行检测的部件;在检测类型的代码为4时,缺陷知识库103将缺陷检测规则库和合规检测规则库发送给用于进行检测的部件;在检测类型的代码为5时,缺陷知识库103将缺陷检测规则库和开源组件检测规则库发送给用于进行检测的部件;在检测类型的代码为6时,缺陷知识库103将合规检测规则库和开源组件检测规则库发送给用于进行检测的部件;在检测类型的代码为7时,缺陷知识库103将缺陷检测规则库、合规检测规则库和开源组件检测规则库发送给用于进行检测的部件。优选地,每个规则库与一种检测策略相关联,即缺陷检测规则库与缺陷检测策略相关联、合规检测规则库与合规检测策略相关联,以及开源组件检测规则库与开源组件检测策略相关联。
优选地,缺陷知识库会定期或不定期进行更新。其中定期更新可以是例如,每天、每周或每月进行更新。不定期更新通常是在缺陷知识库中的任意规则库的内容发生改变时进行更新。此外,通常会通过在线或离线的方式来更新缺陷知识库103。
优选地,分布式检测单元根据至少一个规则库和所述检测关联关系对所述至少一个独立中间表示文件和关联中间表示文件进行检测,以确定分布式源代码检测结果。分布式检测单元包括关联检测节点106和代理检测节点107-1、107-2、...、107-N。通常,关联检测节点106位于分布式源代码检测系统100的主节点上,而代理检测节点107-1、107-2、...、107-N位于分布式源代码检测系统100的各个分节点上。优选地,各个分节点位于与主节点相近或远离的其他计算机设备上。各个分节点通过有线或无线通信链路与主节点连接,以进行数据交换。优选地,分布式源代码检测系统100中除了代理检测节点107-1、107-2、...、107-N之外的其他部件均可位于主节点或协调节点上。优选地,代理检测节点107-1、107-2、...、107-N根据所述至少一个规则库对独立中间表示文件进行检测,以确定独立代码检测结果。关联检测节点106根据所述检测关联关系以及独立代码检测结果对所述关联中间表示文件进行检测,以确定关联代码检测结果。分布式源代码检测系统100随后对独立代码检测结果和关联代码检测结果进行汇总分析,以确定分布式源代码检测结果。分布式源代码检测系统100将分布式源代码检测结果作为对待检测的源代码进行检测的结果。
优选地,关联检测节点和代理检测节点均包括:C/C++检测器、Java/JSP检测器、C#检测器、Python检测器、PHP检测器以及溯源检测器等。各个检测器接收来自集成编译器的相应编程语言的编译信息,结合缺陷知识库提供的至少一个规则库(每个规则库对应一个检测策略)对源代码进行检测。优选地,独立代码检测结果和关联代码检测结果均可以包括BUG信息、缺陷类型、缺陷起始位置、缺陷结束位置等信息。优选地,关联检测节点106可以将从缺陷知识库获取的至少一个规则库传送给代理检测节点107-1、107-2、...、107-N中的任意一个并且进行定期更新。优选地,所述更新方式可以在线或离线更新。
具体地,代理检测节点可从独立代码编译文件中获取编译信息并且关联检测节点可从关联代码编译文件和独立代码检测结果中获取编译信息。关联检测节点和代理检测节点均可根据所获取的C/C++源代码的编译信息并且将其传输到C/C++检测器,C/C++检测器根据加载的C/C++检测策略进行检测,得出分析结果。关联检测节点和代理检测节点均可根据所获取的Java/JSP/html/xml源代码的编译信息并且将其传输到Java/JSP检测器,Java/JSP检测器根据加载的Java/JSP/html/xml检测策略进行检测,得出分析结果。关联检测节点和代理检测节点均可根据所获取的C#/ASPX源代码的编译信息并且将其传输到C#/ASPX检测器,C#/ASPX检测器根据加载的C#检测策略进行检测,得出分析结果。关联检测节点和代理检测节点均可根据所获取的Python源代码的编译信息并且将其传输到Python检测器,Python检测器根据加载的Python检测策略进行检测,得出分析结果。以及,关联检测节点和代理检测节点均可根据所获取的接收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下达检测命令,并接收第三方检测工具的检测结果。针对已经购买了FortifySCA、Checkmarx及Coverity Scan等工具的用户,本发明通过提供第三方检测系统接口203,可驱动以上3个工具对源代码进行复检,并统一反馈检测结果,既互补优化源代码检测结果,也保护了用户的原有投入。第三方检测系统206通常将分布式源代码检测结果作为参考或比对对象,并且根据自身的检测逻辑对待检测源代码进行独立检测。此外,分布式源代码检测系统还可以通过第三方检测系统接口203从第三方检测系统206获取其针对待检测的源代码进行检测的检测结果。
接口单元200是安全开发生命周期管理功能实现的基础。通过接口单元200,报名费可将源代码安全检测工作融入到已有开发和测试流程中,最大程度帮助用户自动化完成源代码安全检测工作,从而降低源代码检测成本开销。
图3为根据本发明优选实施方式的集成编译器300的结构示意图。集成编译器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包括关联检测节点410和代理检测节点420-1、420-2、...、420-N。优选地,代理检测节点420-1、420-2、...、420-N根据所述至少一个规则库对独立中间表示文件进行检测,以确定独立代码检测结果。关联检测节点410根据所述检测关联关系以及独立代码检测结果对所述关联中间表示文件进行检测,以确定分布式源代码检测结果。其中,关联检测节点410和代理检测节点420-1、420-2、...、420-N均包括C/C++检测器401、Java/JSP检测器402、C#检测器403、Python检测器404、PHP检测器405以及溯源检测器406。各个检测器接收来自集成编译器的相应编程语言的编译信息,结合缺陷知识库提供的至少一个规则库(每个规则库对应一个检测策略)对源代码进行检测。分布式检测单元400将分布式源代码检测结果反馈到源代码安全管理单元。优选地,分布式源代码检测结果可以包括BUG信息、缺陷类型、缺陷起始位置、缺陷结束位置等信息。
具体地,代理检测节点420-1、420-2、...、420-N可从独立中间标识文件中获取编译信息并且关联检测节点410可从关联中间表示文件和独立代码检测结果中获取编译信息。关联检测节点和代理检测节点均可根据所获取的C/C++源代码的编译信息并且将其传输到C/C++检测器(例如,C/C++检测器401),C/C++检测器根据加载的C/C++检测策略进行检测,得出分析结果。关联检测节点和代理检测节点均可根据所获取的Java/JSP/html/xml源代码的编译信息并且将其传输到Java/JSP检测器(例如,Java/JSP检测器402),Java/JSP检测器根据加载的Java/JSP/html/xml检测策略进行检测,得出分析结果。关联检测节点和代理检测节点均可根据所获取的C#/ASPX源代码的编译信息并且将其传输到C#/ASPX检测器(例如,C#/ASPX检测器403),C#/ASPX检测器根据加载的C#检测策略进行检测,得出分析结果。关联检测节点和代理检测节点均可根据所获取的Python源代码的编译信息并且将其传输到Python检测器(例如,Python检测器404),Python检测器根据加载的Python检测策略进行检测,得出分析结果。以及,关联检测节点和代理检测节点均可根据所获取的接收PHP源代码的编译信息并且将其传输到PHP检测器(例如,PHP检测器405),PHP检测器根据加载的PHP检测策略进行检测,得出分析结果。
优选地,关联检测节点410和代理检测节点420-1、420-2、...、420-N采用数据流分析、符号执行、内存精确建模技术等源代码静态分析技术,在保证源代码安全检测效率的前提下极大地提高了检测精度。其中,数据流分析是一种在不运行程序的条件下,从程序中获取数据流信息的技术。数据流信息最终被传递给检测单元进行进一步缺陷分析。在数据流信息获取方面,分析的精度问题至关重要。本发明的检测单元主要从流不敏感、流敏感和路径敏感三个方面来增加分析的精度。例如:流不敏感分析给出的是一个函数整体的数据流信息;流敏感的分析给出函数控制流图上每一个点对应的信息;以及路径敏感分析对函数控制流图上每个点可能给出多个信息,沿着不同的路径到达同一个程序点可能会产生不同的状态信息,路径敏感分析保留这些不同的信息。
优选地,符号执行的目的是降低检测的误报率。在本发明的检测单元中引入模拟符号执行,忽略程序中不可达的代码路径中存在的缺陷。符号模拟执行是假设程序的所有输入值都是符号值,根据程序中的每条路径对程序进行符号模拟执行。在程序分支处,记录程序对变量的约束信息,同时求解约束条件,判断该条路径是否可执行,从而可以剪除不可执行路径。采用这种方式的优点是最大可能的检测了程序的所有路径;并且避免了虚假路径带来的误报问题。
传统静态分析技术不能对内存进行更精确分析,因此本发明的检测单元采用内存精确建模技术,可以精确的模拟指针运算,多级指针解引用以及区分内存中数组的每个不同的元素和结构体的不同的域。通过对内存建模,可以对指针表达式的值进行精确分析,并区分指向同一个对象内部的指针各自不同的偏移量,使得针对指针的检测更加精确。指针在源代码中非常普遍,使用指针能够有速度快、节约内存等优点,但指针的使用不当也会造成安全隐患,如空指针解引用就可能会造成系统崩溃。因此,对指针的精确模拟,可以有效地检测源代码中的指针相关安全问题。
优选地,溯源检测器406根据开源组件检测规则库对待检测的源代码中使用的开源组件进行检测。本发明在现有搜索引擎爬虫的基础上,建立了开源组件检测规则库,以使得溯源检测器406通过加载该规则库,检测源代码中是否引用了开源组件。进一步地,确定所使用的开源组件是否存在软件使用授权的问题,从而帮助用户规避开源组件的法律风险。同时,本发明还可检测软件中引用的开源组件存在哪些安全漏洞,从而最大程度降低开源代码引入的安全风险并且解决传统源代码检测技术无法进行溯源检测的问题。
溯源检测器406遍历待检测的源代码的组件信息,与缺陷知识库的开源组件检测规则库进行比对,如匹配到具体的开源组件,便将该组件的信息及存在的安全漏洞信息反馈到源代码安全管理单元。溯源检测器406结合了互联网基础,通过搜索引擎和大数据技术,可确保获取到的开源组件信息是最多且最全的。通过海量的开源组件规则库可帮助企业及时发现软件中存在哪些开源组件,存在哪些安全风险。
优选地,接口单元407可用于将至少一个独立中间表示文件下发给相应的代理检测节点420-1、420-2、...、420-N并且用于从代理检测节点420-1、420-2、...、420-N获取独立代码检测结果。
图5为根据本发明优选实施方式的分布式源代码检测方法500的流程图。分布式源代码检测方法500针对源代码安全需求,在对源代码进行高精度安全缺陷分析及溯源检测的基础上,还可与源代码版本管理系统(例如,版本控制系统SVN、分布式版本控制系统GIT)、缺陷管理系统(例如,缺陷跟踪系统Bugzilla,Bug-Tracking System)等进行信息交换,以最小代价实现源代码安全的可视化管理,大幅提升的软件安全质量。分布式源代码检测方法500采用源代码静态分析技术,自动将获取到的待检测软件源代码在相应的编译环境中进行编译,再通过数据流分析技术、符号执行技术、内存精确建模技术等进行分析并检查源代码程序的语法、结构、过程、接口等来确定源代码的安全性。分布式源代码检测方法500支持代码注入、跨站脚本、输入验证、API误用、密码管理、资源管理错误、配置错误、不良实现、异常处理、代码风格、代码质量及危险函数等13个大类,600多个小类的检测策略,从而确保源代码安全检测结果的精准和权威性。
如图5所示,分布式源代码检测方法500从步骤501处开始。在步骤501,对待检测的源代码进行识别,以确定所述待检测的源代码的编程语言和编译器版本。通常,在对待检测的源代码进行编译之前,需要获得与源代码相关的信息。源代码的编程语言和编译器版本是对源代码进行编译所必需的信息。例如,在对待检测的源代码进行识别后,确定源代码为C、C++、Java、JSP、C#、Python或者PHP。在确定了编程语言和编译器版本后才能对源代码进行正确地编译。此外,分布式源代码检测方法500还可以识别所述待检测的源代码的其他信息,例如代码行数等信息。优选地,分布式源代码检测方法500向缺陷知识库发送包括所述检测类型的检测请求,以向缺陷库指示在进行源代码检测时需要哪些规则库
在步骤502,使用集成编译器根据所述编程语言和编译器版本对待检测的源代码进行编译以生成中间表示。
在步骤503。以代码翻译单元为单位对中间表示进行序列化从而生成关联中间表示文件和至少一个独立中间表示文件,其中在关联中间表示文件中标识关联关系。
优选地,在步骤504,据检测类型从多个规则库中选择至少一个规则库,并且使用所述至少一个规则库对所述至少一个独立中间表示文件进行检测,以确定至少一个独立代码检测结果。优选地,每个规则库与一种检测策略相关联,即缺陷检测规则库与缺陷检测策略相关联、合规检测规则库与合规检测策略相关联,以及开源组件检测规则库与开源组件检测策略相关联。缺陷知识库是存储源代码检测策略的数据库。缺陷知识库存储多个规则库,包括缺陷检测规则库、合规检测规则库以及开源组件检测规则库等。如上所述,检测类型可以使用代码或任何方式来表示检测项目。例如,在检测类型的代码为1时,获取缺陷检测规则库;在检测类型的代码为2时,获取合规检测规则库;在检测类型的代码为3时,获取开源组件检测规则库;在检测类型的代码为4时,获取缺陷检测规则库和合规检测规则库;在检测类型的代码为5时,获取缺陷检测规则库和开源组件检测规则库;在检测类型的代码为6时,获取合规检测规则库和开源组件检测规则库;以及在检测类型的代码为7时,后去缺陷检测规则库、合规检测规则库和开源组件检测规则库。
在步骤505,根据所述检测关联关系以及至少一个独立代码检测结果对所述关联中间表示文件进行检测,以确定关联代码检测结果。根据所述编程语言和编译器版本对关联代码部分和至少一个独立代码部分进行编译以及序列化,以获得关联中间表示文件和至少一个独立中国建表示文件,其中在关联代码编译文件中标识检测关联关系。
在步骤506,对独立代码检测结果和关联代码检测结果进行汇总分析,以确定分布式源代码检测结果。
已经通过参考少量实施方式描述了本发明。然而,本领域技术人员所公知的,正如附带的专利权利要求所限定的,除了本发明以上公开的其他的实施例等同地落在本发明的范围内。
通常地,在权利要求中使用的所有术语都根据他们在技术领域的通常含义被解释,除非在其中被另外明确地定义。所有的参考“一个/所述/该[装置、组件等]”都被开放地解释为所述装置、组件等中的至少一个实例,除非另外明确地说明。这里公开的任何方法的步骤都没必要以公开的准确的顺序运行,除非明确地说明。