关于 semgrep-rule-creator
用于创建和验证 Semgrep 规则的技能,面向编写自定义安全或代码模式检查的开发者。其测试优先流程涵盖模式匹配或污点分析、AST 检查、迭代和最终验证。
主要功能
- 01选择污点分析或模式匹配
- 02先编写测试再写规则
- 03检查 AST 结构
- 04迭代直至所有测试通过
- 05验证通过后再优化
- 06每个规则使用一个 YAML 文件
适用场景
- 01检测代码库中的特定漏洞
- 02为不安全数据流创建污点规则
- 03使用自定义规则强制执行编码规范
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ waybarrios/ opencode-power-pack --skill semgrep-rule-creator安装后在 Claude Code 中输入/semgrep-rule-creator确认已加载。
附带文件references/quick-reference.mdreferences/workflow.md
详细介绍
Semgrep 规则创建器
创建具有适当测试和验证的生产级 Semgrep 规则。
适用场景
理想场景:
- 针对特定错误模式编写 Semgrep 规则
- 编写用于检测代码库中安全漏洞的规则
- 编写用于检测数据流漏洞的污点模式规则
- 编写用于强制执行编码规范的规则
不适用场景
请勿将此技能用于:
- 运行现有 Semgrep 规则集
- 不使用自定义规则进行常规静态分析(请使用
static-analysis技能)
应避免的借口
编写 Semgrep 规则时,请避免以下常见捷径:
- “模式看起来很完整” → 仍须运行
semgrep --test --config <rule-id>.yaml <rule-id>.<ext>进行验证。未经测试的规则可能暗藏误报或漏报。 - “它能匹配易受攻击的情况” → 匹配漏洞只完成了一半工作。请确认安全情况不会匹配(误报会损害信任)。
- “对这个问题使用污点模式太复杂了” → 如果数据从用户输入流向危险接收点,污点模式比模式匹配更精准。
- “一个测试就够了” → 请包含边缘情况:不同的编码风格、经过净化的输入、安全替代方案和边界条件。
- “我先优化模式” → 先编写正确的模式,通过所有测试后再进行优化。过早优化会导致回归。
- “AST 转储太复杂了” → AST 能准确展示 Semgrep 如何解析代码。跳过这一步会导致模式无法匹配语法变体。
反模式
范围过广——匹配所有内容,无法有效检测:
# BAD: Matches any function call
pattern: $FUNC(...)
# GOOD: Specific dangerous function
pattern: eval(...)
测试中缺少安全情况——导致误报未被发现:
# BAD: Only tests vulnerable case
# ruleid: my-rule
dangerous(user_input)
# GOOD: Include safe cases to verify no false positives
# ruleid: my-rule
dangerous(user_input)
# ok: my-rule
dangerous(sanitize(user_input))
# ok: my-rule
dangerous("hardcoded_safe_value")
模式过于具体——无法匹配各种变体:
# BAD: Only matches exact format
pattern: os.system("rm " + $VAR)
# GOOD: Matches all os.system calls with taint tracking
mode: taint
pattern-sinks:
- pattern: os.system(...)
严格程度
此工作流要求严格执行——不得跳过步骤:
- 先阅读文档:编写 Semgrep 规则前,请参阅文档
- 必须先编写测试:不得在没有测试的情况下编写规则
- 测试通过率必须达到 100%:“大部分测试通过”不可接受
- 最后进行优化:只有全部测试通过后才能简化模式
- 避免通用模式:规则必须具体,不得匹配范围过广的模式
- 优先使用污点模式:适用于数据流漏洞
- 一个 YAML 文件对应一条 Semgrep 规则:每个 YAML 文件只能包含一条 Semgrep 规则;不得在单个文件中合并多条规则
- 禁止通用规则:针对特定语言编写 Semgrep 规则时,避免使用通用模式匹配(
languages: generic) - 禁止使用
todook和todoruleid测试注释:禁止在测试文件中使用todoruleid: <rule-id>和todook: <rule-id>注释来记录未来的规则改进
概述
此技能指导如何创建用于检测安全漏洞和代码模式的 Semgrep 规则。规则通过迭代创建:分析问题、先编写测试、分析 AST 结构、编写规则,并反复调整直到所有测试通过,最后优化规则。
选择方法:
- 污点模式(优先):不受信任的输入流向危险接收点的数据流问题
- 模式匹配:不涉及数据流的简单语法模式
为什么优先使用污点模式? 模式匹配能发现语法,却无法识别上下文。模式 eval($X) 既会匹配 eval(user_input)(易受攻击),也会匹配 eval("safe_literal")(安全)。污点模式会跟踪数据流,因此只有不受信任的数据实际到达接收点时才会发出警报——这能大幅减少注入漏洞的误报。
在不同方法间迭代: 可以进行尝试。如果从污点模式开始,但效果不佳(例如,污点传播不符合预期,或误报/漏报过多),可以改用模式匹配。反之,如果模式匹配在安全情况下产生过多误报,可以改用污点模式。目标是得到可用的规则,而不是僵化地坚持某种方法。
输出结构——目录以规则 ID 命名,且其中恰好包含 2 个文件:
<rule-id>/
├── <rule-id>.yaml # Semgrep rule
└── <rule-id>.<ext> # Test file with ruleid/ok annotations
快速入门
rules:
- id: insecure-eval
languages: [python]
severity: HIGH
message: User input passed to eval() allows code execution
mode: taint
pattern-sources:
- pattern: request.args.get(...)
pattern-sinks:
- pattern: eval(...)
测试文件(insecure-eval.py):
# ruleid: insecure-eval
eval(request.args.get('code'))
# ok: insecure-eval
eval("print('safe')")
运行测试(在规则目录中):semgrep --test --config <rule-id>.yaml <rule-id>.<ext>
快速参考
- 有关命令、模式运算符和污点模式语法,请参阅 quick-reference.md。
- 有关详细的工作流和示例,必须参阅 workflow.md。
工作流
复制此清单并跟踪进度:
Semgrep Rule Progress:
- [ ] Step 1: Analyze the Problem
- [ ] Step 2: Write Tests First
- [ ] Step 3: Analyze AST structure
- [ ] Step 4: Write the rule
- [ ] Step 5: Iterate until all tests pass (semgrep --test)
- [ ] Step 6: Optimize the rule (remove redundancies, re-test)
- [ ] Step 7: Final Run
文档
必需:编写任何规则之前,请使用 WebFetch 阅读 Semgrep 文档中的以下 4 个链接: