SuperAPI AI 工具集

semgrep-rule-variant-creator

安全与审计

查看项目

更新于 10-16 23:14

技能介绍

用途

该技能用于把已有的 Semgrep 规则移植(port)到新的目标语言,生成语言特定的规则变体,并带有适用性分析与测试驱动验证。它适合:将现有规则移植到一个或多个目标语言;为通用漏洞模式创建语言特定变体;在多语言代码库中扩展规则覆盖范围;在具有等价构造的语言之间翻译规则。

不适合用于:从零创建新的 Semgrep 规则(应改用 semgrep-rule-creator);用现有规则扫描代码;漏洞模式在目标语言中根本不适用的情况;同一语言内的细微语法差异。

输入与输出

输入要求:

  1. 已有的 Semgrep 规则——YAML 文件路径或 YAML 规则内容。
  2. 目标语言——一个或多个要移植到的语言(例如“Golang 和 Java”)。

输出:对每个适用的目标语言,生成一个目录,结构如下:

<original-rule-id>-<language>/
├── <original-rule-id>-<language>.yaml     # Ported Semgrep rule
└── <original-rule-id>-<language>.<ext>    # Test file with annotations

例如把 sql-injection 移植到 Go 和 Java:

sql-injection-golang/
├── sql-injection-golang.yaml
└── sql-injection-golang.go

sql-injection-java/
├── sql-injection-java.yaml
└── sql-injection-java.java

严格性要求

该工作流为严格模式,不能跳过步骤:适用性分析是强制性的,不能假设模式可以翻译;每个语言相互独立,完成完整周期后再处理下一个;每个变体测试先行,没有测试用例就不要写规则;要求测试 100% 通过,“大多数测试通过”不可接受。

需要拒绝的常见简化理由包括:认为“模式结构完全相同”(但不同语言的 AST 不同,应始终为目标语言 dump AST);认为“同一漏洞、同样检测”(但数据流在不同语言间不同,应分析目标语言惯用法);认为“原规则测试过,新规则不需要测试”(但语言边界情况不同,应为目标语言编写新测试);跳过适用性分析(某些模式是语言特定的,应先完成适用性分析);先创建所有变体再测试(错误会累积、难以调试,应每个语言完整走完周期);认为“库等价物足够接近”(表面相似会掩盖差异,应验证 API 语义一致);“直接 1:1 翻译语法”(不同语言有不同惯用法,应研究目标语言模式)。

四阶段工作流

对每个目标语言独立执行:阶段 1 适用性分析 → 阶段 2 测试创建(测试先行)→ 阶段 3 规则创建 → 阶段 4 验证,完成整个周期后再进入下一个语言。

阶段 1:适用性分析。在移植前判断模式是否适用于目标语言。分析标准:该漏洞类别是否存在于目标语言?是否存在等价构造(函数、模式、库)?语义是否足够相似以进行有意义的检测?结论选项:APPLICABLE 继续创建变体;APPLICABLE_WITH_ADAPTATION 继续但需重大修改;NOT_APPLICABLE 跳过该语言并记录原因。

阶段 2:测试创建(测试先行)。始终先写测试再写规则。使用目标语言惯用法创建测试文件:至少 2 个漏洞用例(ruleid:),至少 2 个安全用例(ok:),并包含语言特定的边界情况。示例:

// ruleid: sql-injection-golang
db.Query("SELECT * FROM users WHERE id = " + userInput)

// ok: sql-injection-golang
db.Query("SELECT * FROM users WHERE id = ?", userInput)

阶段 3:规则创建。分析 AST:semgrep --dump-ast -l <lang> test-file;将模式翻译为目标语言语法;更新元数据(language 键、message、规则 ID);针对惯用法进行适配,处理语言特定构造。

阶段 4:验证。校验 YAML:semgrep --validate --config rule.yaml;运行测试:semgrep --test --config rule.yaml test-file。检查点:输出必须显示 All tests passed。调试污点规则:semgrep --dataflow-traces -f rule.yaml test-file。

与从零创建规则的区别

比较维度:输入方面,semgrep-rule-creator 是 bug 模式描述,本技能是已有规则加目标语言;输出方面,前者是单个规则加测试,本技能是多个规则加测试目录;工作流方面,前者是单个创建周期,本技能是每个语言独立周期;阶段 1 方面,前者是问题分析,本技能是每个语言的适用性分析;库研究方面,前者始终相关,本技能为可选(当原规则使用库时)。

参考文档与快速命令

移植前需要阅读相关 Semgrep 文档:Rule Syntax、Pattern Syntax、Pattern Examples、Testing Rules,以及 Trail of Bits Testing Handbook 的高级模式。 快速参考命令:运行测试 semgrep --test --config rule.yaml test-file;校验 YAML semgrep --validate --config rule.yaml;dump AST semgrep --dump-ast -l <lang> <file>;调试污点流 semgrep --dataflow-traces -f rule.yaml file。

限制

该技能不用于从零创建新规则、运行现有规则扫描代码、漏洞模式根本不适用的语言,或同一语言内的细微语法差异。具体功能范围、收费、价格、平台与效果等事实以原始资料为准,未在资料中提供的信息暂未提供。

引用文档

以下为作者声明的引用来源,保留指定版本、署名和许可。

作者的来源声明