关于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