用途:把一条已有的 Semgrep 规则移植到一个或多个目标语言,生成语言专用的变体规则,并为每种语言输出规则 YAML 与带注解的测试文件。不适用于从零创建新规则(应使用 semgrep-rule-creator)、运行已有规则、或该漏洞模式在目标语言根本不成立的情况。
必要输入:已有 Semgrep 规则的 YAML 路径或内容,以及一个或多个目标语言。
主要能力与工作流:对每种目标语言独立执行完整四阶段循环,且一种语言完成后再进行下一种。
- 适用性分析:判断该漏洞类、等价构造与语义在目标语言是否存在,结论为 APPLICABLE、APPLICABLE_WITH_ADAPTATION 或 NOT_APPLICABLE(后者需记录原因并跳过)。
- 测试先行:用目标语言习惯写法编写测试,至少 2 个漏洞用例(ruleid:)和 2 个安全用例(ok:),包含语言特有的边界情况。
- 规则创建:先用 semgrep --dump-ast -l <lang> test-file 分析 AST,再翻译模式,更新 language、message、规则 ID 等元数据,并适配目标语言惯用法。
- 验证:必须全部测试通过。
常用命令: semgrep --validate --config rule.yaml semgrep --test --config rule.yaml test-file semgrep --dump-ast -l <lang> <file> semgrep --dataflow-traces -f rule.yaml test-file
输出结构示例:sql-injection-golang/sql-injection-golang.yaml 与 .go 测试文件;sql-injection-java/ 下同理为 .yaml 与 .java。
限制与要求:流程严格,不得跳过步骤;禁止“模式结构相同”“库等价物足够接近”“先建完所有变体再测试”等捷径假设。必须为每个变体新写测试,要求 100% 测试通过。创建规则的核心原则以 semgrep-rule-creator 为准(taint 与模式匹配选择、测试先行、反模式、迭代与优化)。若缺少必要输入、权限、安全边界或成功标准,应停下请求澄清;输出不能替代针对具体环境的验证、测试或专家审查。