如何使用 AI 编写高质量的 Semgrep 自定义扫描规则
解决静态分析中“误报率高”和“规则难写”的问题:通过 AI 引导的“测试驱动”工作流,创建能够精准检测安全漏洞、Bug 模式及强制执行编码标准的 Semgrep 自定义规则。
为什么需要这个技能
在进行大规模代码审计或维护编码规范时,通用的扫描规则集往往无法覆盖项目特有的业务逻辑漏洞。手动编写 Semgrep 规则如果缺乏验证,很容易出现两种极端:要么范围太广导致大量误报(False Positives),要么范围太窄导致漏报(False Negatives)。
本技能通过引入一套严格的迭代流程,要求 AI 在编写规则前先定义“漏洞用例”和“安全用例”,并通过 AST(抽象语法树)分析确保规则的精准度,从而产出生产环境可用的高质量规则。
适用场景
- 安全漏洞检测:在代码库中搜索特定类型的安全漏洞(如 SQL 注入、命令执行)。
- Bug 模式捕捉:识别团队中常见的低级错误或特定的 Bug 模式。
- 编码标准强制执行:确保所有开发者遵循特定的 API 调用规范或设计模式。
- 数据流分析:使用污点分析(Taint Mode)追踪不可信输入是否到达危险函数(Sink)。
核心工作流
- 问题分析与测试先行:在写规则前,先编写测试文件。必须包含
ruleid(触发漏洞的用例)和ok(预期不触发的正常用例)两种标注。 - AST 结构分析:分析目标代码的抽象语法树,避免凭直觉写模式,确保涵盖所有语法变体。
- 模式选择:
- 简单模式匹配:用于纯语法结构的检测。
- 污点模式 (Taint Mode):优先用于数据流问题。只有当不可信源(Source)流向危险点(Sink)时才报错,大幅降低误报。
- 迭代验证:运行
semgrep --test,直到所有测试用例 100% 通过。 - 优化与精简:在确保正确性的前提下,简化 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。
你可能还需要
暂无推荐