CodeQL 学习笔记【1】环境搭建

CodeQL 是什么

CodeQL 是一个强大的代码分析引擎,在 CodeQL 中,代码被视为数据,可以被转换成一个可查询的数据库形式。这个数据库包含了源代码的抽象语法树(AST)、语义信息、控制流和数据流等关键信息。利用 CodeQL,用户可以编写查询来检测代码中的安全漏洞、Bug 以及其他潜在的问题。

CodeQL 的核心是一个不开源的解析引擎,它帮助将代码转换成 CodeQL 可以识别的数据库。同时,CodeQL 提供了一个完全开源的 SDK,其中包含了大部分现成的漏洞规则,用户也可以利用它来参考编写自定义规则。

CodeQL 引擎地址:github.com/github/code...

CodeQL SDK 地址:github.com/github/code...

CodeQL 的使用包括创建 CodeQL 数据库、运行查询以及解析查询结果几个步骤。它支持多种编程语言:

此外,CodeQL 还提供了一套自己的查询语言(QL),用户可以通过编写 QL 规则来获取想要的数据。CodeQL 的处理对象并不是源码本身,而是中间生成的 AST 结构数据库。因此,在使用 CodeQL 之前,需要将项目源码转换成 CodeQL 能够识别的 CodeDatabase。

下载安装

下载 CodeQL 的 CLI 引擎和 SDK 模版:

CodeQL CLI 引擎地址:github.com/github/code...

CodeQL SDK 地址:github.com/github/code...

然后放到你的工具文件夹目录里去,然后解压,添加 Code CLI 引擎的 PATH 环境变量:

bash 复制代码
% vim ~/.zshrc # 编辑内容,添加下面的内容
% cat ~/.zshrc
# CodeQL 工具
export PATH="$PATH:/Users/{你的用户名}/Code_Space/CodeQL/codeql/codeql"  # 你的路径

简单实验一下是否安装成功:

bash 复制代码
% codeql --version
CodeQL command-line toolchain release 2.17.1.
Copyright (C) 2019-2024 GitHub, Inc.
Unpacked in: /Users/sanqiushu/Code_Space/CodeQL/codeql
   Analysis results depend critically on separately distributed query and
   extractor modules. To list modules that are visible to the toolchain,
   use 'codeql resolve qlpacks' and 'codeql resolve languages'.

% codeql pack ls
Running on packs: codeql/csharp-all, codeql/threat-models, codeql/csharp-queries, codeql/mad, codeql/swift-queries, codeql/cpp-examples, codeql/ruby-queries, codeql/ssa, codeql/xml, codeql/controlflow, codeql/ruby-examples, codeql/java-queries, codeql/regex, codeql/yaml, codeql/csharp-examples, codeql/go-queries, codeql/swift-all, codeql/python-queries, codeql/go-all, codeql/javascript-all, codeql/typos, codeql/suite-helpers, codeql/tutorial, codeql/typeflow, codeql/rangeanalysis, codeql/go-examples, codeql/python-all, codeql/java-examples, codeql/cpp-queries, codeql/python-examples, codeql/javascript-examples, legacy-upgrades, codeql/javascript-queries, codeql/cpp-all, codeql/util, codeql/dataflow, codeql/typetracking, codeql/java-all, codeql/ruby-all.
Found legacy-upgrades@0.0.0
Found codeql/controlflow@0.1.14
Found codeql/cpp-all@0.12.11
Found codeql/cpp-examples@0.0.0
Found codeql/cpp-queries@0.9.10
Found codeql/csharp-all@0.9.1
Found codeql/csharp-examples@0.0.0
Found codeql/csharp-queries@0.8.14
Found codeql/dataflow@0.2.5
Found codeql/go-all@0.7.14
Found codeql/go-examples@0.0.0
Found codeql/go-queries@0.7.14
Found codeql/java-all@0.9.1
Found codeql/java-examples@0.0.0
Found codeql/java-queries@0.8.14
Found codeql/javascript-all@0.8.14
Found codeql/javascript-examples@0.0.0
Found codeql/javascript-queries@0.8.14
Found codeql/mad@0.2.14
Found codeql/python-all@0.11.14
Found codeql/python-examples@0.0.0
Found codeql/python-queries@0.9.14
Found codeql/rangeanalysis@0.0.13
Found codeql/regex@0.2.14
Found codeql/ruby-all@0.8.14
Found codeql/ruby-examples@0.0.0
Found codeql/ruby-queries@0.8.14
Found codeql/ssa@0.2.14
Found codeql/suite-helpers@0.7.14
Found codeql/swift-all@0.3.14
Found codeql/swift-queries@0.3.14
Found codeql/threat-models@0.0.13
Found codeql/tutorial@0.2.14
Found codeql/typeflow@0.0.1
Found codeql/typetracking@0.2.14
Found codeql/typos@0.2.14
Found codeql/util@0.2.14
Found codeql/xml@0.0.1
Found codeql/yaml@0.2.14

