CodeQL

摘要

参考:https://wenyunw.me/2023/07/27/codeql/index.html

文档:用 CodeQL 查询分析你的代码 - GitHub Docs

命令查询库:CodeQL standard libraries

CodeQL环境

CodeQL解析器

下载地址:https://github.com/github/codeql-cli-binaries/releases

Release 2.23.7 (2025-12-05) codeql-linux64.zip

~/.bashrc加环境变量

1
2
export PATH=/home/mintind/codeql:$PATH
source ~/.bashrc

验证

不建议装主目录

image-20251226135451986

改一下

1
export PATH=$PATH:$HOME/CodeQL/codeql2.23.7

image-20251226135953847

CodeQL SDK

是数据库

下载:https://github.com/github/codeql

VSCode的CodeQL插件

image-20251225191631326

这个插件呢,我一开始安装的时候发现他自动在远程下载最新版的CodeQL CLI了。后面由于不知道啥问题一直Client is not running。最后是指定了已经安装的cli路径,扩大了memory之后重启vscode窗口(蛮重要的,不重启好像有些配置更新不了),发现他认了这个cli

image-20251229192359914

使用流程

生成数据库

会在当前目录下生成数据库目录

1
codeql database create 数据库名 --language=cpp --source-root=源码路径 --command="编译命令"

–language 要根据具体项目的编译语言指定
–command 参数如果不指定,会使用默认的编译命令和参数
–source-root 源码路径(目录)
–overwrite 表示 create 的目标 database 对已有的 database 做覆盖

–language的对应关系:

Language Identity
C/C++ cpp
C# csharp
Go go
Java java
javascript/Typescript javascript
Python python

–command 中指定的脚本的要求:

Confirm that there is some source code for the specified language in the project.
For codebases written in Go, JavaScript, TypeScript, and Python, do not specify an explicit –command.
For other languages, the –command must specify a “clean” build which compiles all the source code files without
reusing existing build artefacts. 即如果项目中原本有任何编译产生的临时或最终文件,都需要删除,一定保证编译过程完全“
clean ”。

Python

1
codeql database create vul_py --language=python --source-root=/home/mintind/workspace/vul_py

C

1
codeql database create vul_c --language=cpp --source-root=/home/mintind/workspace/vun_c

image-20251226145231661

database analyse

命令:

1
2
3
codeql database analyze <database> --format=<format> \
--sarif-category=<language-specifier> --output=<output> \
<packs,queries>

数据库、输出路径、查询路径都可以自定义

这个好像是使用官方预设的查询来分析数据库

1
2
3
4
5
codeql database analyze \
vul_py \
--format=sarif-latest \
--output=vul_py.sarif \
codeql/python-queries

不错,终于跑起来了

image-20251228210315648

自定义查询

自定义你的高级代码扫描设置 - GitHub Docs

工作区:docs/content/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/about-codeql-workspaces.md at main ·GitHub/Docs ·GitHub

自定义yml配置文件

1
2
3
4
5
6
name: codeql/myprqueries
version: 1.7.4-dev
dependencies:
codeql/python-all: "*"
extractor: python
warnOnImplicitThis: true

image-20251229111207597

说要codeql pack install,就运行了。然后发现是会在之前说到的那个默认目录(~/.codeql/packages)下又把包下载一遍。随后会自动重新生成一个lock.yml

image-20251229113523178

大概理解了,就是在项目里的yml里加入依赖,然后运行pack install,codeql解析依赖自动生成lock.yml。codeql会在这两个文件里找依赖。所以改了yml之后也得重新pack install

现在问题就是我明明已经在SDK文件夹里下载了这些包了,有没有办法改成已有的包的路径

执行

自己指定ql文件

1
2
3
4
5
codeql database analyze \
~/workspace/codeqlDatabase/vul_py \
--format=sarif-latest \
--output=~/workspace/codeqlres/vul_py.sarif \
~/workspace/codequery/vul_py/py_1.ql

也可以指定查询包

1
2
3
4
5
codeql database analyze \
~/workspace/codeqlDatabase/vul_py \
--format=sarif-latest \
--output=~/workspace/codeqlres/vul_py.sarif \
codeql/myprqueries

codeql query(这条线先弃了

1
codeql query run --database=/home/mintind/workspace/codeqlDatabase/vul_py py_1.ql

image-20251228112450421

说没找到python包。使用命令

1
codeql pack download codeql/python-all

下载包,又说有包,说明就是没找到

image-20251228112539763

进入CodeQL解析器目录执行pack ls命令,可以查看包。只有一个裸pack,所以CodeQL认为有包了

image-20251228113219645

查看CLI 在哪些目录里查找 packs,以及找到了哪些 pack。有的

1
codeql resolve packs --format=json
1
codeql query run ~/workspace/codequery/py_1.ql --database ~/workspace/codeqlDatabase/vul_py --search-path /home/mintind/CodeQL/codeqlsdk/python/ql -o py.sarif

查看结果

SARIF Viewer插件

结果保存在sarif文件中,下一个sarif插件。

image-20251228232428187

侧边栏会列出所有告警,点击直接跳源码。

image-20251228232603480

ql编写

官方lib:CodeQL standard libraries

教程:https://www.freebuf.com/sectool/424650.html