如何使用 AI 编写高质量的 Semgrep 自定义扫描规则

解决静态分析中“误报率高”和“规则难写”的问题:通过 AI 引导的“测试驱动”工作流,创建能够精准检测安全漏洞、Bug 模式及强制执行编码标准的 Semgrep 自定义规则。

为什么需要这个技能

在进行大规模代码审计或维护编码规范时,通用的扫描规则集往往无法覆盖项目特有的业务逻辑漏洞。手动编写 Semgrep 规则如果缺乏验证,很容易出现两种极端:要么范围太广导致大量误报(False Positives),要么范围太窄导致漏报(False Negatives)。

本技能通过引入一套严格的迭代流程,要求 AI 在编写规则前先定义“漏洞用例”和“安全用例”,并通过 AST(抽象语法树)分析确保规则的精准度,从而产出生产环境可用的高质量规则。

适用场景

  • 安全漏洞检测:在代码库中搜索特定类型的安全漏洞(如 SQL 注入、命令执行)。
  • Bug 模式捕捉:识别团队中常见的低级错误或特定的 Bug 模式。
  • 编码标准强制执行:确保所有开发者遵循特定的 API 调用规范或设计模式。
  • 数据流分析:使用污点分析(Taint Mode)追踪不可信输入是否到达危险函数(Sink)。

核心工作流

  1. 问题分析与测试先行:在写规则前,先编写测试文件。必须包含 ruleid(触发漏洞的用例)和 ok(预期不触发的正常用例)两种标注。
  2. AST 结构分析:分析目标代码的抽象语法树,避免凭直觉写模式,确保涵盖所有语法变体。
  3. 模式选择
    • 简单模式匹配:用于纯语法结构的检测。
    • 污点模式 (Taint Mode):优先用于数据流问题。只有当不可信源(Source)流向危险点(Sink)时才报错,大幅降低误报。
  4. 迭代验证:运行 semgrep --test,直到所有测试用例 100% 通过。
  5. 优化与精简:在确保正确性的前提下,简化 YAML 规则描述。

快速上手示例

规则文件 (insecure-eval.yaml):

rules:
  - id: insecure-eval
    languages: [python]
    severity: HIGH
    message: 用户输入被传递给 eval() 导致代码执行
    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 insecure-eval.yaml insecure-eval.py

下载和安装

下载 semgrep-rule-creator 中文版 Skill ZIP

解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md

你可能还需要

暂无推荐