CodeQL 是什么
CodeQL 把代码编译成可查询的数据库,再用查询做数据流与污点分析:它能追踪用户输入如何流经参数、拼接与序列化,从而发现注入、不安全反序列化这类跨函数的路径问题。这属于语义级扫描,与基于单文件规则的 lint 不同,通常作为周期性深度扫描,和每次提交的增量检查互补。
基本信息
| 原理 | 代码数据库 + 查询语言,做数据流分析 |
|---|---|
| 集成方式 | CI 工作流中的初始化与分析两个步骤 |
| 输出 | SARIF 报告,可上报到代码托管平台的告警面板 |
| 语言支持 | 按语言提供分析器,覆盖程度因语言而异 |
| 定位 | 语义级安全扫描,与增量 lint 互补 |
典型使用场景
- 发布前对安全敏感模块做路径级扫描
- 追踪用户输入到查询语句、命令执行、文件路径的流向
- 检查序列化与反序列化入口
- 作为周期性任务,与每次提交的增量检查配合
- 把发现的告警纳入分级与排期修复
工作流要点
工作流要点
# 安装分析器并准备数据库
- uses: github/codeql-action/init@v3
with:
languages: javascript-typescript
# 执行查询并上传报告
- uses: github/codeql-action/analyze@v3
# 分析阶段输出 SARIF,告警按等级展示在平台上与增量 lint 的分工
| 维度 | 增量 lint | 语义扫描 |
|---|---|---|
| 运行时机 | 每次提交 | 周期性或发布前 |
| 分析方式 | 语法与局部模式 | 数据流与跨函数路径 |
| 误报特点 | 规则明确,容易判断 | 需要人工确认路径是否可达 |
| 处理节奏 | 当场修 | 分级后按排期修 |
把全部告警一次设为阻断,会让历史问题淹没新问题。先按等级分级,再为高等级告警设定排期与责任人,扫描结果才会被真正使用。
不要跳过数据库构建步骤:部分语言需要先完成编译或构建配置,否则分析结果不完整,还可能给出误导性的无问题结论。