Semgrep规则变体创建器Skill semgrep-rule-variant-creator

这个技能用于将现有的Semgrep安全规则移植到新的编程语言,通过适用性分析和测试驱动验证,确保漏洞检测规则在多语言环境中的准确性和有效性。关键词:Semgrep, 规则移植, 安全测试, 代码分析, 漏洞挖掘, 多语言支持, 静态分析

漏洞挖掘 0 次安装 0 次浏览 更新于 3/14/2026

name: semgrep-rule-variant-creator description: 创建现有Semgrep规则的语言变体。用于将Semgrep规则移植到指定的目标语言。以现有规则和目标语言作为输入,为每种语言生成独立的规则+测试目录。 allowed-tools:

  • Bash
  • Read
  • Write
  • Edit
  • Glob
  • Grep
  • WebFetch

Semgrep规则变体创建器

将现有Semgrep规则移植到新的目标语言,进行适当的适用性分析和测试驱动验证。

何时使用

理想场景:

  • 将现有Semgrep规则移植到一个或多个目标语言
  • 创建通用漏洞模式的语言特定变体
  • 在多语言代码库中扩展规则覆盖范围
  • 在具有等效结构的语言之间翻译规则

何时不使用

不要使用此技能用于:

  • 从头创建新的Semgrep规则(使用semgrep-rule-creator代替)
  • 对代码运行现有规则
  • 漏洞模式在根本上不适用于的语言
  • 同一语言内的次要语法变体

输入规范

此技能需要:

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

输出规范

对于每个适用的目标语言,产生:

<原始规则ID>-<语言>/
├── <原始规则ID>-<语言>.yaml     # 移植的Semgrep规则
└── <原始规则ID>-<语言>.<ext>    # 带注释的测试文件

移植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

拒绝的合理化

当移植Semgrep规则时,拒绝这些常见捷径:

合理化 为何失败 正确方法
“模式结构相同” 不同语言间的AST不同 始终为目标语言转储AST
“相同漏洞,相同检测” 语言间的数据流不同 分析目标语言惯用语
“规则不需要测试,因为原始规则有效” 语言边缘情况不同 为目标语言编写新测试案例
“跳过适用性 - 它显然适用” 有些模式是语言特定的 首先完成适用性分析
“我将创建所有变体然后测试” 错误复合,难以调试 每种语言完成完整周期
“库等效足够接近” 表面相似隐藏差异 验证API语义匹配
“只是1:1翻译语法” 语言有不同的惯用语 研究目标语言模式

严格级别

此工作流程是严格的 - 不要跳过步骤:

  • 适用性分析是强制性的:不要假设模式翻译
  • 每种语言是独立的:在移动到下一种语言之前完成完整周期
  • 每种变体的测试优先:从不写没有测试案例的规则
  • 需要100%测试通过:“大多数测试通过”是不可接受的

概述

此技能指导创建现有Semgrep规则的语言特定变体。每个目标语言通过独立的4阶段周期:

FOR EACH target language:
  Phase 1: 适用性分析 → 裁决
  Phase 2: 测试创建(测试优先)
  Phase 3: 规则创建
  Phase 4: 验证
  (在移动到下一种语言之前完成完整周期)

基础知识

semgrep-rule-creator技能是Semgrep规则创建基础的权威参考。 虽然此技能专注于将现有规则移植到新语言,但编写质量规则的核心原则相同。

参考semgrep-rule-creator以获取指导:

  • 何时使用污点模式与模式匹配 - 为漏洞类型选择正确方法
  • 测试优先方法论 - 为何测试先于规则以及如何编写有效测试案例
  • 要避免的反模式 - 常见错误,如过于宽泛或过于具体的模式
  • 迭代直到测试通过 - 验证循环和调试技术
  • 规则优化 - 在测试通过后移除冗余模式

当移植规则时,你在新的语言上下文中应用这些相同原则。如果不确定规则结构或方法,请先参考semgrep-rule-creator

四阶段工作流程

阶段1:适用性分析

在移植之前,确定模式是否适用于目标语言。

分析标准:

  1. 目标语言中是否存在漏洞类?
  2. 是否存在等效构造(函数、模式、库)?
  3. 语义是否足够相似以进行有意义的检测?

裁决选项:

  • APPLICABLE → 进行变体创建
  • APPLICABLE_WITH_ADAPTATION → 进行但需要显著更改
  • NOT_APPLICABLE → 跳过此语言,记录原因

参见applicability-analysis.md以获取详细指导。

阶段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:规则创建

  1. 分析ASTsemgrep --dump-ast -l <lang> test-file
  2. 翻译模式为目标语言语法
  3. 更新元数据:语言键、消息、规则ID
  4. 适应惯用语:处理语言特定构造

参见language-syntax-guide.md以获取翻译指导。

阶段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

参见workflow.md以获取详细工作流程和故障排除。

快速参考

任务 命令
运行测试 semgrep --test --config rule.yaml test-file
验证YAML semgrep --validate --config rule.yaml
转储AST semgrep --dump-ast -l <lang> <file>
调试污点流 semgrep --dataflow-traces -f rule.yaml file

与规则创建的关键差异

方面 semgrep-rule-creator 此技能
输入 错误模式描述 现有规则 + 目标语言
输出 单规则+测试 多规则+测试目录
工作流程 单创建周期 每种语言独立周期
阶段1 问题分析 每种语言的适用性分析
库研究 总是相关 可选(当原始使用库时)

文档

必需:在移植规则之前,阅读相关Semgrep文档:

下一步