CodeQL入门
ssooking Lv5

什么是CodeQL

  • 自动化代码分析工具

  • 基于AST语法树构建关系型数据库(CodeDB),包含所有变量定义、函数调用、条件判断等;

  • 依赖查询规则筛选出符合条件的调用链路

  • 默认提供一些规则,但无法满足丰富多样的场景(需要开发者自定义)

CodeQL漏洞挖掘实战 - 兔比妙妙屋

CodeQL的查询需要建立在一个数据库的基础之上,这个数据库是通过Extractor模块对源代码进行分析、提取后得到的。

数据库建立之后,我们可以使用CodeQL执行QL查询去分析源码,发现代码中的一些已知问题。QL是⼀种查询语⾔,⽀持对 C++,C#,Java,JavaScript,Python,go等多种语言进行分析,可用于分析代码,查找代码中控制流等信息。

对于编译型语言,CodeQL会在建立数据库时模拟编译过程,在make等编译工具链调用gcc等编译器时,用相同的编译参数调用extractor模块取而代之,收集源代码的所有相关信息,如AST抽象语法树、函数变量类型、预处理器操作等等。对于解释型语言,因为没有编译器的存在,CodeQL会以跟踪执行的方式获取类似的信息。

CodeQL漏洞追踪思想

在代码自动化安全审计的理论当中,有一个最核心的三元组概念,就是(source,sink和sanitizer)。

source是指漏洞污染链条的输入点。比如获取http请求的参数部分,就是非常明显的Source。

sink是指漏洞污染链条的执行点,比如SQL注入漏洞,最终执行SQL语句的函数就是sink(这个函数可能叫query或者exeSql,或者其它)。

sanitizer又叫净化函数,是指在整个的漏洞链条当中,如果存在一个方法阻断了整个传递链,那么这个方法就叫sanitizer。

只有当source和sink同时存在,并且从source到sink的链路是通的,才表示当前漏洞是存在的。

codeql审计代码原理图

可以参考绿盟这篇理解:CodeQL漏洞挖掘实战 - 云+社区 - 腾讯云

  • 原理:编写查询语句找出代码中的漏洞,codeql内的编译器调用extractor将java代码编译成可查询的数据流,并以数据库的形式搭配ql库与编写的查询语句进行查询,得出结果并生成报告

官方文档

相关库

  • CodeQL Cli:可执行分析程序codeql,能够针对代码创建数据库、执行ql对代码进行分析

  • CodeQL:开源。一系列库和规则集合、以及其他配套工具,我们可以从这里找到一些现成的规则(如Java SQL注入)、也可以二次开发自己的规则集合。 https://github.com/github/codeql.git

  • Go analysis support for CodeQL

  • CodeQL for Visual Studio Code: Visual Studio Code插件,利用该插件可以编写和运行ql、查看结果。

  • vscode-codeql-starter    帮助开发编写ql语法

基本安装使用

https://anemone.top/whitebox-CodeQL%E5%88%9D%E6%8E%A2/

下载三个组件,放在code-home目录下

1
2
3
4
5
$ tree -L 1
.
├── codeql # codeql引擎,https://github.com/github/codeql-cli-binaries/releases
├── codeql-go # go解析,https://github.com/github/codeql-go/
└── codeql-repo     # 规则,https://github.com/github/codeql

示例分析项目

配置codeql-cli和规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mkdir codeql-home && cd codeql-home
git clone https://github.com/github/codeql.git codeql-repo //rules directory

git clone https://github.com/github/codeql-go

# codeql-cli
wget https://github.com/github/codeql-cli-binaries/releases/latest/download/codeql.zip
unzip codeql-osx64.zip
mv codeql codeql-cli

$ codeql-home > tree -L 1
.
├── codeql-cli
├── codeql-go
└── codeql-repo

# 添加codeql cli环境变量
export PATH="/Users/ssooking/CodeAuditTool/codeql-home/codeql-cli:${PATH}"

下载的ql库是codeql代码,有包结构/目录结构要求(qlpack.yml定义一个package),才能正常编译、执行。

白盒扫描

codeql analyze命令可以执行单个ql文件、或者指定目录(搜素执行所有ql文件)、和查询suite(.qls)

