技术白皮书
1. COBOT简介
库博是由北京北大软件工程发展有限公司和北京大学软件工程国家工程研究中心联合研发的一种C/C++/JAVA程序静态分析工具,采用基于专利技术分析引擎开发的具有自主知识产权静态分析框架,综合运用了多种最先进的静态分析技术,第一时间发现代码的问题,自动识别质量缺陷、安全漏洞、架构问题,并可以进行软件度量及规则的定制化分析、质量报表的模板定制。
库博于2015年11月,通过美国CWE符合性认证(证书见5.3节),成为中国首家且唯一一家通过该认证的软件安全检测工具(链接地址http://cwe.mitre.org/compatible/country.html),打破了国外产品在软件检测分析领域的垄断地位,让中国软件安全产品站在了世界舞台上。(CWE全称Common Weakness Enumeration,由美国国土安全局下的US-CERT(美国计算机应急管理中心)资助,是世界最具知名度和权威性的软件安全漏洞模式库。世界知名的安全软件产品(包括了14个国家,51个组织或公司,88款产品,其中美国产品占了一半以上)几乎全部在此组织认证,以表明该工具能够支持CWE所描述的主要的缺陷模式的检测和分析,例如IBM的AppScan, HP的Web Inspect、 Fortify , Synopsys的Coverity, LDRA的Testbed,RogueWave的Klocwork,Parasoft的C++Test等。在库博之前,我国没有任何一款软件安全工具通过该认证)
库博与一般的源代码分析工具不同,一般的源代码分析工具只能分析纯静态的代码问题,如编码规则检测、架构检查等。而库博可以分析运行时缺陷(语义缺陷),库博的代码分析是通过算法全路径,遍历每条可执行路径,发现传统意义上只有通过动态测试才能发现的代码缺陷,如内存泄漏、空指针解引用等问题。还能分析代码中存在的安全漏洞,如数组越界、缓冲区溢出等。
1.1 工具的特点
库博相比于其他国产静态分析工具的主要特点如下:
- 1) 更强大的语法词法分析:能够在编译不通过的情况下进行检测,分析,并提示编译缺少的文件,但仍不影响整体检测。
- 2) 更多的缺陷检测类型:支持更多的运行时缺陷的检测,相比于国外领先工具(如Klocwork)具有相似的误报率(15%左右)及更低的漏报率(相对漏报率约20%以下,能够发现若干Klocwork不能发现的或遗漏的缺陷)。
- 3) 更多的在线用户: 由于库博采用B/S的模式,所以部署一套系统,可支持多用户同时在线检测,只需在用户管理中配置相应的用户。
- 4) 更完善的缺陷确认机制:在缺陷检测完毕后,能够快速定位缺陷发生的行数,并且库博提供变量的定义处、函数的定义处以及函数被调用点的自动定位等功能,并以统计图方式显示各等级缺陷。
- 5) 更加快速检测:百万行代码可在1小时之内检测完毕。
- 6) 更加易用:在检测项配置阶段,能够自动给出每种检测配置项的解释及用例,并能按照用户的要求配置结果输出模板,并支持WPS等国产办公软件。
- 7) 分析的缺陷全面、准确,综合统计准确率达90%以上。
- 8) 强大的适应性,能分析上千万行代码,并支持复杂的编译环境。
- 9) 能够与程序版本库进行同步,实现代码的自动更新检测。
- 10) 支持多核、多CPU平行分析,支持多服务器分布式分析。
- 11) 支持国产化信息环境,如中标麒麟操作系统、金山WPS等。
- 12) 能够为用户“量身定制”各类编码规则及语义缺陷,并且自动生成各类报表和文档。
- 13) 支持嵌入式编译器的配置 并内置Keil,CCS等编译器默认字节长度选项
- 14) 检测结果的误报过滤, 用户发现某个缺陷的误报可以标注,二次检测时该缺陷会被过滤
1.2 支持标准
- 1) 国际标准
MISRA C2004英国汽车工业软件可靠性联会 C语言标准
MISRA C++ 2008英国汽车工业软件可靠性联会 C++语言标准
- 2) 国家标准:
GJB 53692005航天型号C语言安全子集
GJB 8114 C/C++语言编程安全子集
- 3) 行业标准:
921 C-2007载人航天921工程C语言安全子集
CRSC-2014高速铁路某研究院C语言安全子集(COBOT开发定制)
BACC-2008总装某中心C语言安全子集(COBOT开发定制)
ISO/IEC TS 17961:2013《C Secure Coding Rules》(C语言安全编程标准)
1.3 支持的重要的缺陷
空指针解引用 |
释放非堆内存 |
缓冲区溢出 |
内存泄漏、资源泄漏 |
释放未分配内存 |
注入缺陷 |
线程死锁 |
不可达代码 |
未经验证的用户输入 |
使用未初始化变量 |
返回局部变量 |
DNS欺骗 |
使用释放后的内存 |
不良代码风格 |
弱加密 |
内存重复释放 |
非法计算 |
数组越界 |
全部覆盖Klocwork 10.0所能够检测的缺陷。尤其是在一些1-2级严重程度较高的缺陷检测,库博的漏报率更低。
2. 系统架构
库博检测系统分为5个层次,检测服务主要运行在Apache Tomcat服务器中。
系统架构如图1所示。
图 1
- 1) 预处理层:其主要作用与编译器中的前端类似,主要的输入为C/C++/JAVA 程序的源程序,在此步骤中,需要对C/C++工程中的编译配置(例如:makefile,VS中的工程文件)进行分析,获取正确的编译选项以及编译配置数据。然后,COBOT对于程序的词法、语法分析,最后产生抽象语法树的AST对象封装作为基本分析的输入。
- 2) 基本分析层:本层主要以抽象语法树为输入,进行调用关系分析、控制流分析、以及数据流分析,其中数据流分析主要需要进行到达定值(Reaching-Definition)分析,以产生定义-使用链。此外,利用上述分析,产生初步的值依赖图,作为程序的表达。
- 3) 精度提高层:本层主要两个目的,其一是创建精化值依赖图提供分析数据。其二,为后面的自动检测提供分析数据。
本层主要包括三类分析:
- a) 指向分析、别名分析。指向分析在该项目中采用的是流不敏感基于联合的指向分析方法。而别名分析包括两种,第一种是需求驱动的可能别名分析,该分析是流不敏感,上下文敏感的另一种则是我们实现的,需求驱动的必然别名分析,同样是一种流不敏感,路径敏感,上下文敏感的分析技术。
- b) 区间分析、八面体分析。区间分析主要是为精化值依赖图,通过计算变量的范围,从而得到分支可能的布尔值,去掉不可达路径,是值依赖图更为精确。而区间分析无法表达变量之间的关系,所以在数值型缺陷的计算中,例如,数组越界、缓冲区溢出等,容易产生漏报、误报,由此对于此类缺陷,我们采用了八面体分析,分析主要采用Apron开源框架。
- c) 对于函数间分析,主要依靠值依赖图对函数间调用的表达,因为值依赖图是上下文敏感的。
- 4) 自动检测层,是缺陷发现的过程,从缺陷模式库中取得某种缺陷,然后通过对值依赖图遍历,取得相应的信息带入某缺陷模式,进而将缺陷模式转换为布尔可满足式,然后通过数学工具进行约束求解的计算。首先,模式的定义采用XML的形式,除了缺陷模式库中内置的138种缺陷,用户可自定义语义缺陷。在缺陷约束提取的过程中,COBOT根据缺陷模式的描述对图进行前向或者后向遍历,得到相应的边的守卫信息,以带入缺陷模式,进行分析计算,对于布尔可满足性的计算,我们采用SMT-Solver。
- 5) 工具层:主要负责用户接口,库博主要提供IDE插件、库博IDE、命令行调用及采用WSDL的方式提供WebService服务等四种方式进行检测服务。IDE插件库博支持主流的Eclipse、Visual Studio 08、10等主流开发环境。库博ID做为B/S的方式客户端,以浏览器的方式进行用户检测服务,提供更加完善的检测、度量以及统计功能。
3. 主要功能
库博提供一个全闭环的静态代码检测的周期,主要功能包括了被检文件同步(上传),检测项配置,缺陷检测及软件度量,检测结果输出定位以及检测结果确认。
在每个环节库博均具有区别于其他工具的特色之处如图2所示。
图 2
- 1) 在文件同步阶段,支持多种上传方式,如:多文件上传,文件夹上传,压缩包上传,与版本管理服务器自动同步等方式,方便用户以适合本单位的形式进行代码同步。
- 2) 在检测项配置阶段,支持根据缺陷严重程度等级进行勾选并支持缺陷描述及实例代码的查看,方便用户理解要检测的缺陷的内容。
- 3) 在缺陷检测及度量阶段,支持国际国内主流的缺陷分析及度量且检测效果达到国际先进水平。
- 4) 在检测结果输出阶段,支持结果模板的定制及国内外主要办公软件的格式,例如可以微软Excel格式或WPS格式导出检测结果。
- 5) 在结果确认阶段,支持主要的代码辅助查看功能,帮助用户快速定位和确认缺陷,此外还可以对历史缺陷信息进行查询。