什么是CodeQL?CodeQL是哪个公司维护和发行的?CodeQL相比其他代码检查工具有哪些亮点?CodeQL的发展历程是怎样的?读完本文你将收获所有答案。如还有其他相关疑问,欢迎留言讨论。
CodeQL是业界领先的语义代码分析引擎,可发现代码中的漏洞。CodeQL像查询数据一样查询代码安全缺陷及漏洞,从而消除。
比如CodeQL默认集成的Java类安全检查规则"不安全的反序列化UnsafeDeserialization.ql
",规则实现如下
/**
* @name Deserialization of user-controlled data
* @description Deserializing user-controlled data may allow attackers to
* execute arbitrary code.
* @kind path-problem
* @problem.severity error
* @security-severity 9.8
* @precision high
* @id java/unsafe-deserialization
* @tags security
* external/cwe/cwe-502
*/
import java
import semmle.code.java.security.UnsafeDeserializationQuery
import DataFlow::PathGraph
from DataFlow::PathNode source, DataFlow::PathNode sink, UnsafeDeserializationConfig conf
where conf.hasFlowPath(source, sink)
select sink.getNode().(UnsafeDeserializationSink).getMethodAccess(), source, sink,
"Unsafe deserialization depends on a $@.", source.getNode(), "user-provided value"
以上规则采用的编写语言为QL,QL是一种声明性、面向对象的查询语言,经过优化,可实现对分层数据结构(尤其是表示软件项目的数据库)的高效分析。
QL 的语法类似于 SQL,但语义基于Datalog(一种通常作为查询语言使用的声明性逻辑编程语言)关于QL的语法后续章节会详细介绍,为了让大家能够循序渐近,在此不做展开。
CodeQL主要用于开发人员及安全研究人员自动执行代码安全检查,在 CodeQL 中,代码被视为数据。 安全漏洞、bug 和其他错误建模为可针对从代码中提取的数据库执行的查询。 可以运行由GitHub研究人员和社区参与者编写的标准 CodeQL 查询,也可以编写自己的查询以用于自定义分析。 查找潜在bug的查询会直接在源文件中突出显示结果,类似于开源免费的Findbugs、CppCheck等代码检查工具。
通过语法分析、数据流分析,CodQL可以获取代码的控制流、数据流信息,通过默认集成的Mertics规则可以统计代码行数等信息,通过Telemetry规则可以获取代码的外部API调用信息。结合以上各种信息可对代码进行多维度分析。
下图为CodeQL与业界主流代码检查工具的简单对比:
工具名称 | 是否开源 | 二次开发能力 | 规则编写难度 | 是否支持AST | 是否支持跨文件分析 |
---|---|---|---|---|---|
CodeQL | 半开源(引擎闭源,SDK开源) | 高 | 相对简单 | 支持 | 支持 |
Coverity | 否 | 低,依赖于厂商 | 相对困难 | 支持 | 支持 |
Fortify | 否 | 低,依赖于厂商 | 相对困难 | 支持 | 支持 |
SounarCube | 开源 | 高 | 相对简单 | 不支持 | 不支持 |
总结优点如下:
语言 | 版本 | 编译器 | 文件后缀 |
---|---|---|---|
C/C++ | C89, C99, C11, C18, C++98, C++03, C++11, C++14, C++17, C++20 | Clang (and clang-cl [2]) extensions (up to Clang 12.0),GNU extensions (up to GCC 11.1),Microsoft extensions (up to VS 2019),Arm Compiler | .cpp, .c++, .cxx, .hpp, .hh, .h++, .hxx, .c, .cc, .h |
C# | C# up to 10.0 | Microsoft Visual Studio up to 2019 with .NET up to 4.8,.NET Core up to 3.1,.NET 5, .NET 6 | .sln, .csproj, .cs, .cshtml, .xaml |
Go (aka Golang) | Go up to 1.20 | Go 1.11 or more recent | .go |
Java | Java 7 to 20 | javac (OpenJDK and Oracle JDK),Eclipse compiler for Java (ECJ) | .java |
Kotlin | Kotlin 1.5.0 to 1.8.20 | kotlinc | .kt |
JavaScript | ECMAScript 2022 or lower | 不涉及 | .js, .jsx, .mjs, .es, .es6, .htm, .html, .xhtm, .xhtml, .vue, .hbs, .ejs, .njk, .json, .yaml, .yml, .raml, .xml |
Python | 2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11 | 不涉及 | .py |
Ruby | up to 3.1 | 不涉及 | .rb, .erb, .gemspec, Gemfile |
TypeScript | 2.6-4.9 | Standard TypeScript compiler | .ts, .tsx, .mts, .cts |
CodeQL是Semmle公司推出的一款静态代码分析工具,原来的产品名称是SemmleQL,semmle是一家孵化于牛津大学的软件安全企业,成立于2006年,总部位于旧金山,主要客户有Credit Suisse、Dell、NASA。
Semmel推出了面向开源社区和企业的源代码分析平台LGTM(全称为Looks Good To Me),用于自动化的发现并预警GitHub上开源软件的安全问题,它对开源社区与开发者保持免费。
Semmle于2019年9月18日被MicroSoft旗下的Github收购,当前Github已经完成Semmle代码安全技术的整合,并成立了Security Lab,用于Github的开源代码安全检查,收购整合后的产品名称为CodeQL,并为供微软自身以及其他企业、组织及个人提供漏洞检测服务,帮助开发人员发现代码漏洞,同LGTM平台一样,CodeQL对开源社区及开发者免费,针对企业用户实行收费策略。
[1] https://learn.microsoft.com/zh-cn/training/modules/code-scanning-with-github-codeql
[2] https://en.wikipedia.org/wiki/Semmle