QL库集成了许多常见的安全漏洞查询语法(参考:CodeQL query help for Java),可以拿来扫描项目源码。如:java语言的漏洞查询代码目录在qllib/java/ql/src/Security/CWE,这里新建test.ql

白盒扫描使用如下命令(执行所有漏洞类查询)

1
codeql database analyze source_database_name qllib/java/ql/src/codeql-suites/java-security-extended.qls --format=csv --output=java-results.csv

构建被测项目数据库

我们需要把我们的靶场项目,使用CodeQL引擎转换成CodeQL可以识别的database,这个过程当中,CodeQL引擎把我们的java代码转换成了可识别的AST数据库。

在生成数据库时,Python和Javascript这种非编译型语言,无需提供编译命令,可以使用–source-root参数指向待分析源代码路径;

对于编译型语言,CodeQL会尝试使用内置命令去编译,但有时编译环境参数有区别导致无法正常构建项目,此时可以使用–command指定构建命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 解释型语言
codeql database create --language=<language-identifier> --source-root <folder-to-extract> <database>
# 编译型语言
codeql database create --language=cpp <output-folder>/cpp-database --command="编译命令"


codeql database create jstest --language=javascript
codeql database create ./databases/Pixi --language="javascript" --source-root="./apps/Pixi"

cd vuln_project
codeql database create <source_database_name> --language=java



# Create database folder
mkdir databases

# Create CodeQL database for JavaScript (interpreted language)
codeql database create \
./databases/Pixi \
--language="javascript" \
--source-root="./apps/Pixi"

# Another example using Java (compiled language)
codeql database create \
./databases/WebGoat \
--language="java" \
--command="mvn clean install --file pom.xml" \
--source-root="./apps/WebGoat"

如:webgoat v.8.0.0.M21之后不支持JDK8,需要checkout换分支。

1
2
3
4
git clone https://github.com/WebGoat/WebGoat.git && cd 
git checkout tags/v8.0.0.M21
codeql database create webgoat_v8 --language=java \
--command="mvn clean package -f pom.xml -B -V -e -Dfindbugs.skip -Dcheckstyle.skip -Dpmd.skip=true -Denforcer.skip -Dmaven.javadoc.skip -DskipTests -Dmaven.test.skip.exec -Dlicense.skip=true"

测试时可以在LGTM.com上下载已生成好的项目数据库进行分析。

LGTM.com已经使用CodeQL分析了很多项目,可以从LGTM.com下载这些项目的databases。

  1. 登录LGTM.com。

  2. 找到感兴趣的项目并打开Integrations选项卡。

  3. 滚动到页面底部的CodeQL databases for local analysis部分。

  4. 下载用于目标语言的数据库。

  5. 对数据库进行解压。

执行QL进行分析

1
2
3
4
5
6
7
8
9
10
codeql database analyze source_database_name ~/codeql/java/ql/src/Security/test/test.ql --format=csv --output=java-results.csv

codeql database analyze source_database_name /Users/ssooking/hacktools/CodeAuditTool/codeql-home/codeql-repocodeql-home/javascript/ql/src/Security --format=csv --output=java-results.csv

codeql database analyze \
--ram=6000 --threads=4 \
--format="csv" \
--output="./results/xss-reflected.csv" \
./databases/Pixi \
./queries/javascript/ql/src/Security/CWE-079/ReflectedXss.ql

查询发现的漏洞会输出到java-results.csv文件

规则编写

如果想自己编写QL,可参考:

CodeQL编写指南:

VSCode安装codeql插件

https://codeql.github.com/docs/codeql-for-visual-studio-code/setting-up-codeql-in-visual-studio-code/

1.在插件市场安装CodeQL插件

2.VSCode配置拓展设置

进入CodeQL拓展设置:@ext:github.vscode-codeql

CLi: Executable Path设置为codecli可执行文件codeql执行路径。这里为:/Users/ssooking/CodeAuditTool/codeql-home/codeql-cli-binaries/codeql

3.下载vscode-codeql-starter到codeql-home中

1
git clone --recursive https://github.com/github/vscode-codeql-starter/

生成数据库文件

然后打开vscode-codeql-starter,在vscode里面配置添加库文件


