当前位置: 首页 > 工具软件 > CodeQL > 使用案例 >

【CodeQL从入门到精通系列】01-CodeQL简介

卢知
2023-12-01

什么是CodeQL?CodeQL是哪个公司维护和发行的?CodeQL相比其他代码检查工具有哪些亮点?CodeQL的发展历程是怎样的?读完本文你将收获所有答案。如还有其他相关疑问,欢迎留言讨论。

1. 什么是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的语法后续章节会详细介绍,为了让大家能够循序渐近,在此不做展开。

2. CodeQL的主要用途

2.1 查找Bug,发现安全风险

CodeQL主要用于开发人员及安全研究人员自动执行代码安全检查,在 CodeQL 中,代码被视为数据。 安全漏洞、bug 和其他错误建模为可针对从代码中提取的数据库执行的查询。 可以运行由GitHub研究人员和社区参与者编写的标准 CodeQL 查询,也可以编写自己的查询以用于自定义分析。 查找潜在bug的查询会直接在源文件中突出显示结果,类似于开源免费的Findbugs、CppCheck等代码检查工具。

2.2 代码分析

通过语法分析、数据流分析,CodQL可以获取代码的控制流、数据流信息,通过默认集成的Mertics规则可以统计代码行数等信息,通过Telemetry规则可以获取代码的外部API调用信息。结合以上各种信息可对代码进行多维度分析。

3. CodeQL有哪些优点

下图为CodeQL与业界主流代码检查工具的简单对比:

工具名称是否开源二次开发能力规则编写难度是否支持AST是否支持跨文件分析
CodeQL半开源(引擎闭源,SDK开源)相对简单支持支持
Coverity低,依赖于厂商相对困难支持支持
Fortify低,依赖于厂商相对困难支持支持
SounarCube开源相对简单不支持不支持

总结优点如下:

  • 支持自定义规则,规则开发容易上手 - 基于QL语言编写规则,类似于写SQL
  • 支持编译数据库,数据库中存储了AST元数据 - 不用上传源码即可实现代码检查,支持代码不能外传场景
  • 支持污点分析和过程间分析 -通过QL语言定义安全规则查询三元组<Source,Sink,Sanitizer>可以进行漏洞查询建模

4. CodeQL支持的语言及对应的编译器

语言版本编译器文件后缀
C/C++C89, C99, C11, C18, C++98, C++03, C++11, C++14, C++17, C++20Clang (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.0Microsoft 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.20Go 1.11 or more recent.go
JavaJava 7 to 20javac (OpenJDK and Oracle JDK),Eclipse compiler for Java (ECJ).java
KotlinKotlin 1.5.0 to 1.8.20kotlinc.kt
JavaScriptECMAScript 2022 or lower不涉及.js, .jsx, .mjs, .es, .es6, .htm, .html, .xhtm, .xhtml, .vue, .hbs, .ejs, .njk, .json, .yaml, .yml, .raml, .xml
Python2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11不涉及.py
Rubyup to 3.1不涉及.rb, .erb, .gemspec, Gemfile
TypeScript2.6-4.9Standard TypeScript compiler.ts, .tsx, .mts, .cts

5. 主要企业用户

  • 微软
  • 字节
  • 其他中小型企业

6. CodeQL的发展历程

6.1. 前世

CodeQL是Semmle公司推出的一款静态代码分析工具,原来的产品名称是SemmleQL,semmle是一家孵化于牛津大学的软件安全企业,成立于2006年,总部位于旧金山,主要客户有Credit Suisse、Dell、NASA。
Semmel推出了面向开源社区和企业的源代码分析平台LGTM(全称为Looks Good To Me),用于自动化的发现并预警GitHub上开源软件的安全问题,它对开源社区与开发者保持免费。

6.2. 今生

Semmle于2019年9月18日被MicroSoft旗下的Github收购,当前Github已经完成Semmle代码安全技术的整合,并成立了Security Lab,用于Github的开源代码安全检查,收购整合后的产品名称为CodeQL,并为供微软自身以及其他企业、组织及个人提供漏洞检测服务,帮助开发人员发现代码漏洞,同LGTM平台一样,CodeQL对开源社区及开发者免费,针对企业用户实行收费策略。

7. 参考

[1] https://learn.microsoft.com/zh-cn/training/modules/code-scanning-with-github-codeql
[2] https://en.wikipedia.org/wiki/Semmle

 类似资料: