什么是CodeQL
自动化代码分析工具
基于AST语法树构建关系型数据库(CodeDB),包含所有变量定义、函数调用、条件判断等;
依赖查询规则筛选出符合条件的调用链路
默认提供一些规则,但无法满足丰富多样的场景(需要开发者自定义)
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内的编译器调用extractor将java代码编译成可查询的数据流,并以数据库的形式搭配ql库与编写的查询语句进行查询,得出结果并生成报告
官方文档
QL语法入门:Introduction to QL
JAVA QL语法:CodeQL for Java
相关库
CodeQL Cli:可执行分析程序codeql,能够针对代码创建数据库、执行ql对代码进行分析
CodeQL:开源。一系列库和规则集合、以及其他配套工具,我们可以从这里找到一些现成的规则(如Java SQL注入)、也可以二次开发自己的规则集合。 https://github.com/github/codeql.git
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 | $ tree -L 1 |
示例分析项目
Pixi(JavaScript)
OWASP WebGoat(Java)
配置codeql-cli和规则
1 | mkdir codeql-home && cd codeql-home |
下载的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 | # 解释型语言 |
如:webgoat v.8.0.0.M21之后不支持JDK8,需要checkout换分支。
1 | git clone https://github.com/WebGoat/WebGoat.git && cd |
测试时可以在LGTM.com上下载已生成好的项目数据库进行分析。
LGTM.com已经使用CodeQL分析了很多项目,可以从LGTM.com下载这些项目的databases。
登录LGTM.com。
找到感兴趣的项目并打开Integrations选项卡。
滚动到页面底部的CodeQL databases for local analysis部分。
下载用于目标语言的数据库。
对数据库进行解压。
执行QL进行分析
1 | codeql database analyze source_database_name ~/codeql/java/ql/src/Security/test/test.ql --format=csv --output=java-results.csv |
查询发现的漏洞会输出到java-results.csv文件
规则编写
如果想自己编写QL,可参考:
CodeQL编写指南:
VSCode安装codeql插件
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 初体验 - 安全客,安全资讯平台
https://github.com/haby0/mark/tree/master/articles/2021
常见漏洞
CWE类型参考:
1 | CWE-79:XSS |
https://www.codetd.com/article/11371192 挖掘分析
codeql使用指南_zzzzfeng的博客-程序员宅基地_codeql - 程序员宅基地
1 | java |
参考
安全客季刊 - 使用 CodeQL 分析闭源 Java 程序
https://spaddex.com/post/codeql/
https://geekmasher.dev/posts/sast/codeql-introduction
https://km.sankuai.com/page/661271467
教程
代码分析平台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.