添加已分析好的数据库文件

在VSCode菜单中点击 File > Open Workspace 选择 vscode-codeql-starter.code-workspace 这个文件来打开这个工作区。

添加已分析好的数据库文件

这个链接下载已经分析好的 uboot CodeQL 数据库,然后解压到相应的文件夹。

使用 VSCode 快捷键 “ctrl+shift+p” 进入命令模式,输入 “codeql choose database” 看到相应的选项后,点击就可以添加上前面解压的 uboot codeql 数据库。

在前面打开工作区VSCode中使用 File -> Add Folder to Workspace 添加前面机器人新建的项目文件夹到当前工作区。

在LGTM中导入一个包的步骤:

在vscode的CodeQL插件中点击Download from LGTM小头像

  • 输入URL例如https://lgtm.com/projects/g/apache/kafka,再选择需要的语言即可。

  • 最快速的开启方法是直接到lgtm网站进行编写查询

CodeQL帮助我们进行了语法树和数据流分析,现在只需要专注于查询语句的写法即可。

代码分析引擎 CodeQL 初体验 - 安全客,安全资讯平台

Analyzing your projects

https://github.com/haby0/mark/tree/master/articles/2021

常见漏洞

CWE类型参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CWE-79:XSS
CWE-89:SQLi
CWE-502: 不安全的反序列化
CWE-90:LDAP Injection
CWE-113: HTTP响应拆分
CWE-129: Improper Validation of Array Index
CWE-134: Use of Externally-Controlled Format String

CWE-22:路径穿越
参考:https://cwe.mitre.org/data/definitions/22.html

CWE-78:OS Command Injection
参考:https://cwe.mitre.org/data/definitions/78.html

https://www.codetd.com/article/11371192 挖掘分析

codeql使用指南_zzzzfeng的博客-程序员宅基地_codeql - 程序员宅基地

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
java
1、zip slip(zip解压覆盖任意文件)

https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql

2、命令注入
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-078/ExecUnescaped.ql
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-078/ExecTainted.ql

3、cookie安全
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-312/CleartextStorageCookie.ql
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql

4、XSS
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-079/XSS.ql

5、依赖漏洞
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-1104/MavenPomDependsOnBintray.ql
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-829/InsecureDependencyResolution.ql

6、反序列化
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.ql

7、http头注入
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-113/NettyResponseSplitting.ql
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql

8、url跳转
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-601/UrlRedirect.ql

9、ldap注入
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-090/LdapInjection.ql

10、sql注入
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-089/SqlTainted.ql
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-089/SqlUnescaped.ql

11、file权限&目录注入
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-732/ReadingFromWorldWritableFile.ql
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-022/TaintedPath.ql

12、xml注入
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-611/XXE.ql

13、SSL校验
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql

14、弱加密
https://github.com/github/codeql/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.ql

15、随机数种子可预测
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-335/PredictableSeed.ql

参考

安全客季刊 - 使用 CodeQL 分析闭源 Java 程序

https://spaddex.com/post/codeql/

https://geekmasher.dev/posts/sast/codeql-introduction

https://km.sankuai.com/page/661271467

https://marketplace.visualstudio.com/items?itemName=github.vscode-codeql#cloning-the-codeql-starter-workspace

CodeQL使用 | angelwhu_blog

教程

代码分析平台CodeQL学习手记(十五) - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com

Codeql漏洞挖掘

推推荐mark/articles/2021 at master · haby0/mark · GitHub

codeql挖掘React应用的XSS实践 | Image’s blog

CodeQL进行JAVA代码审计(1) — XXE漏洞的挖掘 https://cloud.tencent.com/developer/article/1621363
使用codeql挖掘fastjson利用链 https://xz.aliyun.com/t/7482

JavaScript 代码分析引擎 CodeQL 初体验 - 云+社区 - 腾讯云

[Using CodeQL to detect client-side vulnerabilities in web applications](Using CodeQL to detect client-side vulnerabilities in web applications | Raz0r.name)

  • Post title:CodeQL入门
  • Post author:ssooking
  • Create time:2021-11-07 10:55:47
  • Post link:https://ssooking.github.io/2021/11/codeql入门/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.