用途
Semgrep Rule Creator 用于创建生产级质量的 Semgrep 规则,主要面向以下场景:
- 针对特定缺陷模式编写 Semgrep 规则;
- 编写规则以检测代码库中的安全漏洞;
- 为数据流漏洞编写 taint 模式(污染模式)规则;
- 编写用于约束编码规范的规则。
该技能不适用于以下情况:运行已有的 Semgrep 规则集;不使用自定义规则的通用静态分析(此类场景应使用 static-analysis 技能)。
主要能力
- 支持两种检测思路:taint 模式(优先)与模式匹配。taint 模式用于不可信输入最终到达危险 sink 的数据流问题;模式匹配用于不涉及数据流的简单语法模式。
- 通过 taint 模式跟踪数据流,仅在不可信数据真正到达 sink 时告警,从而减少注入类漏洞的误报。
- 提供规则编写、AST 结构分析、测试与迭代验证的完整工作流。
- 明确的输出结构:在名为 rule-id 的目录中只生成两个文件——
<rule-id>.yaml(Semgrep 规则)与<rule-id>.<ext>(带有 ruleid/ok 标注的测试文件)。
使用方式
工作流严格(strict),步骤如下(要求不跳步):
- 分析问题;
- 先编写测试;
- 分析 AST 结构;
- 编写规则;
- 迭代直到所有测试通过(
semgrep --test); - 优化规则(去除冗余并重新测试);
- 最终运行。
快速开始示例(原文给出):
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>
技能要求:在编写任何规则之前,必须使用 WebFetch 阅读 Semgrep 官方文档的 7 个链接,包括 Rule Syntax、Pattern Syntax、Testing Rules、Taint analysis、Advanced techniques for taint analysis、Constant propagation,以及 Trail of Bits Testing Handbook 的 Semgrep 章节。更多命令、模式操作符与 taint 模式语法见 quick-reference.md;详细工作流与示例见 workflow.md。
适用场景
- 为特定 bug 模式或安全漏洞编写定制检测规则;
- 为数据流类漏洞(如注入)编写 taint 模式规则;
- 为编码规范建立自动化约束;
- 需要严格控制误报/漏报的场景,要求规则必须通过测试验证。
限制与要求
- 严格流程:必须测试优先;不允许未编写测试就写规则;必须 100% 测试通过,“大多数测试通过”不可接受;优化必须放在所有测试通过之后。
- 禁止宽泛/泛型规则:一个 YAML 文件只允许一条 Semgrep 规则;面向特定语言时避免使用通用模式匹配(
languages: generic)。 - 测试文件中禁止使用
todoruleid与todook标注。 - 不适用于:运行已有 Semgrep 规则集;不使用自定义规则的通用静态分析。
- 需要拒绝的常见捷径(原文列举):认为“模式看起来完整”而不运行测试;只匹配漏洞用例而不验证安全用例不匹配;认为 taint 模式过度设计;只写一个测试;先优化模式;跳过 AST 分析。
授权与来源说明
该技能引用 Trail of Bits 的 Semgrep Rule Creator 文档,授权协议为 CC-BY-SA-4.0。
引用文档
以下为作者声明的引用来源,保留指定版本、署名和许可。
- trailofbits/skills/plugins/semgrep-rule-creator/skills/semgrep-rule-creator/SKILL.md — 署名:Trail of Bits;许可:CC-BY-SA-4.0;版本:
5c15f4f5644b4bd3d48882a802a7232d501852b6。