
关于
创建自定义 Semgrep 规则,用于检测安全漏洞、Bug 模式和代码模式。适用于编写 Semgrep 规则或构建自定义静态分析检测。
name: semgrep-rule-creator description: 创建自定义 Semgrep 规则,用于检测安全漏洞、缺陷模式和代码模式。在编写 Semgrep 规则或构建自定义静态分析检测时使用。 allowed-tools:
- Bash
- Read
- Write
- Edit
- Glob
- Grep
- WebFetch risk: unknown source: community
Semgrep 规则创建器
创建生产级 Semgrep 规则,包含完善的测试和验证。
适用场景
理想场景:
- 为特定缺陷模式编写 Semgrep 规则
- 编写规则检测代码库中的安全漏洞
- 编写 taint 模式规则检测数据流漏洞
- 编写规则强制执行编码标准
不适用场景
不要将此技能用于:
- 运行现有 Semgrep 规则集
- 不需要自定义规则的通用静态分析(使用 static-analysis 技能)
应拒绝的合理化借口
编写 Semgrep 规则时,拒绝这些常见捷径:
- "模式看起来完整了" — 仍然要运行 semgrep --test 验证。未测试的规则存在隐藏的误报/漏报。
- "它匹配了漏洞情况" — 匹配漏洞只是工作的一半。验证安全情况不会匹配(误报会破坏信任)。
- "taint 模式对此太重了" — 如果数据从用户输入流向危险接收点,taint 模式比模式匹配提供更好的精度。
- "一个测试就够了" — 包含边界情况:不同编码风格、已净化输入、安全替代方案和边界条件。
- "我先优化模式" — 先写正确的模式,所有测试通过后再优化。过早优化导致回归。
- "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% 测试通过是必需的:"大部分测试通过"是不可接受的
- 优化放在最后:只在所有测试通过后才简化模式
- 避免通用模式:规则必须具体,不能匹配宽泛模式
- 优先使用 taint 模式:用于数据流漏洞
- 一个 YAML 文件一条 Semgrep 规则:每个 YAML 文件只能包含一条规则
- 不使用通用规则:针对特定语言时避免 languages: generic
- 禁止 todook 和 todoruleid 测试注解
概述
此技能指导创建检测安全漏洞和代码模式的 Semgrep 规则。规则通过迭代创建:分析问题、先写测试、分析 AST 结构、编写规则、迭代直到所有测试通过、优化规则。
方法选择:
- Taint 模式(优先):不可信输入到达危险接收点的数据流问题
- 模式匹配:不需要数据流的简单语法模式
为什么优先使用 taint 模式? 模式匹配找到语法但遗漏上下文。Taint 模式跟踪数据流,只在不可信数据实际到达接收点时才告警,大幅减少注入漏洞的误报。
方法间切换: 可以实验。如果一种方法不好用就切换到另一种。目标是一条有效的规则,而非死板地坚持一种方法。
输出结构 - 恰好 2 个文件在以 rule-id 命名的目录中:
<rule-id>/
├── <rule-id>.yaml # Semgrep rule
└── <rule-id>.<ext> # Test file with ruleid/ok annotations
兼容工具
Claude CodeCursor
标签
AI与机器学习