【CodeQL从入门到精通系列】01-CodeQL简介
什么是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简介相关推荐
- React从入门到精通教程01
React从入门到精通教程 React从入门到精通教程 React简介 官方文档 React使用来干什么的 为什么需要React React特点 React基础 React的使用 Hello Worl ...
- 【ArcGIS遇上Python】从入门到精通系列之第一章:ArcGIS Python简介
文章目录 1. Python简介 2. Python的特点 3. ArcGIS的脚本语言 4. ArcGIS中的Python脚本编辑器 1. Python简介 Python是一种跨平台的计算机程序设计 ...
- Linux从入门到精通系列之PPTP
Linux从入门到精通系列之PPTP 今天我们来说下怎么在linux环境下如何搭建PPTP-×××,PPTP(Point to Point Tunneling Protocol),即点对点隧道协议.该 ...
- Jenkins pipeline 入门到精通系列文章
Jenkins2 入门到精通系列文章. Jenkins2 下载与启动 jenkins2 插件安装 jenkins2 hellopipeline jenkins2 pipeline介绍 jenkins2 ...
- html5从基础到入门,Html5从入门到精通系列2:Html5基础
Html5从入门到精通系列2:Html5基础 (2015-04-04 11:36:53) 标签: html5 html5教程 html5视频教程 html5从入门到精通 2-1.1.HTML5简介.M ...
- ArcGIS10从入门到精通系列实验图文教程(附配套实验数据持续更新)
文章目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 本教程<ArcGIS从入门到精通系列实验教程>内容包括:ArcGIS平台简介.ArcGIS应用基础.空间数据的采集 ...
- OpenShift从入门到精通系列之一:通过OpenShift实现数字化转型
OpenShift从入门到精通系列之一:通过OpenShift实现数字化转型 一.企业数字化转型之PaaS 二.企业数字化转型之DevOps 三.企业数字化转型之微服务 四.微服务架构的主要类型 五. ...
- 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编译 ...
- 【MQTT从入门到提高系列 | 01】从0到1快速搭建MQTT测试环境
这是机器未来的第24篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/125532208 1. mosquitto概述 Ecl ...
最新文章
- 【组队学习】【27期】集成学习
- 递归和迭代的区别是什么,各有什么优缺点?
- 清空Python Shell 窗口的方法 - ClearWindow
- 如何设计一门语言(五)——面向对象和消息发送
- java json帮助类_java 写一个JSON解析的工具类
- ajax改变json指向,Ajax遍历jSon后对每一条数据进行相应的修改和删除(代码分享)
- 个性化联邦学习算法框架发布,赋能AI药物研发
- vj p1041神风堂人数 题解
- BP神经网络之BP算法手写推导
- Excel:文本数字转换成数字的三种方法(转)
- 三维地图之cesium入门使用
- 【读书笔记】马化腾:先人一步-冷湖,腾讯成长之路:模仿+学习+实践+创新+合作+超越
- 基于Python制作实现的推箱子小游戏
- 补天漏洞响应平台基本介绍
- 行远自迩,乘势前行 | 菊风再中标中原银行远程银行项目
- 史记·孔子世家(强晟翻译版)
- 拼多多存在多种重大风险
- PC与西门子PLC通讯免费软件Libnodave
- Java工程师是做什么的?学习java能干什么?
- 机器学习——数据的共线性问题(岭回归、LASSO回归、逐步回归、主成分回归)