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 | export PATH=/home/mintind/codeql:$PATH |
验证
不建议装主目录

改一下
1 | export PATH=$PATH:$HOME/CodeQL/codeql2.23.7 |

CodeQL SDK
是数据库
下载:https://github.com/github/codeql
VSCode的CodeQL插件

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

使用流程
生成数据库
会在当前目录下生成数据库目录
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 |

database analyse
命令:
1 | codeql database analyze <database> --format=<format> \ |
数据库、输出路径、查询路径都可以自定义
这个好像是使用官方预设的查询来分析数据库
1 | codeql database analyze \ |
不错,终于跑起来了

自定义查询
自定义你的高级代码扫描设置 - 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 | name: codeql/myprqueries |

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

大概理解了,就是在项目里的yml里加入依赖,然后运行pack install,codeql解析依赖自动生成lock.yml。codeql会在这两个文件里找依赖。所以改了yml之后也得重新pack install
现在问题就是我明明已经在SDK文件夹里下载了这些包了,有没有办法改成已有的包的路径
执行
自己指定ql文件
1 | codeql database analyze \ |
也可以指定查询包
1 | codeql database analyze \ |
codeql query(这条线先弃了
1 | codeql query run --database=/home/mintind/workspace/codeqlDatabase/vul_py py_1.ql |

说没找到python包。使用命令
1 | codeql pack download codeql/python-all |
下载包,又说有包,说明就是没找到

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

查看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插件。

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

ql编写
官方lib:CodeQL standard libraries
教程:https://www.freebuf.com/sectool/424650.html