笔者从事该软件安全方面工作,在工作和学习中收集了国内外比较主流的静态分析类工具,供大家参考。大多是资料来自于网络整理,如有不足或欠缺,还请在评论中指出。我进行修正。也欢迎同行多多交流。
我使用0标注北大软件CoBOT,因为他是国内第一款基于主流SAST技术的静态分析工具,填补了国内在缺陷检测、安全漏洞软件工具上的空白。值得称赞的工具。
0、北大软件CoBOT
CoBOT(库博)是北京大学软件工程中心联合北大软件企业的研发团队打造的国内首款商业化的具有知识产权的代码安全类检测工具。 CoBOT软件源代码缺陷检测工具已通过美国CWE认证的安全产品,具有独立知识,打破了国外产品在软件缺陷检测和安全漏洞分析领域的垄断地位,成为国内政府、军工、金融、互联网、汽车制造、船舶制造、电信等领域保证代码安全的首选工具。
目前支持C、C++、Java、C#.net、JS、HTML等超过10种语言的检测。能够支持静态代码度量、运行时缺陷检测和安全漏洞检测。支持GJB 5369、GJB 8114、MISRA 2004/2008/2012规范、支持CWE/SANS TOP25和OWASP TOP 10中的大部分安全漏洞模式检测。支持百万行代码跨文件检测能力,检测效率达到100-200万行/小时。
目前还支持开源软件/组件的成分检测和安全漏洞检测。
1、Coverity
https://www.synopsys.com/zh-cn.html
美国Synopsys公司产品,国内注册新思科技公司
支持C、C++、Java、C#、javascript、Ruby、Python语言,支持C# 7、VS2017、Clang 4.0、gcc7等编译器
。能够发现导致系统崩溃的缺陷(内存错误、逻辑错误、指针错误等)安全性问题和并发方面缺陷。
强调了有多种引擎:路径流程引擎(对应控制流图);数据跟踪引擎(整型和布尔型数据分析);统计引擎;过程间调用引擎(文件或工程级函数调用关系图);数据传播引擎(过程间调用和数据追踪引擎的结合),上下文敏感的过程间分析能力。类型流程引擎(类层次关系分析);加速引擎(消除冗余路径)、增量分析引擎(通过缓存数据分析变化后的数据)。提出了软件DNA图谱概念。具有足够的构建系统和源代码信息,编译器生成可执行代码的数据,能够从软件DNA图谱构建一个执行程序。
Coverity提供先进的和可配置的用于检测软件语义缺陷和安全隐患的静态源代码分析解决方案。
主要不足时需要配置编译器。误报率比较低,但是漏报率较多,互联网企业用得较多,但是在联网情况下,可能出现泄漏代码问题。华为购买了Coverity,但是出现了安全问题,曾出现升级时代码被传到国外服务器。
2、Klocwork
美国rogue wave公司产产品。
Klocwork支持的语言种类多,能够分析C、C++和Java代码;
国内用的最为广泛的静态分析工具,由加拿大北电于1996年研发,是中国最早的能够检测语义缺陷的静态分析工具。2015年版本号为V10,也就是大家常说的K10,目前最新版可能是K12
- 能够发现的软件缺陷种类全面,既包括软件质量缺陷,又包括安全漏洞方面的缺陷,还可以分析对软件架构、编程规则的违反情况;
- 软件分析功能全面,既能分析软件的缺陷,又能进行可视化的架构分析、优化;
- 能够分析软件的各种度量;
- 能够提供与多种主流IDE开发环境的集成;
- 能够分析超大型软件(上千万代码行)。
- 在程序生成前尽快找到问题,意味着之后更少的测试和较少影响成本和进度。它会继续持续集成,只有Klocwork支持流行的CI(Continuous Integration)工具,执行分析提交期间的渐进式代码变化,跟上快速的发布周期。Klocwork在提交之前、提交期间和提交之后识别开发者眼中的关键安全性、可靠性和代码标准问题。
总结
- 非侵入式检测
- 准确率达到90%
- 描述非常清晰,详细的问题产生流程跟踪(具体每一步骤所涉及的源代码文件、行数),基本上一看就清楚问题的产生来源)
- 跨文件/模块的分析能力,对于大型软件非常重要
主要不足是Klocwor误报率比较高,升级费用很高,客户被绑架。对License控制较为严格,用户退出一个license后,其他人要使用需要等7天才能使用。
3、Checkmarx
https://www.checkmarx.com/
以色列CheckmarxCxSuite的产品。
主要功能是查找安全漏洞、质量缺陷、逻辑问题和后门代码。是一个独特的源代码分析解决方案,该工具可用于识别、跟踪和修复源代码中技术上和逻辑上的缺陷,比如软件安全漏洞、质量缺陷问题和业务逻辑问题等。
毋须构建或编译软件项目的源代码,Checkmarx CxEnterprise通过虚拟编译器自动对软件源代码分析,并直接建立了代码元素及代码元素之间关系的逻辑图。然后Checkmarx CxEnterprise对这个内部代码图进行查询。
Checkmarx CxEnterprise包含针对所有编程语言已知数百个安全漏洞和质量缺陷问题预先设定好的查询(query)列表。可以查询全面而又广泛的代码安全和质量缺陷,同时使用Checkmarx CxEnterprise CxAudit 审计工具,您可以根据您自己的软件安全、质量保证和业务逻辑需要配置并自定义的查询(Query),以满足公司或者个人特定的代码安全策略及代码安全基线标准要求。
Checkmarx CxEnterprise的扫描结果可以以静态报表形式展示,也可以通过可以对软件安全漏洞和质量缺陷在代码的运行时的数据传递和调用图跟踪的代码缺陷的全过程,同时还可以提供对安全漏洞和质量缺陷进行修复提供指导建议。也可以对结果进行审计,从而消除误报。
4、Fortify
美国HP_fortify,重点是安全漏洞的检测。Forify 支持语言超过20种,是检测工具中支持语言最多的工具。
内使用最为广泛的静态分析工具,虽然支持很多种安全漏洞,但需要用户做很多的二次开发工作。
不足是误报率和漏报率都比较高。目前在国内代理商以光盘价格出货。如果企业只是想少花钱,引入一个安全扫描工具,倒是一个好的选择。
5、Testbed
美国LDRA Testbed/TBrun 软件测试产品功能:编码规则、度量、覆盖率、生成测试用例。
前身为Liverpool大学开发,能够支持C/C++数千种条目的规则检测,包括MISRA C/C++, GJB5369等,是最早进入中国市场的静态分析工具,在军队、军工广泛使用,但其技术仅支持编码规则类检测,无法进行语义缺陷分析,导致一些常用的运行时缺陷无法发现或者较高误漏报,由此市场占有率逐步下降。截止到2015年其版本号为9.5。
创景公司是总代理。目前很多代理商代理该工具销售,军工企业、汽车制造等采购该工具较多。
主要采用DERA(欧洲防务标准)和MISRA(汽车软件标准),GJB5369。判断是否违反编程规则,只能算是语义语法检测工具,无法满足安全检测需要。原来不支持GJB 8114,最新版本也刚刚加入对GJB 8114的支持。支持Ada、C、C++、Cobal、Coral 66、Fortran、Pascal、PL/1等语言。
通过下面的检测功能介绍,可窥见一斑。
数据流分析变量单元级、集成级和系统级。(发现的错误,基本上都是比较浅显的)
- 没有实用的函数参数
- 不匹配的参数
- 变量未赋初值就引用
- 代码中有多余变量
- 给值传递参数赋值
- 无返回值的函数路径
- 函数的实参是全局变量
控制流分析
- 不可达代码
- 不合理的循环结构
- 存在浮点相等比较
- 函数存在多个出口
- 函数存在多个入口
表达式分析:
- 表达式中的括号使用不当
- 数组下标越界
- 存在被零除
- SWITCH语句缺少DEFAULT
- CASE语句缺少BREAK
- 存在混合运算
- 对指针进行逻辑比较
- 在逻辑表达式中使用赋值操作符
接口分析
- 实参和形参个数不匹配
- 实参和形参类型不匹配
- 函数参数定义的结构和调用的结构不一致
Testbed的静态度量分析做得还是比较不错。能够度量函数代码行数(200)、注释比率(20%)、函数参数(7)、goto语句(0)、圈复杂度(10)、基本复杂度(4,维护性)、LCSAJ密度(20,可维护性)、控制节点数(10)、基本节点数(5)、扇入度量(7)、扇出度量(7)等,括号中是阈值。
但是Testbed的静态度量的公式也没有依据什么标准或权威组织的发布,可能只是自身企业研究出的算法。
Testbed还支持单元测试,可以支持测试用例加载执行,计算覆盖率等。但是工程实践中,对于嵌入式软件很难在目标机之外的测试服务器上运行。
6、PinPoint
源伞科技由香港科大团队创立的, 用自动程序分析技术保障软件质量。307个C/C++缺陷检测器,覆盖95条CWE规则。
该工具研发上投入上还是欠缺,虽然采用了主流的检测引擎,但是打磨的不太好,对于100万行代码可能需要超过10小时的检测,这在工程上基本是无法接受的。
7、C++ test
美国Parasoft公司研发的支持C、C++静态分析的工具,该工具除了可以检测编码规则外,还能检测少量的语义缺陷,此外能够进行测试用例生成,进行单元测试。
Parasoft C++test 是一款自动化测试工具,自动测试C/C++类、函数或部件,而不需要编写测试用例、测试驱动程序或桩调用代码。
主要用于嵌入式软件单元级别测试。
8、PC-Lint
PC-Lint 是GIMPEL SOFTWARE公司开发的C/C++软件代码静态分析工具,它的全称是PC-Lint/FlexeLint for C/C++,PC-Lint 能够在Windows、MS-DOS和OS/2平台上使用,以二进制可执行文件的形式发布,而FlexeLint 运行于其它平台,以源代码的形式发布。PC-lint 在全球拥有广泛的客户群,许多大型的软件开发组织都把PC-Lint 检查作为代码走查的第一道工序。PC-Lint不仅能够对程序进行全局分析,识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针以及冗余的代码,还能够有效地帮你提出许多程序在空间利用、运行效率上的改进点。
PC-Lint和FlexeLine是强大的静态分析工具,检查C、C++源代码,寻找错误,小故障,不一致,不可移植的结构,冗余代码等。
PC-Lint 能够检查出很多语法错误和语法上正确的逻辑错误,PC-Lint 为大部分错误消息都分配了一个错误号,编号小于1000的错误号是分配给C 语言的,编号大于1000的错误号则用来说明C++的错误消息。下表列出了PC-Lint 告警消息的详细分类:
9、QAC
英国PRQA公司成立于1986年,总部位于英国Hersham。主要编码规则测试。QAC/QAC++能够对C/C++代码规则进行自动检查,报告所违反的编程标准和准则。侧重于MISRA规则((ISO,MISRA C,JVF,EC++等)。能够发现1300多种C语言问题、800多种C++的问题,可以支持所有编译器的扩展、配置简单灵活,分析速度非常快,分析报告可以是excel、word、pdf、图表等多种形式,在线帮助相关联,可以及时得到问题的解释和示例。。QAC/QAC++提供了编程规则的二次开发接口,允许添加其它的自定义的编程规则。提供几十种C/C++复杂度度量,包括圈复杂度、静态路径统计和Myer's interval等,还可以扩展定制的复杂度度量。
QAC/QAC++能够提供另外两种静态分析的能力:软件结构分析和质量度量.
软件结构分析包括:函数控制结构图、函数调用树、数据引用关系图,文件包含关系。供多种多样的可视化输出,包括函数结构图、函数调用树、外部参考、文件包含关系和统计的度量分析。
可用于Windows和Unix平台,有方便易用的GUI图形界面,可以和流行的开发环境集成。QAC支持的语言有C、C++、Java、Fortran;
QAC可支持的平台有Microsoft Windows、Sun Solaris、HP-UX、Redhat Linux、Slackware Linux。
QAC根据严重程度从低到高分为0~9级,9级为最严重,0级为最轻微。
9级为ERRORS,必须先修复9级的错误,才能做其他级别的代码静态分析。
10、AppScan
IBM 安全类工具。对网站和移动应用进行扫描,识别安全漏洞并给出修复建议。
IBM Security AppS增强网站应用和移动应用的安全,提高应用安全程序管理,加强合规性。通过在使用前扫描你的网站和移动应用,AppScan使你可以识别安全漏洞并产生报告和修复建议。
IBM工具,在国内销售情况不是太好,该工具市场占用率极低,基本上被淘汰出具。
11、SonarQube
SonarQube 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量。 通过插件形式,可以支持众多计算机语言,比如 java, C#, go,C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等。sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,异味等信息。
Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。
1. 编写干净的代码:SonarQube提供一份关于源代码整体健康情况的概述。更重要的是,它将在新代码中发现的问题高亮显示。使用项目中的质量门设置,你将可以轻易的修复漏洞,机械的改善代码。
2. 检测错误:代码分析器配备强大的路径敏感数据流引擎,可以严格检测错误。比如空指针引用、逻辑错误、资源泄漏等等。
3. 多语言:超过20个代码分析器可以使用,SonarQube为每个主流编程语言提供一个代码分析器:C/C++、JavaScript、C#、Java、COBOL、PL/SQL、PHP、ABAP、VB.NET、Python、RPG、Flex、Objective-C、Swift、Web等等。每个分析器提供大量的规则以便定位普遍的和特定语言的质量问题。应用程序经常一次使用几种编程语言,例如[C#,C++和JavaScript]或者[Java,JavaScript和HTML]。SonarQube自动检测这些语言,调用对应的分析器。
4. 开发运营一体化:SonarQube希望成为开发运营生态系统的一部分,因此使用网勾或广泛的数据接口将它集成入CI引擎、提升渠道等。
5. 集中控制质量:为开发者、技术领导、管理者和负责几个或者几千个项目的决策层提供一个代码质量共享的愿景。
虽然sonarqube能够比较好的支持CI等,但是由于主要引入的开源工具进行检测,所以基本上无法在真正项目中运用。只能算是解决企业有无代码扫描的问题。
12、codesonar
商业,免费30天试用,在Jenkins插件中。静态分析工具,实现了几个静态分析工具基准。寻找静态内存,资源管理,并发性和其它缺陷的工具。
CodeSonar,GrammaTech公司的王牌静态分析SAST工具,识别那些可能导致系统崩溃的错误、意外行为和安全漏洞。
CodeSonar被证明可以提供最深层的静态分析,能够寻找比市场上其他的静态分析工具更多的重要缺陷。Code Sonar实现了最好的几个静态分析工具基准,寻找静态内存、资源管理、并发性和其他缺陷。
通过分析源代码和二进制包,CodeSonar使团队可以分析完整的应用程序,使你可以控制你的代码供应链,从而在程序开发生命周期早期移除成本最高的最难找的缺陷
但是通过笔者实际上运用该工具,基本上扫描不出多少缺陷和漏洞。
13、PVS-Studio
是一个C、C++、C#源代码程序的错误检测工具,进行静态代码分析,产生一个报告帮助程序员寻找和修复错误。
14、OpenLogic
扫描源代码和二进制文件,确认开源代码和授权,管理开源政策和审批,报告安全漏洞,以及提供开源技术支持。
15、cppcheck
免费的C++代码检测工具
16、cpplint
cpplint 是 一个python脚本, google使用它作为自己的C++ 代码规范 检查工具.如果你的C++代码遵循的也是 google 的C++代码风格, 那么这个脚本对你来说就非常实用.
19、FindBugs
FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。在FindBugs的GUI中,需要先选择待扫描的.class文件(FindBugs其实就是对编译后的class进行扫描,藉以发现一些隐藏的bug。)。如果你拥有这些.class档对应的源文件,可把这些.java文件再选上,这样便可以从稍后得出的报告中快捷的定位到出问题的代码上面。此外,还可以选上工程所使用的library,这样似乎可以帮助FindBugs做一些高阶的检查,藉以发现一些更深层的bug。选定了以上各项后,便可以开始检测了。
可以发现许多代码中间潜在的bug。比较典型的,如引用了空指针(null pointer dereference), 特定的资源(db connection)未关闭,等等。如果用人工检查的方式,这些bug可能很难才会被发现,或许永远也无法发现,直到运行时发作…当除掉了这些典型的(classic) bug后,可以确信的是,我们的系统稳定度将会上一个新的台阶。
FindBugs的运行环境可能是这四个工具之中最苛刻的了。它工作在j2se1.4.0或以后的版本中,需要至少256MB内存。它的安装非常简单,下载之后简单的解压即可。为了与ant配合使用,它提供了对应的ant task。
20、FindSecBugs
Find-Sec-Bugs 是一款本地 bug 扫描插件 “FindBugs-IDEA” 的 Java 安全漏洞规则扩展库,它支持在多种主流 IDE 环境进行安装:Eclipse, IntelliJ, Android Studio 和 NetBeans。
扫描范围:只扫描 Java 代码,支持主流的 Java 开发框架,比如 Spring-MVC, Struts 等。
扫描漏洞类型:通过扫描源代码,能够发现128种不同的安全漏洞类型。
FindSecBugs检测效率比较慢,误报率和漏报率相对比较高。国内有些安全厂商集成了该工具,市场上销售。
20、PMD
开源检测工具。PMD的运行环境是j2se1.3或以后版本,安装过程同样也是解压即可。对应ant task的使用:
检测效果不是太理想。
21、Polyspace
软件运行时错误检测工具.运行时错误(Run-time Errors)就是软件在动态运行时出现的错误,是所有的软件错误中最具风险的。根据ANSI C的定义,C语言中的典型运行时错误主要是:
运行时错误属于潜在的威胁,广泛的存在各种软件中。根据Berkeley大学与 IBM Watson的研究报道指出所有IBM大型软件的漏洞中,30%-40%是运行时错误引起的。
PolySpace使用语义分析技术,它依靠大量的数学定理提供的规则分析软件的动态行为。语义分析技术没有使用简单的穷举法,却有能力在更普通的模式下表达程序的状态,还能提供规则进行巧妙的处理。简单来说,语义分析技术可以通过静态的方法,能够发现动态的运行时错误。PolySpace根据软件的源代码,对软件进行抽象,这种突破性的方法使得程序员在写代码的同时,就能精确的而且自动的查明软件的运行时错误。
支持Ada语言。
22、Infer
Infer是facebook开源的一款代码静态分析工具,现支持的语言有Java、Objective-C、C和C++; 对Android和Java代码可以发现null pointer exceptions和resource leaks等;对iOS、C和C++代码可以发现memory leak等。infer只支持Mac和Linux系统
23、BlueMorpho(闪蝶)
BlueMorpho是独立运行的B/S程序,安装简单,无需额外配置参数文件。
在Windows下运行Bluemorpho windows安装包,注意有32位和64位两个版本,
安装完成后,在开始-程序-BlueMorpho文件夹里运行Sart bluemorho server启动分析server.
Server启动后,在开始-程序-BlueMorpho文件夹里运行BlueMorpho即可访问闪蝶源码分析平台。
BlueMoropho提供两种方式上传source code, 手工上传和同步从Mainframe下载COBOL源码。
代码上传或下载到BlueMorpho以后,即可点击任意程序进行源码分析。
24、腾讯 TscanCode
TscanCode支持以下类型规则扫描:
- 空指针检查,包含可疑的空指针,判空后解引用比如Crash等共3类subid检查。
- 数据越界,Sprintf_S越界共1类subid检查。
- 内存泄漏,分配和释放不匹配同1类subid检查。
- 逻辑错误,重复的代码分支,bool类型和INT进行比较,表达式永远True或者false等共18类检查。
- 可疑代码检查,if判断中含有可疑的=号,自由变量返回局部变量等共计15类检查。
- 运算错误,判断无符号数小于0,对bool类型进行++自增等,共计11类检查。
25、阿里 P3C是Java编码规范
代码规范检查插件p3c,是根据《阿里巴巴Java开发手册》转化而成的自动化插件。目前主要阿里系的公司内部使用为主。
26、360fireline 火线
360火线(Fireline)是360公司技术委员会牵头,Web平台部Qtest团队开发的一款免费静态代码分析工具。主要针对移动端Android产品进行静态代码分析。其最为突出的优点就是资源泄漏问题的全面检测。同时,火线与360信息安全部门合作,推出了一系列针对移动端安全漏洞的检测规则。360火线提供免费使用,扫描速度快,并支持Android Studio插件,Jenkins插件,Gradle部署等多种集成方式。
火线目前是360公司发布流程中必不可少的环节,在每次代码编译审核时提供静态代码分析检测,为代码审计人员、开发人员分别提供审核和修改代码的依据。目前火线在360发布流程中已累计运行超过500天,扫描文件数2千万+,扫描代码量超过45亿行。火线最近推出的Android Studio插件360 Fireline Plugin下载量已达到4000+。
火线拥有四大类规则,分别为安全类,内存类,日志类,基础类。
• 安全类:根据360信息安全部门最权威的SDL专门定制,每一条SDL都有真实的攻击案例
• 内存类:各种资源关闭类问题检测(本次评测的重点)
• 日志类:检测日志输出敏感信息内容的规则
• 基础类:规范类、代码风格类、复杂度检查规则
(详见官网:http://magic.360.cn)
Github上搜索TestCasesProject,可以找到他们上传的testcase,c语言和Java语言
27、轩宇SpecChecker
轩宇公司产品。是属于航天旗下公司。
SpecChecker是一款利用程序静态分析技术对代码可信性保障提供支持的缺陷检测工具。支持安全编码标准符合性检查、运行时缺陷检测和代码质量度量等。可适用于源码开发的任何阶段,通过持续暴露缺陷以改善质量和化解风险。利用可视化代码结构分析以辅助审查、提高效率。是国内首个通过ISO 26262、IEC 61508 和EN 50128功能安全认证的同类产品。
(完)