这样基本上就可以了

然后我们还需要准备一下需要审计的代码,我这里直接就用漏洞靶场代替了

bash 复制代码
% cd /Users/{你的用户名}/Code_Space/IntelliJ_IEDA_CE_Space
% git clone https://github.com/WebGoat/WebGoat.git
% cd WebGoat 
% ls
CODE_OF_CONDUCT.md		Dockerfile_desktop		README_I18N.md			mvnw
CONTRIBUTING.md			FAQ.md				RELEASE_NOTES.md		mvnw.cmd
COPYRIGHT.txt			LICENSE.txt			config				pom.xml
CREATE_RELEASE.md		PULL_REQUEST_TEMPLATE.md	docs				robot
Dockerfile			README.md			mvn-debug			src

然后我们还需要准备一下代码编辑器环境,这里使用 VSCode,直接插件市场搜索 CodeQL 安装即可

然后把我们安装的 CodeQL 引擎路径放入 CodeQL 插件的设置中去(直接放可执行文件的路径)

简单使用

好的,环境基本准备完毕了,接下来就可以开始进行学习了。 首先我们需要为这个项目构建 CodeQL 数据库,只有这样 CodeQL 才能在数据库的基础上进行查询。

请注意,WebGoat 默认 JAVA 版本是 JDK 17,请注意修改自己的 JAVA_HOME 环境变量。

bash 复制代码
% cd /Users/{你的用户名}/Code_Space/IntelliJ_IEDA_CE_Space/CMS/WebGoat
% codeql database create WebGoat_CodeQL_database -l java  # 只需要指定数据库名字和语言就行了

运行之后 CodeQL 会运行 mvn 进行下载依赖、编译程序,然后使用 CodeQL 引擎生成数据库等等操作。

这就是生成的数据库文件夹。

然后点击 CodeQL 插件,在界面中完成语言选择、数据库选择

我们使用 VSCODE 打开 CodeQL 的 SDK 模板的路径,然后我们来到编辑器页面,新建一个查询,路径如下 /codeql-codeql-cli-v2.17.1 15.09.14/java/ql/src/myWebgoat.ql 编写查询代码

sql 复制代码
import java

from Method m
select m

直接右键运行

右侧即可查询到内容

我们再编写一个查询对 executeQuery 方法调用的例子:

sql 复制代码
import java

from MethodCall mm
where mm.getMethod().getName() = "executeQuery"
select mm

点击右侧的结果,还可以直接看到源码。

下一篇我们将介绍如何实战查找漏洞。


文中如果有任何错误欢迎随时沟通和指出。

如果觉得有用,请点赞支持一下吧。

相关推荐
桌面运维家36 分钟前
vDisk VOI/IDV权限管理怎么做?安全方案详解
安全
世界尽头与你1 小时前
(修复方案)kibana 未授权访问漏洞
安全·网络安全·渗透测试
xixixi777772 小时前
今日 AI 、通信、安全行业前沿日报(2026 年 2 月 4 日,星期三)
大数据·人工智能·安全·ai·大模型·通信·卫星通信
蓝队云计算3 小时前
蓝队云部署OpenClaw深度指南:避坑、优化与安全配置,从能用做到好用
运维·安全·云计算
lingggggaaaa3 小时前
安全工具篇&Go魔改二开&Fscan扫描&FRP代理&特征消除&新增扩展&打乱HASH
学习·安全·web安全·网络安全·golang·哈希算法
Black蜡笔小新5 小时前
国密GB35114平台EasyGBS筑牢安防安全防线,GB28181/GB35114无缝接入
网络·安全·音视频·gb35114
2401_865854885 小时前
安全为先|咕噜分发平台:一站式App漏洞分析与安全分发解决方案
安全
科普体验馆6 小时前
VR安全体验馆深度测评:优质服务商与推荐厂家剖析
安全·vr
王家视频教程图书馆6 小时前
关于我们的服务端 app端安全架构 深刻思考
安全·安全架构
安科瑞小许6 小时前
乡村的“电力粮仓”:储能系统如何守护农村用电安全与经济性?
安全·农村光伏·农村微电网