关于Checkmarx、CodeQL和Semgrep的测试结果比较

关于Checkmarx、CodeQL和Semgrep的测试结果比较

随着SAST工具的不断的推陈出新,为了比较一些新的工具是否能够提供更好的扫描结果,针对Checkmarx、CodeQL以及Semgrep几个工具进行了测试评估,具体的评估结果仅供参考。本文列列举了工具的各个方面的比较,比较的方面和结果如下。

一、关于语言的支持

几种工具关于语言的支持下:

Checkmarx

CodeQL

Semgrep

Java

Java

Java

JavaScript

JavaScript

JavaScript

Typescript

TypeScript

TypeScript

Python

Python

Python

Scala

Scala

GO

GO

GO

Kotlin

Kotlin

Kotlin

C

C

C

C++

C++

C++

C#

C#

PHP

PHP

Apex

Apex

Ruby

Ruby

Ruby

VB.NET

VBScript

PL\SQL

HTML5

ASP.NET

ASP

VB6

Perl

Android (Java)

Objective-C

Swift

Swift

Swift

Groovy

Cobol

RPG

Dart

Lua

Rust

Rust

JSX

Generic

JSON

Terraform

Elixir

通过比较可以了解到,Checkmarx作为老牌工具对语言的支持还是很多的。Semgrep对语言的支持也比较多,但是,有些语言的规则比较少,有的语言的规则甚至少的可怜。

二、关于框架的支持

对于SAST工具而言,对框架的支持非常重要,它可以有效地发现基于某些框架的漏洞,而且现在系统的开发为了提高开发效率,基本上没有从0开始的,都是基于框架的,因此,对于框架的支持程度对于扫描结果的影响很大。根据三种工具的官方网站关于框架的支持的描述,如下:

工具

对于框架的支持

Checkmarx

SAST Scanner - Supported Languages and Frameworks

CodeQL

Supported languages and frameworks — CodeQL

Semgrep

N/A

目前没有找到关于Semgrep的关于框架的支持的详细信息,通过了解,也只支持了一些最常用的框架,例如:Java的spring MVC/Boot,针对ReactJS,JPA,JQuery,Node.js,handlebars,Ajax也只是有限地支持,还有很多框架不支持,例如:struts,Ibatis,MyBatis等。这么多框架不支持是个硬伤,必然会导致很多误报和漏报,如果想要改进这方面的问题,就必须要定制化规则,这就需要花费一定的功夫了。

三、是否依赖编译

关于是否依赖编译这一点是非常重要的,第一点就是如果不依赖编译,就不需要根据项目的需求使用对应的编译环境;第二点就是在CI里,可以和Build的过程并行进行,缩短整个CI flow的时间。根据调查Checkmarx和Semgrep都不依赖编译,CodeQL目前还依赖编译,不过跟他们的支持人员确认的结果是:不依赖编译的功能正在研发,不过,不知道何时才会发布。

四,OWASP Benchmark的测试结果

关于OWASP Benchmark的详细介绍请参考:https://owasp.org/www-project-benchmark/,这里不作额外的介绍。根据测试得到工具的Benchmark的分述如下:

Benchmark的分数排序如下:

       Checkmarx > Semgrep > CodeQL

虽然Benchmark的分数并不一定100&说明一个工具的好坏,不排除某些工具针对它做了针对性的改进,但是,它也一定程度上反映了一个工具的扫描能力和扫描效果。因为它不仅仅根据误报来评测,它也会针对漏报进行评估。

五、误报问题

误报问题对几个工具而言,针对开源软件,像WebGoat,bwapp      juice-shop等测试的而结果还不错。不过,针对非开源软件的测试就不尽如人意,误报有些高。

六、漏报问题

漏报问题是根据几个工具的扫描结果进行比较,而得出的。例如:A工具报了20个,B工具报了10个,C工具报了5个,经过确认之后,报的问题都是有效的。那么很明显,B工具的漏报比A工具的要高,C的工具就比B工具的漏报高。针对漏报而言,随机选择了几个项目,包含Java,Python和TypeScript,比较结果是:CodeQL>Semgrep>Checkmarx,这里可能存在一定的随机性,随着挑选的项目的不同,测试结果可能不一样,仅供参考。

七、安全问题的甄别(Triage)

在安全问题的识别和分类处理时,Checkmarx由于扫描源码并且上传源码,所以,可以在UI里根据数据流切换到不同的具体代码,对于识别一个问题是否是误报,比较容易。

CodeQL是通过显示不同的数据流里的代码片段来显示问题代码的上下文,也可以比较容易看清楚数据的流向与相关的代码。

Semgrep是在本地扫描,然后将扫描的结果发送到Semgrep的云上,通过Web Portal再显示扫描结果,虽然在数据流里显示了具体的文件与行号,但是,由于不能和源代码联动,在做甄别问题时,就显得比较费劲,如果上传代码到云上,又有泄露的安全风险。

八、是否支持增量扫描

Checkmarx是支持增量扫描的,在使用CLI时,添加一个参数—Incremental True即可,在UI上也可以选择是Full Scam还是Incremental Scam,不过,在代码改动量达到一个阈值时,就会自动转成全量扫描。

CodeQL是自动默认全是全量扫描,不支持增量扫描。

Semgrep是支持增量扫描的,而且,在扫描结果也支持增量输出,在CLI添加 —incremental-output参数即可。

九、基于AI的AutoFix

Checkmarx目前只在VS Code的Plugin里实现了基于AI的AutoFix。CodeQL也实现了基于AI的Autofix,不过,只在PR(Pull Request)里实现了,Semgrep也实现了AutoFix,同样,也只在Github的PR里才能使用。虽然都是基于ChatGPT4实现的,至于具体结果上有什么不同,还尚未验证。

由于基于AI的AutoFIx,可以方便指导开发人员快速修复问题,对于一些简单的安全问题,可以实现一键修复。它可以提高开发修复安全问题的效果和效率。

十、与CI的集成

三种工具都提供了CLI工具,都可以在CI里通过调用CLI的方式来集成。如果使用Github,那么,就可以直接在Github的Action里直接调用CodeQL就比较方便。总体而言,关于CI的集成都可以比较容易集成。

十一、扫描速度

如果要集成到CI里,对工具的扫描速度要求还是比较高的,特别是一些比较大的repo,几百万行的代码,如果扫描时间太久,会Block CI的流程。三种工具的测试结果是CodeQL和Semgrep还是比较快的,Checkmarx就显得慢一些,不过,由于支持增量扫描,充分利用增量扫描的特性,也可以将扫描时间缩短很多。

十二、价格

除了工具的功能之外,还有一个很重要的因素就是性价比了,Semgrep是基于开发者的人数来计算的,网站报价40$/人/月,如果企业合作,应该还可以谈一个相对优惠的价格;Checkmarx是基于扫描的项目+开发者人数计算的;CodeQL的报价可以参考:https://github.com/pricing,企业版19.25¥$/人/月。

当然选择一个工具需要综合考虑所有的方面,才能选择一个相对更加适合企业的工具。即使综合考虑各个方面之后做出了选择,在实际使用的过程中还是会遇到各种问题,这时,厂家能够及时提供有效的支持就很重要。

最后一个也是最重要的因素就是:厂家是否能够提供有效的渠道来及时解决使用中遇到的问题。例如:误报高,可以帮助你调优规则;使用的框架暂时不在支持之列,能够及时提供新版本支持该框架;产品使用时挂了,能够及时给出临时解决方案绕过问题等等。

参考:

SAST Scanner - Supported Languages and Frameworks

Supported languages and frameworks — CodeQL

Supported languages | Semgrep

  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值