static-analysis
static-analysis Skill 深度评测:CodeQL+Semgrep+SARIF 三件套
评分明细
适用场景
trailofbits/static-analysis 快速入门
Trail of Bits 静态分析 Skill,把 CodeQL、Semgrep、SARIF 三件套串成 AI 可直接调用的漏洞扫描流水线。
这是什么?解决什么问题?
static-analysis 是 Trail of Bits 14 个 Skill 中专门做”静态分析”的那一个。它把业界最主流的三种工具——CodeQL(语义级深度分析)、Semgrep(模式匹配 + AST 规则)、SARIF(统一结果格式)——封装成 AI 可直接调用的协议,让 AI 在代码评审时主动触发机器扫描,再用语义分析二次过滤。
对小白来说,这个 Skill 解决的是”AI 看了代码但漏掉一些模式化漏洞”的问题。AI 容易遗漏 SQL 注入、危险函数、硬编码密钥这类”模式化但数量大”的问题,而 Semgrep 几秒钟就能扫出来。把 AI 的”语义判断”与机器的”模式匹配”组合,漏洞检出率提升数倍。
准备工作
- 支持 Agent:Claude Code(主推)、支持 Skills 协议的 Agent。
- 运行环境:Python 3.10+;Semgrep(
pip install semgrep);CodeQL CLI(单独下载);Node.js 18+(可选)。 - 目标项目:任意代码仓库,Python / JS / Go / Java / Rust 都支持。
- 基础概念:理解静态分析与动态分析的区别、SAST 工具链的基本名词。
3 步快速上手
第 1 步:安装依赖
pip install semgrep
# CodeQL CLI:从 GitHub release 下载
# https://github.com/github/codeql-cli-binaries/releases
克隆 Skill:
git clone https://github.com/trailofbits/skills.git
cp -r skills/static-analysis ~/.claude/skills/
第 2 步:在 Claude Code 中发起扫描
cd your-project
claude
发起任务:
请用 static-analysis Skill 扫描 src/,先用 Semgrep 跑 p/owasp-top-ten 规则集,再用 CodeQL 跑 security-extended 查询,最后输出 SARIF 报告。
第 3 步:查看 SARIF 结果
# 把 SARIF 报告转成 HTML 方便查看
semgrep --config=p/owasp-top-ten --sarif --output=results.sarif src/
# 用 sarif-tools 转 HTML
pip install sarif-tools
sarif html results.sarif
常见踩坑
- CodeQL 没用 GitHub 仓库:CodeQL 默认假设有 .ql 文件,如果是临时项目,需要
codeql database create先建库。 - Semgrep 规则集过宽:用
--config=p/security-audit一次扫几千条,噪音很大,Skill 建议从p/owasp-top-ten+p/security-audit起步。 - SARIF 字段不熟悉:result.ruleId、result.level、result.message.text 是核心字段,先看一份示例。
- 误报太多:Semgrep 误报率约 30%,Skill 强调必须 AI 二次过滤。
- 扫描时间过长:大型 monorepo 全量扫描可能 30 分钟+,Skill 建议增量扫描(只扫 diff 文件)。
- 不开 GitHub Code Scanning:CodeQL 结果可以上传 GitHub 自动出 PR 标注,Skill 强烈建议开启。
初级用法
- PR 自动扫描:在 GitHub Actions 里跑 Semgrep + CodeQL,SARIF 结果直接显示在 PR 界面。
- 新代码评审:diff 文件给 AI,让 AI 用 Semgrep 跑 + 语义分析,出”高/中/低”三档报告。
- 依赖扫描补充:Skill 与
security-and-hardening联动,代码 + 依赖双重扫描。
高级玩法
- 自定义 Semgrep 规则:用
semgrep-rule-creatorSkill 把公司规范固化为规则。 - CodeQL 自定义查询:用 CodeQL 写项目专属查询(比如自家框架的 call chain 漏洞)。
- CI 卡门禁:把 SARIF 中的 high/critical 数设为 required check,超出 fail PR。
小技巧
- Semgrep 规则命名约定:
p/是 Semgrep Registry,auto/是自动配置,local/是本地规则。 - CodeQL 数据库构建很慢,
codeql database create --language=python --source-root=.,复用是关键。 - SARIF 报告可以用 VS Code 插件(SARIF Viewer)直接看,体验最好。
- AI 二次过滤时,要求”忽略已知误报模式”可减少噪音。
- 关注 Trail of Bits 博客的 static analysis 标签,定期有新规则和模式补充。
常见问题 FAQ
Q1: 这个 Skill 跟 trailofbits/static-analysis 有什么关系?必须装吗?
A: Skill 是给 AI Agent 用的”技能包”,能告诉 Agent 怎么按特定规范工作。不是必须装——如果你的项目规模小、要求不高,不装也能用。但装上能让 Agent 输出的质量更高、更符合最佳实践,推荐装。
Q2: 这个 Skill 适合哪些 AI Agent?Cursor?Claude Code?其他?
A: trailofbits/static-analysis 来自 TrailOfBits,主要面向支持 Skill 机制的 Agent。常见兼容 Agent 包括 Claude Code、Cursor、OpenCode、Windsurf 等。具体兼容性请查 Skill 官方文档。
Q3: 装了这个 Skill 后,会拖慢 Agent 响应吗?
A: 会的——Skill 通常会增加 prompt 长度,导致响应变慢、token 消耗增加。但质量提升明显。建议:1) 只装项目必需的 Skill;2) 用 Skill 启动/加载/卸载机制按需加载;3) 定期清理不用的 Skill。
Q4: 怎么验证 Skill 装对了?
A: 在 Agent 中输入”列出已加载的 Skill”或类似命令。如果 Skill 出现在列表里,说明装对了。然后用 Skill 跑一个相关任务,看输出是否符合 Skill 规范。
Q5: 这个 Skill 有许可证吗?能商用吗?
A: 取决于 trailofbits/static-analysis 的许可证。常见许可证包括 MIT(完全自由)、Apache-2.0(自由但有专利条款)、源可用(可看不能用)、GPL(强开源)。商用前请查仓库 LICENSE 文件。
进阶学习建议
如果想进一步用好 trailofbits/static-analysis,建议按以下路径学习:
第 1 周:熟练使用
- 完成 3 步快速上手,跑通第一个任务
- 试 2-3 个不同场景的真实任务
- 记录”哪些 prompt 有效、哪些没用”——形成自己的 prompt 笔记
第 2 周:理解机制
- 阅读 Skill 的官方文档(README、SKILL.md)
- 了解 Skill 的”触发关键词”和”输出格式”
- 学习”如何用更具体的描述触发 Skill”
第 3-4 周:组合使用
- 跟其他 Skill 组合(比如代码审查 + 性能优化)
- 跟其他 Agent 工具组合(Skill + MCP + 自定义脚本)
- 沉淀团队/个人的 Skill 库
长期:贡献社区
- 把自定义的 Skill 开源到 GitHub
- 提 PR 改进现有 Skill
- 写使用心得分享到 CSDN/掘金/知乎
推荐资源:
- 官方文档:https://github.com/trailofbits/skills
- 官方仓库 README 里的 Examples
- 社区最佳实践:Anthropic 官方博客 https://www.anthropic.com/blog
- 国内社区:CSDN AI 板块、掘金 AI 板块
避免的坑:
- 不要装太多 Skill(超过 10 个会拖慢 Agent)
- 不要把 Skill 装在不兼容的 Agent 上
- 不要直接复制 Skill 默认 prompt——要根据项目调整
- 定期 review Skill 库的实用性,清理不用的
参考链接
- 官方仓库:https://github.com/trailofbits/skills
- 该 Skill 目录:https://github.com/trailofbits/skills/tree/main/skills/static-analysis
- Semgrep 文档:https://semgrep.dev/docs/
- CodeQL 文档:https://codeql.github.com/docs/
- SARIF 规范:https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html
- GitHub Code Scanning:https://docs.github.com/en/code-security/code-scanning
- 配套 semgrep-rule-creator:https://github.com/trailofbits/skills/tree/main/skills/semgrep-rule-creator
静态分析为什么是安全基础
静态分析(SAST)是应用安全测试(ASAT)三大支柱之一,另外两个是动态分析(DAST)和软件成分分析(SCA)。静态分析不运行代码,而是分析代码本身(词法、语法、AST、CFG、数据流),找出潜在漏洞。
Trail of Bits 的 static-analysis Skill 把 CodeQL、Semgrep、SARIF 三个工具串成 AI 可直接调用的流水线。CodeQL 是 GitHub 推出的语义级深度分析(类比 SQL 查询代码);Semgrep 是模式匹配工具,规则丰富;SARIF 是统一的结果格式,便于工具间互操作。
三者组合可以做到”广度(模式匹配)+ 深度(语义分析)“,覆盖大部分常见漏洞类型。
进一步阅读
- Semgrep 官方文档(https://semgrep.dev/docs/) 详细讲规则编写与使用。
- CodeQL 官方文档(https://codeql.github.com/docs/) 解释查询语言与数据库构建。
- SARIF 规范(https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html) 是行业标准。
- GitHub Code Scanning(https://docs.github.com/en/code-security/code-scanning) 集成 CodeQL 与 PR 流程。
- OWASP ASVS(https://owasp.org/www-project-application-security-verification-standard/) 提供安全验证标准。
- 《Secure Programming with Static Analysis》(《用静态分析写安全代码》) 是经典教材。
- Trail of Bits 博客 static analysis 标签页(https://blog.trailofbits.com/) 有大量实战案例。
实战建议
- PR 自动扫描:在 GitHub Actions 里跑 Semgrep + CodeQL,SARIF 结果直接显示在 PR 界面。
- 新代码评审:diff 文件给 AI,让 AI 用 Semgrep 跑 + 语义分析,出”高/中/低”三档报告。
- 依赖扫描补充:Skill 与 security-and-hardening 联动,代码 + 依赖双重扫描。
- 自定义 Semgrep 规则:用 semgrep-rule-creator Skill 把公司规范固化为规则。
- CodeQL 自定义查询:用 CodeQL 写项目专属查询(比如自家框架的 call chain 漏洞)。
- CI 卡门禁:把 SARIF 中的 high/critical 数设为 required check,超出 fail PR。
本文基于官方文档和公开资料整理,AI辅助生成,MagicNetWorld 尚未完成独立实测。如有错误或过时信息,请通过 contact@magicnetworld.com 反馈。
static-analysis Skill 多维度简评
综合评分:9.0 / 10 ⭐⭐⭐⭐⭐ 类别:安全审计 / 静态分析 仓库:trailofbits/skills 维护者:Trail of Bits(应用安全领域权威机构) 理论基础:Trail of Bits Application Security Testing Handbook
一、核心定位与价值
static-analysis 是 Trail of Bits 在 Claude Code 技能市场发布的核心安全审计 Skill,把应用安全测试”三剑客”打包成一个工作流:
| 工具 | 能力 | 适用场景 |
|---|---|---|
| CodeQL | 跨函数/模块语义分析、数据流追踪、污点分析 | 深度漏洞挖掘 |
| Semgrep | 模式匹配、轻量扫描、快速自定义规则 | CI 集成、快速反馈 |
| SARIF Parsing | 多工具输出聚合、规范化、分拣 | CI/CD 结果自动化处理 |
关键洞见:Semgrep 负责速度,CodeQL 负责深度,SARIF 负责聚合。三者结合才能既快又准。
适用场景
- 对代码库(任意语言)运行安全扫描
- 编写自定义 CodeQL 查询或 Semgrep 规则
- 处理和分析 SARIF 输出文件
- 在 CI/CD 流水线中设置静态分析
- 比较和聚合多工具的扫描结果
- 修复工作的优先级排序
不适用场景
- 从零写 Semgrep 规则 → 用
semgrep-rule-creator - 动态分析或模糊测试 → 用
testing-handbook-skills - 智能合约审计 → 用
building-secure-contracts - PR 级安全审查 → 用
security-differential-review
二、核心能力
2.1 工具选择决策表
| 场景 | 推荐工具 | 原因 |
|---|---|---|
| 快速安全扫描 | Semgrep | 秒级返回结果,无需编译 |
| 深度漏洞分析 | CodeQL | 跨函数数据流追踪 |
| 数据流 / 污点追踪 | CodeQL(最佳)或 Semgrep taint mode | 都支持 |
| 自定义模式检测 | Semgrep(更简单)或 CodeQL(更强) | 视复杂度选 |
| CI/CD 集成 | Semgrep(最快)+ CodeQL(最全) | 组合使用 |
| 处理扫描结果 | SARIF Parsing | 统一格式 |
| 非可编译代码库 | Semgrep | 在不完整代码上也能跑 |
2.2 三层工具链架构
┌─────────────────────────────────────────────────┐
│ CodeQL (深度) │
│ - 编译期数据库 │
│ - 跨函数数据流 │
│ - 完整类型推断 │
│ - 适合:挖掘深层漏洞 │
│ - 代价:需要完整 build,慢 │
└─────────────────────────────────────────────────┘
↑ 互补
┌─────────────────────────────────────────────────┐
│ Semgrep (速度) │
│ - 无需编译 │
│ - 模式匹配 │
│ - 在 IDE / pre-commit 即时反馈 │
│ - 适合:日常扫描、CI 守门 │
│ - 代价:精度不如 CodeQL │
└─────────────────────────────────────────────────┘
↓ 输出
┌─────────────────────────────────────────────────┐
│ SARIF Parsing (聚合) │
│ - SARIF v2.1.0 标准化 │
│ - 多工具结果去重 │
│ - 按严重度分拣 │
│ - 集成 GitHub Code Scanning │
│ - 适合:CI/CD 流水线 │
└─────────────────────────────────────────────────┘
2.3 核心子 Skill
仓库路径:
skills/codeql/SKILL.md— CodeQL 子 Skillskills/semgrep/SKILL.md— Semgrep 子 Skillskills/sarif-parsing/SKILL.md— SARIF 解析子 Skill
三、完整使用流程
3.1 Semgrep 快速扫描
# 安装
pip install semgrep
# 用 Semgrep Registry 推荐规则集
semgrep --config=auto .
# 指定规则集
semgrep --config=p/security-audit .
semgrep --config=p/owasp-top-ten .
semgrep --config=p/cwe-top-25 .
# 多个规则集
semgrep \
--config=p/security-audit \
--config=p/secrets \
--config=p/owasp-top-ten \
.
特点:
- ⚡ 通常 30 秒 - 3 分钟跑完中型项目
- 📊 直接输出 30+ 种语言支持
- 🪶 轻量级,无需编译源码
3.2 CodeQL 深度分析
# 安装 CodeQL CLI
# macOS
brew install codeql
# Linux
wget https://github.com/github/codeql-cli-binaries/releases/latest/download/codeql-linux64.zip
unzip codeql-linux64.zip -d /opt/codeql
export PATH="/opt/codeql/codeql:$PATH"
# 拉取 CodeQL 查询包
codeql pack download codeql/python-queries
codeql pack download codeql/javascript-queries
# 创建数据库
codeql database create mydb --language=python --source-root=.
# 跑安全查询
codeql database analyze mydb \
codeql/python-queries:codeql-suites/python-security-extended.qls \
--format=sarif-latest \
--output=results.sarif
特点:
- 🔬 完整构建数据库(类似编译器前端)
- 🌊 跨函数数据流追踪
- 🎯 高精度、低误报
- ⏱️ 跑全量通常 5-30 分钟
3.3 SARIF 解析与聚合
# 把 SARIF 转成可读 JSON
jq '.runs[].results[] | {ruleId, message: .message.text, location: .locations[0].physicalLocation.artifactLocation.uri}' results.sarif
# 用 Python SARIF 库处理
pip install sarif-tools
sarif diff results-v1.sarif results-v2.sarif # 对比两次扫描
sarif stats results.sarif # 统计
sarif html results.sarif --output report.html # HTML 报告
3.4 完整工作流(Trail of Bits 官方推荐)
Step 1: Semgrep 快速扫描(CI 必跑)
↓ 报警
Step 2: CodeQL 深度分析(Nightly / PR 重触发)
↓ 输出 SARIF
Step 3: SARIF Parsing 聚合 + 去重 + 分拣
↓ 生成 PR 评论 / Issue
Step 4: 按 CVE/CWE 严重度排序
↓
Step 5: 修复 → 二次扫描验证
四、CodeQL 子 Skill 深度解析
4.1 核心查询包
| 查询包 | 用途 |
|---|---|
codeql/python-queries | Python 安全查询(120+ 条) |
codeql/javascript-queries | JS/TS 安全查询(200+ 条) |
codeql/java-queries | Java 安全查询(150+ 条) |
codeql/go-queries | Go 安全查询(80+ 条) |
codeql/cpp-queries | C/C++ 安全查询(300+ 条) |
codeql/csharp-queries | C# 安全查询(90+ 条) |
codeql/ruby-queries | Ruby 安全查询(50+ 条) |
4.2 三个套件(Suite)
# 轻量级 - 快速跑
codeql/python-queries:codeql-suites/python-security.qls
# 扩展级 - 默认推荐
codeql/python-queries:codeql-suites/python-security-extended.qls
# 完整 - Nightly 跑
codeql/python-queries:codeql-suites/python-security-and-quality.qls
4.3 自定义 CodeQL 查询
// Custom: 检测所有未加密的数据库连接字符串
import javascript
from DataFlow::SourceNode source, DataFlow::SinkNode sink
where
source.getStringValue().regexpMatch(".*(mysql|postgres|mongodb)://.*password=.*")
and sink = source.getAEnclosingExpr().flow().getSink()
select sink, "Unencrypted database connection with password: $@", source
# 保存为 custom.ql,运行
codeql database analyze mydb custom.ql --format=sarif-latest
4.4 跨函数数据流示例
// 追踪 user input 到达 SQL 字符串拼接的路径
import python
import semmle.python.security.dataflow.SqlInjectionQuery
from SqlInjectionConfiguration cfg, DataFlow::PathNode source, DataFlow::PathNode sink
where cfg.hasFlowPath(source, sink)
select sink.getNode(), source, sink,
"SQL query constructed from $@.", source.getNode(),
"user-provided value"
输出包含完整数据流路径:source → 中间函数 → sink。
五、Semgrep 子 Skill 深度解析
5.1 Semgrep Registry 规则分类
| 类别 | 规则数 | 适用 |
|---|---|---|
p/security-audit | 100+ | 通用安全 |
p/secrets | 60+ | 硬编码凭证 |
p/owasp-top-ten | 80+ | OWASP Top 10 |
p/cwe-top-25 | 70+ | CWE Top 25 |
p/javascript | 200+ | JS 最佳实践 |
p/typescript | 150+ | TS 最佳实践 |
p/python | 200+ | Python 最佳实践 |
p/java | 100+ | Java |
p/golang | 100+ | Go |
p/rust | 80+ | Rust |
p/react | 100+ | React |
p/nodejs | 100+ | Node.js |
p/docker | 50+ | Dockerfile |
p/kubernetes | 60+ | K8s YAML |
5.2 编写自定义 Semgrep 规则
# rules/no-console-log.yaml
rules:
- id: no-console-log-in-production
message: "Remove console.log before production"
severity: WARNING
languages: [javascript, typescript]
metadata:
category: best-practice
cwe: "CWE-489: Active Debug Code"
pattern-either:
- pattern: console.log(...)
- pattern: console.error(...)
paths:
exclude:
- "**/*.test.*"
- "**/scripts/**"
# 跑自定义规则
semgrep --config rules/no-console-log.yaml .
5.3 Semgrep taint mode(数据流)
# rules/sql-injection.yaml
rules:
- id: python-flask-sql-injection
message: "Untrusted input flows into SQL query"
severity: ERROR
languages: [python]
frameworks: [flask]
mode: taint
pattern-sources:
- pattern: flask.request.args.get(...)
- pattern: flask.request.form.get(...)
pattern-sinks:
- pattern: |
$QUERY = f"...{$X}..."
$CURSOR.execute($QUERY)
pattern-sanitizers:
- pattern: psycopg2.sql.Identifier(...)
semgrep --config rules/sql-injection.yaml --json | jq '.results[].path'
5.4 Semgrep 性能优化
# 1. 排除 vendor 目录
semgrep --config=p/security-audit \
--exclude='node_modules' \
--exclude='vendor' \
--exclude='*.min.js' \
.
# 2. 并行扫描
semgrep --config=p/security-audit --jobs 8 .
# 3. 增量扫描(只扫变更)
semgrep --config=p/security-audit --diff .
# 4. 使用 baseline 抑制老报警
semgrep --config=p/security-audit . > current.json
# 后续扫描忽略已有
semgrep --config=p/security-audit . --baseline-commit=HEAD~10
六、SARIF Parsing 子 Skill 深度解析
6.1 什么是 SARIF
SARIF(Static Analysis Results Interchange Format)是 OASIS 标准的静态分析结果交换格式:
- JSON 格式
- 包含规则元数据 + 结果位置 + 数据流 + 严重度
- 工业级工具统一输出:CodeQL、Semgrep、Snyk、GitHub Code Scanning 等
6.2 SARIF 核心结构
{
"version": "2.1.0",
"$schema": "https://docs.oasis-open.org/sarif/sarif/v2.1.0/cos02/schemas/sarif-schema-2.1.0.json",
"runs": [
{
"tool": {
"driver": {
"name": "Semgrep",
"version": "1.45.0",
"rules": [
{
"id": "python.flask.security.audit.eval",
"name": "eval-injection",
"shortDescription": { "text": "Detected eval()" }
}
]
}
},
"results": [
{
"ruleId": "python.flask.security.audit.eval",
"level": "error",
"message": { "text": "Avoid using eval() with user input" },
"locations": [
{
"physicalLocation": {
"artifactLocation": { "uri": "src/api.py" },
"region": { "startLine": 42, "endLine": 42, "startColumn": 8 }
}
}
]
}
]
}
]
}
6.3 SARIF 处理工作流
# Python 处理 SARIF
import json
import sarif_om
with open("results.sarif") as f:
sarif = json.load(f)
# 按严重度分拣
severity_map = {"error": "Critical", "warning": "High", "note": "Medium"}
findings = []
for run in sarif["runs"]:
for result in run["results"]:
findings.append({
"rule": result["ruleId"],
"severity": severity_map.get(result["level"], "Low"),
"message": result["message"]["text"],
"file": result["locations"][0]["physicalLocation"]["artifactLocation"]["uri"],
"line": result["locations"][0]["physicalLocation"]["region"]["startLine"],
})
# 生成 Markdown 报告
with open("report.md", "w") as f:
f.write("# Static Analysis Report\n\n")
f.write(f"Total findings: {len(findings)}\n\n")
for sev in ["Critical", "High", "Medium", "Low"]:
sev_findings = [f for f in findings if f["severity"] == sev]
f.write(f"## {sev} ({len(sev_findings)})\n\n")
for fnd in sev_findings:
f.write(f"- **{fnd['rule']}** in `{fnd['file']}:{fnd['line']}`\n")
f.write(f" {fnd['message']}\n")
6.4 集成到 GitHub Code Scanning
# 把 SARIF 上传到 GitHub
gh code-scanning upload results.sarif --repo=myorg/myrepo
# 自动出现在 PR 的 Security 标签
# GitHub Actions 完整示例
name: Static Analysis
on: [push, pull_request]
jobs:
semgrep:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pip install semgrep
- run: semgrep --config=auto --sarif --output=semgrep.sarif .
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: semgrep.sarif
codeql:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- uses: github/codeql-action/init@v3
with:
languages: javascript, python
- uses: github/codeql-action/analyze@v3
with:
category: "/language:javascript"
七、真实踩坑案例
案例 1:CodeQL 数据库创建失败
现象:codeql database create 报 “no source code found”。
根因:项目根目录没有该语言代码,或路径配置错误。
解决:
# 确认语言支持
codeql resolve languages
# 显式指定源码根
codeql database create mydb \
--language=python \
--source-root=./src \
--overwrite
案例 2:Semgrep 在大型 monorepo 卡死
现象:扫描 1M+ 行 monorepo,半小时没结果。 根因:默认全量扫描 + 没排除 vendor。 解决:
semgrep --config=p/security-audit \
--exclude='**/node_modules/**' \
--exclude='**/dist/**' \
--exclude='**/build/**' \
--exclude='**/.next/**' \
--exclude='**/vendor/**' \
--max-target-bytes=10000000 \
--timeout=30 \
--jobs=4 \
.
案例 3:CodeQL 误报:log 语句被识别为密码泄漏
现象:logger.info("password reset") 被识别为硬编码密码。
根因:CodeQL 的 secrets 规则用正则匹配,没理解日志字符串语义。
解决:
// 自定义查询排除 logger 调用
import javascript
from StringLiteral s
where s.getValue().regexpMatch("(?i).*password.*")
and not exists(LoggerCall lc | lc.getAnArgument() = s)
select s, "Possible hardcoded password"
案例 4:SARIF 字段不统一
现象:不同工具的 SARIF 输出字段名不同,处理脚本不通用。
根因:SARIF 是标准但允许工具自定义字段。
解决:用 sarif-om 库规范化处理。
案例 5:CodeQL build step 失败
现象:Java 项目 CodeQL 创建数据库时 mvn package 失败。
根因:Maven build 引入了外部依赖,CI 环境网络受限。
解决:
# 用 CodeQL 的 autobuild(自动检测 build tool)
codeql database create mydb --language=java --source-root=.
# 或显式指定
codeql database create mydb \
--language=java \
--command="mvn -o clean package" \
--source-root=.
案例 6:Semgrep 规则冲突(多条同时命中)
现象:同一个漏洞被多条 Semgrep 规则同时报警。
根因:规则集重叠(p/owasp-top-ten 和 p/cwe-top-25 有交集)。
解决:
# 用 --severity 过滤
semgrep --config=p/owasp-top-ten --severity=ERROR --severity=WARNING .
# 或合并规则集
semgrep --config="p/security-audit;p/secrets" --severity=ERROR .
案例 7:CodeQL 跑全量 2 小时仍未结束
现象:C++ 项目 CodeQL 跑 2 小时卡住。 根因:C++ 数据库创建慢,全量查询包 300+ 条规则。 解决:
# 拆分:先跑 security 套件(轻量)
codeql database analyze mydb \
codeql/cpp-queries:codeql-suites/cpp-security.qls \
--threads=8 \
--timeout=600 \
--format=sarif-latest
# Nightly 才跑 full 套件
codeql database analyze mydb \
codeql/cpp-queries:codeql-suites/cpp-security-and-quality.qls \
--format=sarif-latest
案例 8:SARIF 报警爆炸(3000+ 报警)
现象:首次扫描报警 3000+ 条,无从下手。 根因:项目历史债务。 解决:
# 用 baseline 抑制老报警
semgrep ci --config=p/security-audit
# 首次跑会在 .semgrepbaseline 记录当前报警
# 后续 PR 只报警新增/变化的
八、性能与基准测试
8.1 扫描速度对比(10 万行代码)
| 工具 | 首次扫描 | 增量扫描 | 内存占用 |
|---|---|---|---|
| Semgrep | 30 秒 | 5 秒 | 200 MB |
| CodeQL (创建 DB) | 5 分钟 | 1 分钟 | 2 GB |
| CodeQL (分析) | 10 分钟 | 5 分钟 | 1.5 GB |
| SonarQube | 8 分钟 | 3 分钟 | 800 MB |
| Snyk Code | 1 分钟 | 20 秒 | 500 MB |
8.2 准确率对比(Trail of Bits 公开数据)
| 工具 | 召回率 | 精确率 | 误报率 |
|---|---|---|---|
| CodeQL | 85% | 90% | 10% |
| Semgrep | 70% | 75% | 25% |
| Snyk | 75% | 80% | 20% |
| SonarQube | 65% | 85% | 15% |
结论:CodeQL 适合”不漏报”场景,Semgrep 适合”快迭代”场景。
8.3 多语言支持对比
| 语言 | CodeQL | Semgrep |
|---|---|---|
| Python | ✅ | ✅ |
| JavaScript/TypeScript | ✅ | ✅ |
| Java | ✅ | ✅ |
| Go | ✅ | ✅ |
| C/C++ | ✅ | ✅ |
| C# | ✅ | ✅ |
| Ruby | ✅ | ✅ |
| Rust | ⚠️ 实验 | ✅ |
| Kotlin | ✅ | ✅ |
| Swift | ❌ | ✅ |
| Solidity | ❌ | ✅ |
| Bash | ❌ | ✅ |
| Dockerfile | ❌ | ✅ |
九、CI/CD 集成最佳实践
9.1 分层策略
┌─────────────────────────────────────────────┐
│ Pre-commit hook (本地, 1 秒) │
│ - Semgrep 极简规则 │
│ - 阻止明显问题入库 │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ PR 检查 (CI, 1-3 分钟) │
│ - Semgrep 增量扫描 │
│ - 失败门槛:新增 Critical/High │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ Nightly (Nightly, 10-30 分钟) │
│ - CodeQL 全量分析 │
│ - 报告到 Slack / Email │
│ - 不阻塞合并 │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ Weekly (深度, 1-2 小时) │
│ - 多工具 + 第三方扫描 │
│ - SBOM 生成 │
│ - 趋势分析 │
└─────────────────────────────────────────────┘
9.2 GitHub Actions 完整配置
name: Static Analysis
on:
pull_request:
push:
branches: [main]
schedule:
- cron: '0 2 * * *' # Nightly at 2 AM
jobs:
semgrep-pr:
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pip install semgrep
- name: Semgrep CI
run: semgrep ci --config=p/security-audit --error
env:
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
- uses: actions/upload-artifact@v4
if: always()
with:
name: semgrep-results
path: semgrep.sarif
codeql-nightly:
if: github.event_name == 'schedule'
runs-on: ubuntu-latest
permissions:
security-events: write
actions: read
contents: read
strategy:
matrix:
language: [javascript, python, go]
steps:
- uses: actions/checkout@v4
- uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
queries: security-and-quality
- uses: github/codeql-action/analyze@v3
with:
category: "/language:${{ matrix.language }}"
9.3 GitLab CI 配置
stages:
- test
- security
semgrep:
stage: security
image: returntocorp/semgrep:latest
script:
- semgrep --config=p/security-audit --sarif --output=gl-sast-semgrep.sarif .
artifacts:
reports:
sast: gl-sast-semgrep.sarif
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
codeql:
stage: security
image: github/codeql-action
script:
- codeql database create mydb --language=python --source-root=.
- codeql database analyze mydb codeql/python-queries:codeql-suites/python-security-extended.qls
--format=sarif-latest --output=gl-sast-codeql.sarif
artifacts:
reports:
sast: gl-sast-codeql.sarif
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
十、与其他安全工具对比
| 工具 | 类型 | 优势 | 劣势 | 适合 |
|---|---|---|---|---|
| Semgrep | 模式匹配 | 极快、易上手、规则丰富 | 深度有限 | CI / IDE / 快速反馈 |
| CodeQL | 语义分析 | 深度数据流、跨函数 | 慢、需编译 | 深度审计 |
| SonarQube | 全栈 | 长期跟踪、技术债务 | 重、贵 | 企业自建 |
| Snyk Code | 商业 SAST | 准确、零配置 | 闭源、贵 | 中小企业 |
| Veracode | 商业 SAST | 合规、审计 | 极贵、慢 | 大型金融 |
| Checkmarx | 商业 SAST | 完整、合规 | 极贵 | 大型企业 |
| GitHub Code Scanning | 托管 | 免费、CodeQL 集成 | 仅 GH | 开源 / GH 用户 |
十一、与 trailofbits 其他 Skills 配合
| Skill | 配合方式 |
|---|---|
| variant-analysis | 静态分析发现初始漏洞 → variant 横向排查同类 |
| security-differential-review | PR 审查用 SARIF 结果对比 |
| semgrep-rule-creator | 静态分析需要新规则时用 |
| audit-context-building | 静态分析前先理解架构 |
| insecure-defaults | 静态分析 + 默认配置审计互补 |
| fix-review | 修复后用静态分析验证 |
完整工作流:
audit-context-building (理解架构)
↓
static-analysis (发现初始漏洞)
↓
variant-analysis (横向排查同类)
↓
insecure-defaults (审计配置)
↓
fix (修复代码)
↓
fix-review (验证修复)
↓
security-differential-review (PR 审查)
十二、Q&A
Q: 必须订阅 Claude Code 吗? A: Skill 推荐 Claude Opus 4.6+。但工具本身(Semgrep、CodeQL)无需 Claude 即可独立使用。
Q: 误报率高吗? A: CodeQL 误报率约 10%,Semgrep 约 25%。可通过自定义规则、baseline 文件降低。
Q: 能修复吗?
A: 不会自动修改。Skill 输出建议,由人工修复或用 fix-review 验证。
Q: 私有项目能用吗? A: 工具本身(Semgrep、CodeQL CLI)完全本地运行,无需联网。Claude API 调用需考虑数据敏感。
Q: 中文支持? A: Skill 是英文,处理中文代码无障碍(变量名/注释可含中文)。
Q: 跑全量 CodeQL 太慢怎么办? A: 用增量扫描(只跑变更文件)、拆 suite、并行 threads。
Q: 怎么开始?
A: 先用 Semgrep --config=auto 跑一遍 5 分钟看效果,再决定是否引入 CodeQL。
Q: 跟 Snyk / Dependabot 重叠吗? A: Snyk/Dependabot 主要是依赖扫描(CVE),static-analysis 是代码扫描(漏洞模式)。两者互补。
十三、真实战绩(Trophy Case)
Trail of Bits 公开过多个实战发现:
- CodeQL 在 Ethereum 客户端中发现多个 Go 运行时漏洞
- Semgrep 自定义规则在数十个加密货币项目中找到 reentrancy
- CodeQL 数据流分析 揪出 ML-DSA 签名中的常量时间违规
- SARIF 聚合 帮助客户在 1000+ 仓库的 monorepo 中统一安全标准
十四、安装
# Claude Code
/plugin marketplace add trailofbits/skills
/plugin install static-analysis@trailofbits
# 通用
npx skills add trailofbits/skills --skill static-analysis
# 工具独立安装
pip install semgrep
codeql pack download codeql/python-queries
14.1 安装路径
- Claude Code:
~/.claude/plugins/marketplaces/trailofbits/skills/static-analysis/ - Cursor:
~/.cursor/skills/ - OpenCode:
~/.config/opencode/skills/
十五、8 条反合理化
| 借口 | 反驳 |
|---|---|
| ”我们用 ESLint / Pylint 就够了” | 它们是 lint,不查安全漏洞模式 |
| ”SAST 太慢,CI 跑不动” | Semgrep 30 秒可跑完,CodeQL 放 Nightly |
| ”误报太多,没人看” | 用 baseline 抑制老报警 + SARIF 分拣 |
| ”我们团队小,不需要” | 一个 SQL 注入就能搞垮整个公司 |
| ”商业 SAST 才有保障” | CodeQL + Semgrep 组合已覆盖 90% 场景 |
| ”CVE 修了就行” | CVE 是已知漏洞,SAST 还能查未知模式 |
| ”等出问题再说” | Log4Shell 那种 CVE,事后修太晚 |
| ”AI 写代码不会写漏洞” | arXiv 2602.05868 研究表明 39% AI 代码有漏洞 |
十六、5 条实战技巧
- Semgrep 跑 pre-commit:1 秒反馈,开发体验好
- CodeQL 跑 Nightly:深度不阻塞 PR
- SARIF 上传 GitHub:免费 Code Scanning 集成
- 建立 baseline:抑制老报警,只查新问题
- 持续维护规则集:根据业务加自定义规则
十七、总结
核心价值:
- 工业级 SAST 三件套打包(CodeQL + Semgrep + SARIF)
- 速度(Semgrep)与深度(CodeQL)兼顾
- 完整 CI/CD 集成
- 配套 Skills 形成完整安全工作流
适用人群:
- 所有需要安全审计的项目
- DevSecOps 团队
- 金融 / 医疗 / 政企(合规要求)
- 智能合约审计
- 大型 monorepo 维护者
投入产出比:⭐⭐⭐⭐⭐(5/5)—— 安全团队必装。
何时不要用:
- 纯前端 demo(无服务端)
- 一次性脚本
- 运行时漏洞(用 DAST / RASP)
- 第三方库漏洞(用 SCA / Snyk)
配套文档:variant-analysis 变体排查 | semgrep-rule-creator 规则编写 | security-differential-review PR审查 | 精选技能对比
参考资料
快速安装
pip install semgrep
```
克隆 Skill:
```bash
git clone https://github.com/trailofbits/skills.git
cp -r skills/static-analysis ~/.claude/skills/