什么是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::PathGraphfrom 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++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

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

【CodeQL从入门到精通系列】01-CodeQL简介相关推荐

  1. React从入门到精通教程01

    React从入门到精通教程 React从入门到精通教程 React简介 官方文档 React使用来干什么的 为什么需要React React特点 React基础 React的使用 Hello Worl ...

  2. 【ArcGIS遇上Python】从入门到精通系列之第一章:ArcGIS Python简介

    文章目录 1. Python简介 2. Python的特点 3. ArcGIS的脚本语言 4. ArcGIS中的Python脚本编辑器 1. Python简介 Python是一种跨平台的计算机程序设计 ...

  3. Linux从入门到精通系列之PPTP

    Linux从入门到精通系列之PPTP 今天我们来说下怎么在linux环境下如何搭建PPTP-×××,PPTP(Point to Point Tunneling Protocol),即点对点隧道协议.该 ...

  4. Jenkins pipeline 入门到精通系列文章

    Jenkins2 入门到精通系列文章. Jenkins2 下载与启动 jenkins2 插件安装 jenkins2 hellopipeline jenkins2 pipeline介绍 jenkins2 ...

  5. html5从基础到入门,Html5从入门到精通系列2:Html5基础

    Html5从入门到精通系列2:Html5基础 (2015-04-04 11:36:53) 标签: html5 html5教程 html5视频教程 html5从入门到精通 2-1.1.HTML5简介.M ...

  6. ArcGIS10从入门到精通系列实验图文教程(附配套实验数据持续更新)

    文章目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 本教程<ArcGIS从入门到精通系列实验教程>内容包括:ArcGIS平台简介.ArcGIS应用基础.空间数据的采集 ...

  7. OpenShift从入门到精通系列之一:通过OpenShift实现数字化转型

    OpenShift从入门到精通系列之一:通过OpenShift实现数字化转型 一.企业数字化转型之PaaS 二.企业数字化转型之DevOps 三.企业数字化转型之微服务 四.微服务架构的主要类型 五. ...

  8. Vue3+TypeScript从入门到精通系列之:Try changing the lib compiler option to es2015 or later

    Vue3+TypeScript从入门到精通系列之:Try changing the lib compiler option to es2015 or later tsc ./泛型接口.ts tsc编译 ...

  9. 【MQTT从入门到提高系列 | 01】从0到1快速搭建MQTT测试环境

    这是机器未来的第24篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/125532208 1. mosquitto概述 Ecl ...

最新文章

  1. 【组队学习】【27期】集成学习
  2. 递归和迭代的区别是什么,各有什么优缺点?
  3. 清空Python Shell 窗口的方法 - ClearWindow
  4. 如何设计一门语言(五)——面向对象和消息发送
  5. java json帮助类_java 写一个JSON解析的工具类
  6. ajax改变json指向,Ajax遍历jSon后对每一条数据进行相应的修改和删除(代码分享)
  7. 个性化联邦学习算法框架发布,赋能AI药物研发
  8. vj p1041神风堂人数 题解
  9. BP神经网络之BP算法手写推导
  10. Excel:文本数字转换成数字的三种方法(转)
  11. 三维地图之cesium入门使用
  12. 【读书笔记】马化腾:先人一步-冷湖,腾讯成长之路:模仿+学习+实践+创新+合作+超越
  13. 基于Python制作实现的推箱子小游戏
  14. 补天漏洞响应平台基本介绍
  15. 行远自迩,乘势前行 | 菊风再中标中原银行远程银行项目
  16. 史记·孔子世家(强晟翻译版)
  17. 拼多多存在多种重大风险
  18. PC与西门子PLC通讯免费软件Libnodave
  19. Java工程师是做什么的?学习java能干什么?
  20. 机器学习——数据的共线性问题(岭回归、LASSO回归、逐步回归、主成分回归)

热门文章

  1. 根据地区名称获得经纬度
  2. 生物发光及化学发光的原理及其应用
  3. 【0810神策数据笔试】java3道编程
  4. 【参考文献】视网膜色素上皮细胞生长培养
  5. java JScrollPane设置大小宽高
  6. 全球与中国制药工艺用隔膜阀市场现状及未来发展趋势
  7. 【VBA编程】认识VBA、VBE,一个小实验和帮助的使用方法
  8. [springboot一本通]-1.6.开发过程中常用IDEA插件
  9. 水至清则无鱼,人至贱则无敌
  10. 尖端技术打底新能源产业链 恒大正式收购卡耐新能源