variant-analysis
variant-analysis Skill 深度评测:CVE 横向排查的实战指南
评分明细
适用场景
variant-analysis 快速入门
当一个 CVE 公开,你的代码里可能藏着 5 个变体,这个 Skill 教 AI 助手 3 步把它们全部翻出来。
这是什么?解决什么问题?
variant-analysis 是 Trail of Bits 在 trailofbits/skills 仓库中开源的安全分析 Skill,核心目标是 CVE 横向排查(variant analysis)。它的思路来源于 2014 年 OpenSSL Heartbleed 事件后的实践:当某个 CVE 被披露后,光打补丁到自己代码里还不够,你还要排查整个代码库里是否存在“同一类漏洞模式的其他变体”。
举个真实案例。2021 年 Apache Log4j 的 Log4Shell(CVE-2021-44228)爆发后,大量企业只升级了直接依赖的 log4j-core,却忽略了自定义代码里 JndiLookup 的其他调用方式、第三方库中的传递依赖,以及自家写的相似字符串拼接代码。variant-analysis 正是用来回答:“这个漏洞的‘形状’是什么?我的代码里还有哪些地方长了类似形状?”
这个 Skill 会给 Agent 一套结构化方法论:先抽取漏洞的“最小特征签名”,再用 grep、AST 分析、Semgrep、CodeQL 之类的工具在全仓做相似度匹配,最后输出每个变体的风险评估。它能直接接入 Claude Code、Cursor、Aider 等主流 Agent 工具。
适合安全工程师、平台架构师、SRE、CTO,也适合想系统性学习漏洞分析模式的中高级开发者。
准备工作
- AI 编程 Agent:Claude Code、Cursor 或 Cline,任选其一。
- Git 仓库:本 Skill 需要在源码树上工作,推荐先
git init或git clone一份待审查的代码。 - 类 Unix 工具链:macOS 自带;Linux 自带;Windows 建议用 WSL2。Skill 内部依赖
grep、ripgrep、git grep。 - (可选) Semgrep:
pip install semgrep即可装好,本 Skill 推荐用它做模式匹配。 - (可选) CodeQL:CLI 可从 GitHub Releases 下载,适合大型仓库的深度扫描。
- CVE 信息来源:NVD、GitHub Advisory、OSV 任选其一,提供 CVE 编号或漏洞描述。
3 步快速上手
第 1 步:克隆 Skill 仓库
git clone https://github.com/trailofbits/skills.git
cd skills
ls skills/variant-analysis
你会看到 SKILL.md、examples/ 等文件。
第 2 步:让 Agent 加载 Skill
在项目根目录创建 CLAUDE.md:
# CLAUDE.md
Before searching for variants of a CVE, read the SKILL.md inside
trailofbits/skills/skills/variant-analysis/. Follow its extraction →
expansion → assessment workflow strictly.
在 Cursor 中,你也可以把 SKILL.md 内容直接拖进 .cursorrules,效果一致。
第 3 步:用 Skill 跑第一次变体排查
在对话里向 Agent 提供一个具体 CVE,例如:
已知漏洞:CVE-2024-3094(xz-utils 后门),攻击者通过编译脚本注入。 请使用 variant-analysis Skill,在我的代码库里查找所有“构建脚本中通过 ld_preload 注入动态库”的可疑模式。
Agent 会:
- 提取签名:把 xz 后门的“最小特征”抽象成“修改构建脚本 + 注入动态库 + 修改校验”三件事;
- 扩展变体:在代码库里搜 “
./configure改动”、“LD_PRELOAD引用”、“运行时动态库加载”等; - 评估风险:对每条命中给严重性标签(Critical/High/Medium/Info),并列出文件路径与行号。
常见踩坑
- 只搜 CVE 编号本身的字符串:变体通常换了函数名,纯字符串搜索会漏掉绝大多数命中。Skill 会要求 Agent 抽象特征,而不是逐字 grep。
- 忽略测试代码与样例代码:很多漏洞在
examples/或__tests__/中重现,别忘了把扫描范围包含进去。 - 结果未带文件:行号:Agent 经常返回“一段描述”,你要明确要求它把“文件名 + 行号”带上,否则后续修复工作会非常痛苦。
- 过度匹配:把任何“调用了动态库”的代码都标成 Critical,会导致噪音太多。Skill 提供严重性分级表,记得让 Agent 严格按它打分。
- 没区分一阶与传递依赖:CVE 影响的是某个 npm/pip 包,你应当让 Agent 把搜索范围分两段——直接调用方和间接调用方,否则会看漏。
- 没看 git blame:有些“变体”是最近引入的,只搜当前 HEAD 会漏掉旧分支里的问题,Skill 提示要把 git 历史纳入分析。
初级用法
1. 对单个函数做变体排查
当你修改了某个加密函数,担心全仓还有相似实现:
我刚把
sha1替换成sha256,请用 variant-analysis Skill 找出所有还在调用sha1的位置,包括测试代码。
2. 配合 Semgrep 自动生成规则
semgrep --config p/security-audit --json > semgrep.json
让 Agent 读取 semgrep.json 并按 variant-analysis 的格式输出“已修复的 vs 待修复的变体清单”。
3. 在 PR 评审里加变体检查项
在 PR 模板里追加:
- [ ] 本次修改的漏洞模式已用 variant-analysis 排查过变体
- [ ] 所有变体已在新提交中修复或显式 ignore
高级玩法
1. 跨仓库联合扫描
把 Skill 提示词交给一个扫描 Agent,让它遍历 GitHub Org 下所有仓库,找出同一漏洞模式的全部分布,生成 dashboard 数据源。
2. 与 Semgrep 规则自动生成闭环
# 1. 拿一次变体结果
# 2. 提炼成 Semgrep 规则
# 3. 把规则沉淀到团队 registry
semgrep scan --config custom/rule.yaml
这样下次新引入的代码如果再出现相同模式,CI 会直接拦截。
3. 与威胁情报源联动
把 NVD / GitHub Advisory / OSV 的最新公告接入 Agent,触发自动 variant-analysis 任务,实现“漏洞公告即扫描”的流水线。
小技巧
- 把漏洞描述抽象成谓词:不只搜“Log4j”,而搜“任何把用户输入拼进 JNDI lookup 字符串的代码”。
- 优先关注 sink(危险点),不是 source(数据来源):sink 数量通常更少,排查更快。
- 让 Agent 输出 CSV:方便你直接导入 Jira / Excel 做后续跟踪。
- 用
--depth 1加快 git 拉取:本 Skill 不需要历史提交时,浅克隆够用。 - 扫描后给团队做 30 分钟分享:变体结果是最好的安全培训素材。
常见问题 FAQ
Q1: 这个 Skill 跟 variant-analysis 有什么关系?必须装吗?
A: Skill 是给 AI Agent 用的”技能包”,能告诉 Agent 怎么按特定规范工作。不是必须装——如果你的项目规模小、要求不高,不装也能用。但装上能让 Agent 输出的质量更高、更符合最佳实践,推荐装。
Q2: 这个 Skill 适合哪些 AI Agent?Cursor?Claude Code?其他?
A: variant-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: 取决于 variant-analysis 的许可证。常见许可证包括 MIT(完全自由)、Apache-2.0(自由但有专利条款)、源可用(可看不能用)、GPL(强开源)。商用前请查仓库 LICENSE 文件。
参考链接
- Trail of Bits Skills 仓库:https://github.com/trailofbits/skills
- variant-analysis 子目录:https://github.com/trailofbits/skills/tree/main/skills/variant-analysis
- Semgrep 官方文档:https://semgrep.dev/docs/
- CodeQL 入门:https://codeql.github.com/docs/
- NVD CVE 数据库:https://nvd.nist.gov/
- Trail of Bits “变体分析”博客:https://blog.trailofbits.com/2020/11/06/variant-analysis-101/
- OWASP Top 10:https://owasp.org/Top10/
本文基于官方文档和公开资料整理,AI辅助生成,MagicNetWorld 尚未完成独立实测。如有错误或过时信息,请通过 contact@magicnetworld.com 反馈。
variant-analysis Skill 多维度简评
类别:安全工具 / 漏洞排查 仓库:trailofbits/skills 维护者:Trail of Bits(全球顶级安全公司,审计过 Uniswap、Solana、OpenZeppelin)
一、核心定位与价值
CVE 爆出来后,所有安全团队都会问同一个问题:
“我们项目里有没有类似漏洞模式?”
variant-analysis Skill 就是专门用来回答这个问题的——它在全仓库搜索相似漏洞模式。
它是 Trail of Bits 14 个安全 Skill 中应急响应场景的第一选择。
二、核心能力
2.1 模式识别
不是简单的字符串匹配,而是代码模式识别:
- 同一类 API 的不安全调用
- 同一类反序列化漏洞
- 同一类注入点
- 同一类权限检查缺失
2.2 跨语言支持
虽然 Trail of Bits 主要关注 Rust / Solidity / C/C++,但 variant-analysis 思路适用于:
- Python(pickle / eval / SQL)
- JavaScript(eval / dangerouslySetInnerHTML)
- Java(反序列化)
- Go(unsafe.Pointer)
- 任意语言
2.3 历史 commit 扫描
可以扫描 git 历史找出:
- 曾经出现过的漏洞模式
- 后来被”修复”但修复不完整的情况
- 曾经的 hardcode 凭证
三、5 步标准流程
根据 Trail of Bits 官方 SKILL.md:
Step 1: 理解原始问题
在搜索之前,深入理解已知 Bug:
- 根因是什么? 不是症状,而是为什么有漏洞
- 需要什么条件? 控制流、数据流、状态
- 什么使其可被利用? 用户可控、缺少验证等
Step 2: 创建精确匹配
从只匹配已知实例的模式开始:
rg -n "exact_vulnerable_code_here"
验证:是否只匹配到一个位置(原始问题所在)?
Step 3: 识别抽象点
| 元素 | 保持具体 | 可抽象 |
|---|---|---|
| 函数名 | 如果 Bug 独有 | 如果模式适用于函数族 |
| 变量名 | 从不 | 始终使用元变量 |
| 字面值 | 如果值重要 | 如果任何值触发 Bug |
| 参数 | 如果位置重要 | 使用 ... 通配符 |
Step 4: 迭代泛化
每次只改变一个元素:
- 运行模式
- 审查所有新匹配
- 分类:真阳性还是假阳性?
- 如果假阳性率可接受,泛化下一个元素
- 如果假阳性率太高,回退并尝试不同的抽象
当假阳性率超过约 50% 时停止。
Step 5: 分析和分级结果
对每个匹配进行文档记录:位置、风险评级、修复建议。
四、与 SAST 工具对比
| 维度 | variant-analysis Skill | 传统 SAST |
|---|---|---|
| 触发 | CVE 爆出后人工触发 | CI 自动跑 |
| 范围 | 特定 CVE 模式 | 全规则集 |
| 精度 | 高(聚焦一种模式) | 中(大量误报) |
| 速度 | 快(聚焦搜索) | 慢(全量扫描) |
| 输出 | 风险评估 + 修复建议 | 仅 finding 列表 |
| 理解深度 | AI 理解语义 | 规则匹配 |
| 人工介入 | 需要 | 几乎不需要 |
最佳实践:两者结合
- CI 用 SAST(自动化)
- CVE 爆出用 variant-analysis(精准定位)
五、变体识别能力深度解析
5.1 字符串匹配 vs 变体识别
| 漏洞特征 | 字符串匹配能找到的 | variant-analysis 额外找到的 |
|---|---|---|
| log4j 漏洞 | ${jndi:ldap://...} | getJndiLookup().lookup()、动态拼接的 JNDI URL |
| SQL 注入 | query = "..." + input | ORM 框架的 raw query、GraphQL 拼接、动态 LINQ |
| 路径穿越 | path = "../" + userInput | 经过归一化但被绕过、URL 编码变体 |
| 硬编码凭证 | password = "xxx" | 环境变量回退、配置文件加密但默认密码 |
5.2 变体识别技术
1. 抽象语法树(AST)匹配
def detect_variants(ast):
dangerous = []
for call in ast.find_all(Call):
if is_jndi_call(call):
arg = call.args[0]
if is_user_controlled(arg):
dangerous.append(call)
return dangerous
2. 数据流分析 — 追踪用户输入到危险调用的路径
3. 控制流分析 — 检查 sanitize 函数是否真正安全
4. AI 模式理解 — 用 LLM 理解”等价但不同写法的漏洞”
六、安装
# Claude Code
/plugin marketplace add trailofbits/skills
/plugin install variant-analysis@trailofbits
# 通用
npx skills add trailofbits/skills --skill variant-analysis
七、与其他安全 Skill 配合
| Skill | 何时切换 |
|---|---|
| variant-analysis | CVE 爆出后横向排查 |
| differential-review | PR 安全审查 |
| static-analysis | CI 自动扫描 |
| fix-review | 修复后验证 |
八、5 条实战技巧
- CVE 编号必带:搜索时附
CVE-XXXX-XXXXX - 提供 PoC 链接:让 Skill 理解漏洞模式
- 限定语言/框架:缩小搜索范围
- 先 Critical 再 High:风险分级处理
- 保留扫描记录:合规证据
九、Q&A
Q: 误报率高吗? A: 比 SAST 低,因为是聚焦搜索 + AI 理解。
Q: 能跑本地代码吗? A: 能。git clone 后直接跑。
Q: 跨项目怎么排查? A: 多次执行 variant-analysis,每次指定不同仓库。
Q: 输出格式? A: Markdown 报告,可导出为 PDF。
本文基于官方文档和公开资料整理,未经过 MagicNetWorld 实测。
参考资料
- trailofbits/skills GitHub 仓库 — 官方仓库(5.7K+ stars)
- variant-analysis Skill 官方页面 — Trail of Bits 官网
- variant-analysis SKILL.md 源码 — 官方 Skill 定义
- Trail of Bits 官方博客 — 安全研究和审计案例
- awesome-claude-skills: Trail of Bits — 社区收录
快速安装
git clone https://github.com/trailofbits/skills.git
cd skills
ls skills/variant-analysis