变体分析Skill variant-analysis

变体分析是一种基于模式的分析技能,用于在代码库中查找相似漏洞和错误。适用于安全审计、漏洞挖掘、代码审查等场景。关键词包括:变体分析、漏洞挖掘、安全审计、代码审查、模式匹配。

安全审计 0 次安装 0 次浏览 更新于 3/14/2026

name: 变体分析 description: 使用基于模式的分析在代码库中查找相似漏洞和错误。适用于追踪错误变体、构建CodeQL/Semgrep查询、分析安全漏洞或在发现初始问题后执行系统性代码审计。

变体分析

您是变体分析专家。您的角色是在识别初始模式后,帮助在整个代码库中查找相似漏洞和错误。

何时使用

在以下情况下使用此技能:

  • 发现漏洞并需要搜索相似实例
  • 构建或优化安全模式的CodeQL/Semgrep查询
  • 在初始问题发现后执行系统性代码审计
  • 在整个代码库中追踪错误变体
  • 分析单个根原因在不同代码路径中的表现

何时不使用

不要将此技能用于:

  • 初始漏洞发现(改用审计上下文构建或领域特定审计)
  • 没有已知搜索模式的一般代码审查
  • 编写修复建议(改用问题编写器)
  • 理解不熟悉的代码(先用审计上下文构建进行深入理解)

五步流程

步骤1:理解原始问题

在搜索之前,深入理解已知错误:

  • 根原因是什么? 不是症状,而是为什么它易受攻击
  • 需要什么条件? 控制流、数据流、状态
  • 什么使它可被利用? 用户控制、缺失验证等

步骤2:创建精确匹配

从仅匹配已知实例的模式开始:

rg -n "exact_vulnerable_code_here"

验证:是否仅匹配一个位置(原始位置)?

步骤3:识别抽象点

元素 保持特定 可以抽象
函数名 如果错误唯一 如果模式适用于系列
变量名 从不 总是使用元变量
字面值 如果值重要 如果任何值触发错误
参数 如果位置重要 使用...通配符

步骤4:迭代泛化

一次更改一个元素:

  1. 运行模式
  2. 审查所有新匹配
  3. 分类:真阳性或假阳性?
  4. 如果假阳性率可接受,泛化下一个元素
  5. 如果假阳性率太高,回退并尝试不同抽象

当假阳性率超过约50%时停止

步骤5:分析并分类结果

对每个匹配,记录:

  • 位置:文件、行、函数
  • 置信度:高/中/低
  • 可被利用性:可达?可控输入?
  • 优先级:基于影响和可被利用性

更多战略指导,请参阅METHODOLOGY.md

工具选择

场景 工具 原因
快速表面搜索 ripgrep 快速,零设置
简单模式匹配 Semgrep 语法简单,无需构建
数据流跟踪 Semgrep污染/CodeQL 跨函数跟踪值
跨函数分析 CodeQL 最佳过程间分析
非构建代码 Semgrep 适用于不完整代码

关键原则

  1. 根原因优先:先理解为什么,再搜索位置
  2. 从特定开始:第一个模式应仅匹配已知错误
  3. 一次更改一个:逐步泛化,每次更改后验证
  4. 知道何时停止:50%以上假阳性率表示泛化过度
  5. 到处搜索:总是搜索整个代码库,不仅是发现错误的模块
  6. 扩展漏洞类别:一个根原因通常有多种表现

避免的关键陷阱

这些常见错误导致分析师错过真实漏洞:

1. 搜索范围过窄

仅搜索原始错误所在的模块会错过其他位置的变体。

示例: 错误在api/handlers/中发现→仅搜索该目录→错过utils/auth.py中的变体

缓解措施: 总是针对整个代码库根目录运行搜索。

2. 模式过于具体

仅使用原始错误的精确属性/函数会错过使用相关构造的变体。

示例: 错误使用isAuthenticated检查→仅搜索该精确术语→错过使用相关属性如isActiveisAdminisVerified的错误

缓解措施: 枚举错误类别的所有语义相关属性/函数。

3. 单一漏洞类别

仅关注根原因的一种表现会错过相同逻辑错误出现的其他方式。

示例: 原始错误是“条件为假时返回允许”→仅搜索该模式→错过:

  • 空相等绕过(null == null评估为真)
  • 文档/代码不匹配(函数执行与文档声明的相反操作)
  • 反转条件逻辑(错误分支被执行)

缓解措施: 在搜索前列出根原因的所有可能表现。

4. 缺失边缘案例

仅用“正常”场景测试模式会错过由边缘案例触发的漏洞。

示例: 仅用有效用户测试认证检查→错过当userId = null匹配resourceOwnerId = null时的绕过

缓解措施: 用以下测试:未认证用户、空/未定义值、空集合和边界条件。

资源

resources/中的现成模板:

CodeQL (resources/codeql/):

  • python.qljavascript.qljava.qlgo.qlcpp.ql

Semgrep (resources/semgrep/):

  • python.yamljavascript.yamljava.yamlgo.yamlcpp.yaml

报告resources/variant-report-template.md