SuperAPI AI 工具集

semgrep-rule-creator

安全与审计

查看项目

更新于 10-16 23:59

技能介绍

用途

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),步骤如下(要求不跳步):

  1. 分析问题;
  2. 先编写测试;
  3. 分析 AST 结构;
  4. 编写规则;
  5. 迭代直到所有测试通过(semgrep --test);
  6. 优化规则(去除冗余并重新测试);
  7. 最终运行。

快速开始示例(原文给出):

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。

引用文档

以下为作者声明的引用来源,保留指定版本、署名和许可。

作者的来源声明