安全与风控
需要为特定漏洞或代码模式编写自定义 Semgrep 规则时…
当你要为特定 bug 模式、安全漏洞或编码规范编写自定义 Semgrep 静态分析规则时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要为特定漏洞或代码模式编写自定义 Se通用
解决思路
- 先用 WebFetch 阅读全部 7 篇 Semgrep 文档:Rule Syntax、Pattern Syntax、Testing Rules、Taint analysis、Advanced techniques for taint analysis、Constant propagation、Trail of Bits Testing Handbook 的 Semgrep 章节。
- 按 7 步清单推进并跟踪进度:Step 1 分析问题;Step 2 先写测试;Step 3 分析 AST 结构;Step 4 编写规则;Step 5 迭代直到所有测试通过(semgrep --test);Step 6 优化规则(去冗余并重测);Step 7 最终运行。
- 选择方法:数据流问题(不可信输入到达危险 sink)优先用 taint mode;无数据流需求的简单语法模式用 pattern matching。
- 在 taint mode 与 pattern matching 之间迭代实验:taint 传播不符合预期或误报/漏报过多时切换到 pattern matching;pattern matching 对安全用例误报过多时改用 taint mode。
- 输出结构固定为以 rule-id 命名的目录下恰好 2 个文件:<rule-id>/<rule-id>.yaml(Semgrep 规则)和 <rule-id>/<rule-id>.<ext>(带 ruleid/ok 注解的测试文件)。
- 测试文件必须同时包含漏洞用例(# ruleid: <rule-id>)和安全用例(# ok: <rule-id>),覆盖不同编码风格、已净化输入、安全替代方案和边界条件。
- 运行测试命令(在规则目录下):semgrep --test --config <rule-id>.yaml <rule-id>.<ext>,要求 100% 测试通过,不接受“大部分通过”。
- 拒绝常见偷懒借口:模式看起来完整也要跑测试;匹配到漏洞只是一半,还要验证安全用例不匹配;数据从用户输入流向危险 sink 时用 taint mode 更精确;一个测试不够;先写正确模式再优化;不要跳过 AST dump。
- 避免过宽模式(如 pattern: $FUNC(...)),使用具体危险函数(如 pattern: eval(...))。
- 避免过窄模式(如只匹配 os.system("rm " + $VAR)),改用 taint mode 配合 pattern-sources(如 input(...))和 pattern-sinks(如 os.system(...))覆盖变体。
- 每个 YAML 文件只包含一条 Semgrep 规则,不要把多条规则合并到一个文件。
- 针对特定语言时避免使用通用模式匹配(languages: generic)。
- 禁止在测试文件中使用 todoruleid: <rule-id> 和 todook: <rule-id> 注解。
- 优化放在最后:所有测试通过后再简化模式,避免过早优化导致回归。
适用边界 · 注意事项
- 运行已有的 Semgrep 规则集时不要用本技能。
- 做不需要自定义规则的通用静态分析时不要用本技能(改用 static-analysis 技能)。