用途:在已有 Semgrep 检测规则基础上创建变体规则,覆盖同一漏洞的其他写法。适合扩展规则以匹配不同语法、将规则从一种框架或语言迁移到另一种、在发现具体漏洞后扩大检测范围,或从单个样例生成一组相关规则。不适用于从零编写规则、复杂跨函数数据流分析(应使用 CodeQL)以及非代码文件。
主要能力:围绕多个维度生成变体,包括字符串构造方式(f-string、拼接、format、% 运算符)、API 方法(execute、executemany、raw、query)、框架(Django、Flask、FastAPI、SQLAlchemy)、语言(Python、JavaScript、Java、Go)、编码方式(直接、base64、URL 编码、十六进制)以及间接引用(直接使用、变量赋值、函数返回)。可用 pattern-either 将多个变体合并到一条规则,并用 pattern-not 排除安全写法(如参数化查询)。
使用方式:先分析原始规则,识别缺失的变体,再编写变体规则,必要时添加框架专用变体。测试时编写覆盖各变体的测试文件,用注释标注 ruleid 与 ok,然后运行 semgrep --test rules/ 验证。
最佳实践:相关变体使用统一规则 ID 前缀;尽量用 pattern-either 合并;始终为安全模式添加 pattern-not 排除;对每个变体单独测试;记录原始规则基于哪个变体。
限制:资料未提供具体安装命令、收费信息、支持平台或性能数据;复杂跨函数数据流场景不适用。