用途
该技能用于把已有的 Semgrep 规则移植(port)到新的目标语言,生成语言特定的规则变体,并带有适用性分析与测试驱动验证。它适合:将现有规则移植到一个或多个目标语言;为通用漏洞模式创建语言特定变体;在多语言代码库中扩展规则覆盖范围;在具有等价构造的语言之间翻译规则。
不适合用于:从零创建新的 Semgrep 规则(应改用 semgrep-rule-creator);用现有规则扫描代码;漏洞模式在目标语言中根本不适用的情况;同一语言内的细微语法差异。
输入与输出
输入要求:
- 已有的 Semgrep 规则——YAML 文件路径或 YAML 规则内容。
- 目标语言——一个或多个要移植到的语言(例如“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。
限制
该技能不用于从零创建新规则、运行现有规则扫描代码、漏洞模式根本不适用的语言,或同一语言内的细微语法差异。具体功能范围、收费、价格、平台与效果等事实以原始资料为准,未在资料中提供的信息暂未提供。
引用文档
以下为作者声明的引用来源,保留指定版本、署名和许可。
- trailofbits/skills/plugins/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/SKILL.md — 署名:Trail of Bits;许可:CC-BY-SA-4.0;版本:
5c15f4f5644b4bd3d48882a802a7232d501852b6。