关于 semgrep-rule-creator
面向防御性安全分析和代码规范检查的 Semgrep 规则编写技能,涵盖结构化匹配、污点追踪、测试、元数据及减少误报的方法。
主要功能
- 01编写结构化 Semgrep 模式
- 02定义污点模式的来源与汇点
- 03编写内联正反例测试
- 04设置规则元数据与严重性
- 05检查性能并减少误报
适用场景
- 01检测自有代码中的漏洞模式
- 02在 CI/CD 中执行代码规范
- 03用安全与易受攻击样例测试规则
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ oimiragieo/ agent-studio --skill semgrep-rule-creator安装后在 Claude Code 中输入/semgrep-rule-creator确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
commands/semgrep-rule-creator.mdhooks/post-execute.cjspre-execute.cjsreferences/research-requirements.mdrules/semgrep-rule-creator.mdschemas/input.schema.jsonoutput.schema.jsonscripts/main.cjstemplates/implementation-template.md详细介绍
Semgrep 规则编写器
安全声明
仅限授权用途:这些技能仅用于防御性安全分析和经授权的研究:
- 为自有代码库开发自定义安全规则
- 通过自动化检查强制执行编码规范
- 编写 CI/CD 安全门禁规则
- 将漏洞模式编纂为规则,用于预防
- 在受控环境中用于教育目的
严禁用于:
- 创建绕过安全控制的规则
- 未经授权扫描系统
- 任何非法活动
第 1 步:定义检测目标
编写规则前,请明确定义:
- 检测内容:存在漏洞或不符合预期的代码模式
- 重要性:安全影响或质量问题
- 目标语言:要检测的编程语言
- 真阳性示例:应该匹配的代码
- 真阴性示例:不应该匹配的代码(安全替代方案)
- 误报风险:哪些看起来相似的代码实际上是安全的
检测目标模板
## Rule: [rule-id]
- **Detect**: [description of what to find]
- **Why**: [security impact / quality concern]
- **Languages**: [javascript, typescript, python, etc.]
- **CWE**: [CWE-XXX]
- **OWASP**: [A0X category]
- **True Positive**: [code example that should match]
- **True Negative**: [safe code that should NOT match]
第 2 步:编写 Semgrep 规则
基本规则结构
rules:
- id: rule-id-here
message: >
Clear description of what was found and why it matters.
Include remediation guidance in the message.
severity: ERROR # ERROR, WARNING, INFO
languages: [javascript, typescript]
metadata:
cwe:
- CWE-089
owasp:
- A03:2021
confidence: HIGH # HIGH, MEDIUM, LOW
impact: HIGH # HIGH, MEDIUM, LOW
category: security
subcategory:
- vuln
technology:
- express
- node.js
references:
- https://owasp.org/Top10/A03_2021-Injection/
source-rule-url: https://semgrep.dev/r/rule-id
# Pattern goes here (see below)
模式类型
简单模式匹配
pattern: |
eval($X)
包含多个选项的模式(OR)
pattern-either:
- pattern: eval($X)
- pattern: new Function($X)
- pattern: setTimeout($X, ...)
- pattern: setInterval($X, ...)
包含排除项的模式(AND NOT)
patterns:
- pattern: $DB.query($QUERY)
- pattern-not: $DB.query($QUERY, $PARAMS)
- pattern-not: $DB.query($QUERY, [...])
上下文中的模式
patterns:
- pattern: $RES.send($DATA)
- pattern-inside: |
app.$METHOD($PATH, function($REQ, $RES) {
...
})
- pattern-not-inside: |
app.$METHOD($PATH, authenticate, function($REQ, $RES) {
...
})
元变量约束
patterns:
- pattern: crypto.createHash($ALGO)
- metavariable-regex:
metavariable: $ALGO
regex: (md5|sha1|MD5|SHA1)
- focus-metavariable: $ALGO
patterns:
- pattern: setTimeout($FUNC, $TIME)
- metavariable-comparison:
metavariable: $TIME
comparison: $TIME > 60000
污点模式规则(高级)
用于跟踪数据从来源到接收点的流动:
mode: taint
pattern-sources:
- patterns:
- pattern: $REQ.query.$PARAM
- patterns:
- pattern: $REQ.body.$PARAM
- patterns:
- pattern: $REQ.params.$PARAM
pattern-sinks:
- patterns:
- pattern: $DB.query($SINK, ...)
- focus-metavariable: $SINK
pattern-sanitizers:
- patterns:
- pattern: escape($X)
- patterns:
- pattern: sanitize($X)
- patterns:
- pattern: $DB.query($QUERY, [...])
第 3 步:常见规则模板
SQL 注入检测
rules:
- id: sql-injection-string-concat
message: >
Possible SQL injection via string concatenation. User input appears
to be concatenated into a SQL query string. Use parameterized
queries instead.
severity: ERROR
languages: [javascript, typescript]
metadata:
cwe: [CWE-089]
owasp: [A03:2021]
confidence: HIGH
impact: HIGH
category: security
patterns:
- pattern-either:
- pattern: $DB.query("..." + $VAR + "...")
- pattern: $DB.query(`...${$VAR}...`)
- pattern-not: $DB.query("..." + $VAR + "...", [...])
fix: |
$DB.query("... $1 ...", [$VAR])
XSS 检测
rules:
- id: xss-innerhtml-assignment
message: >
Direct assignment to innerHTML with potentially untrusted data.
Use textContent for text or a sanitization library for HTML.
severity: ERROR
languages: [javascript, typescript]
metadata:
cwe: [CWE-079]
owasp: [A03:2021]
confidence: MEDIUM
impact: HIGH
category: security
pattern-either:
- pattern: $EL.innerHTML = $DATA
- pattern: document.getElementById($ID).innerHTML = $DATA
硬编码机密
rules:
- id: hardcoded-api-key
message: >
Hardcoded API key detected. Store secrets in environment
variables or a secrets manager.
severity: ERROR
languages: [javascript, typescript, python]
metadata:
cwe: [CWE-798]
owasp: [A02:2021]
confidence: MEDIUM
impact: HIGH
category: security
pattern-either:
- pattern: |
$KEY = "AKIA..."
- pattern: |
$KEY = "sk-..."
- pattern: |
$KEY = "ghp_..."
pattern-regex: (AKIA[0-9A-Z]{16}|sk-[a-zA-Z0-9]{48}|ghp_[a-zA-Z0-9]{36})
缺少身份验证
rules:
- id: express-route-missing-auth
message: >
Express route handler without authentication middleware.
Add authentication middleware before the handler.
severity: WARNING
languages: [javascript, typescript]
metadata:
cwe: [CWE-306]
owasp: [A07:2021]
confidence: MEDIUM
impact: HIGH
category: security
patterns:
- pattern-either:
- pattern: app.post($PATH, function($REQ, $RES) { ... })
- pattern: app.put($PATH, function($REQ, $RES) { ... })
- pattern: app.delete($PATH, function($REQ, $RES) { ... })
- pattern: router.post($PATH, function($REQ, $RES) { ... })
- pattern: router.put($PATH, function($REQ, $RES) { ... })
- pattern: router.delete($PATH, function($REQ, $RES) { ... })
- pattern-not-inside: |
app.$METHOD($PATH, $AUTH, function($REQ, $RES) { ... })
- pattern-not-inside: |
router.$METHOD($PATH, $AUTH, function($REQ, $RES) { ... })
不安全的随机数生成
rules:
- id: insecure-random-for-security
message: >
Math.random() is not cryptographically secure. Use
crypto.getRandomValues() or crypto.randomBytes() for
security-sensitive random values.
severity: WARNING
languages: [javascript, typescript]
metadata:
cwe: [CWE-330]
confidence: MEDIUM
impact: MEDIUM
category: security
patterns:
- pattern: Math.random()
- pattern-inside: |
function $FUNC(...) {
...
}
- metavariable-regex:
metavariable: $FUNC
regex: (generateToken|createSecret|randomPassword|generateKey|createSession|generateId|createNonce)
第 4 步:编写规则测试
测试文件格式
在规则旁创建测试文件:
// ruleid: sql-injection-string-concat
db.query('SELECT * FROM users WHERE id = ' + userId);
// ruleid: sql-injection-string-concat
db.query(`SELECT * FROM users WHERE id = ${userId}`);
// ok: sql-injection-string-concat
db.query('SELECT * FROM users WHERE id = $1', [userId]);
// ok: sql-injection-string-concat
db.query('SELECT * FROM users WHERE id = ?', [userId]);
运行测试
# Test a single rule
semgrep --test --config=rules/sql-injection.yml tests/
# Test all rules
semgrep --test --config=rules/ tests/
# Validate rule syntax
semgrep --validate --config=rules/
第 5 步:优化规则
性能最佳实践
- 使用具体的模式:避免
$X($Y)这样的过于宽泛的匹配 - 使用 pattern-inside 限定范围:缩小搜索上下文
- 使用特定语言的语法:利用语言特性
- 避免深层省略号嵌套:
... ... ...会降低速度 - 使用 focus-metavariable:缩小报告的位置范围
- 使用大型代码库进行测试:验证规则在大规模场景下的性能
减少误报
- 使用 pattern-not 添加安全模式:排除已知的安全替代方案
- 使用 metavariable-regex:限制元变量的取值
- 使用 pattern-not-inside:排除安全上下文
- 设置恰当的置信度:如实反映检测结果的确定性
- 添加技术元数据:帮助用户筛选相关规则
- 提供修复建议:在可能的情况下,包含
fix:字段
规则验证清单
- 规则具有唯一且描述性明确的 ID
- 消息说明了问题及修复方法
- 严重性与实际风险相符
- 元数据包含 CWE、OWASP、置信度和影响
- 至少 2 个真实阳性测试用例
- 至少 2 个真实阴性测试用例
- 已使用
semgrep --validate验证规则 - 已使用
semgrep --test测试规则 - 在大型代码库上的性能可接受
- 提供修复建议(如适用)
Semgrep 模式语法参考
| 语法 | 含义 | 示例 |
|---|---|---|
$X | 单个元变量 | eval($X) |
$...X | 多个元变量参数 | func($...ARGS) |
... | 省略号(任意语句) | if (...) { ... } |
<... $X ...> | 深度表达式匹配 | <... eval($X) ...> |
pattern-either | 或运算符 | 匹配 N 个模式中的任意一个 |
pattern-not | 非运算符 | 排除特定模式 |
pattern-inside | 上下文要求 | 必须位于此模式内部 |
pattern-not-inside | 上下文排除 | 不能位于此模式内部 |
metavariable-regex | 正则表达式约束 | 限制 $X 匹配正则表达式 |
metavariable-comparison | 数值约束 | $X > 100 |
focus-metavariable | 缩小匹配位置 | 仅报告 $X 所在位置 |
相关技能
static-analysis- 使用 SARIF 输出的 CodeQL 和 Semgrepvariant-analysis- 基于模式的漏洞发现differential-review- 面向安全的差异分析insecure-defaults- 硬编码凭据检测security-architect- STRIDE 威胁建模
Agent 集成
- security-architect(主要):用于安全审计的自定义规则开发
- code-reviewer(主要):自动化代码审查规则编写
- penetration-tester(次要):漏洞检测规则创建
- qa(次要):质量保障规则编写
铁律
- 绝不在没有至少 2 个真实阳性和 2 个真实阴性测试用例时发布规则
- 始终在提交前使用
semgrep --validate验证规则语法 - 绝不在未使用真实代码库测试规则前将置信度设为 HIGH
- 始终在每条规则消息中说明发现了什么、为何重要以及如何修复
- 绝不将
pattern-regex用作主要匹配器——应使用结构化模式,并通过metavariable-regex添加约束
反模式
| 反模式 | 失败原因 | 正确做法 |
|---|---|---|
| 发布未经测试的规则 | 误报会削弱开发者的信任,规则也会被忽略 | 使用 // ruleid: 和 // ok: 注释编写测试用例,并运行 semgrep --test |
| 未经验证就设为 HIGH 置信度 | 过度自信的规则会误导审查者,让他们相信错误信号 | 根据真实代码库中测得的误报率校准置信度 |
| 规则消息含糊不清 | 没有明确指引,开发者无法修复问题 | 在每条消息中说明发现了什么、为什么重要,以及如何修复 |
| 模式过于宽泛且没有排除项 | 高误报率会导致规则疲劳 | 为所有已知安全的替代方案添加 pattern-not 子句 |
将 pattern-regex 用作主要匹配器 | 正则表达式比结构化模式匹配更慢,也不够精确 | 使用结构化模式作为主要匹配器;仅用 metavariable-regex 限定匹配范围 |
记忆协议(强制)
开始之前:
阅读 .claude/context/memory/learnings.md
完成之后:
- 新模式 ->
.claude/context/memory/learnings.md - 发现问题 ->
.claude/context/memory/issues.md - 做出决策 ->
.claude/context/memory/decisions.md
假设任务会中断:如果没有记录在记忆中,就视为从未发生。
交叉引用:Creator Ecosystem
此技能属于 Creator Ecosystem。研究发现缺口时,调用相应的配套创建器:
| 发现的缺口 | 所需产物 | 要调用的创建器 | 时机 |
|---|---|---|---|
| 领域知识需要转化为可复用的技能 | 技能 | Skill({ skill: 'skill-creator' }) | 缺口涵盖完整的技能领域 |
| 现有技能的覆盖范围不完整 | 技能更新 | Skill({ skill: 'skill-updater' }) | 存在相关技能,但覆盖不完整 |
| 某项能力需要专属 Agent | Agent | Skill({ skill: 'agent-creator' }) | 需要由 Agent 负责该能力 |
| 现有 Agent 需要更新能力 | Agent 更新 | Skill({ skill: 'agent-updater' }) | 存在相关 Agent,但能力不完整 |
| 领域需要代码/项目脚手架 | 模板 | Skill({ skill: 'template-creator' }) | 需要可复用的代码模式 |
| 行为需要前置/后置执行保护 | 钩子 | Skill({ skill: 'hook-creator' }) | 需要强制执行行为 |
| 流程需要多阶段编排 | 工作流 | Skill({ skill: 'workflow-creator' }) | 需要多步骤协同 |
| 产物需要结构化的输入/输出验证 | 架构 | Skill({ skill: 'schema-creator' }) | 需要用于产物输入/输出的 JSON 架构 |
| 用户交互需要斜杠命令 | 命令 | Skill({ skill: 'command-creator' }) | 需要面向用户的快捷方式 |
| 重复逻辑需要可复用的 CLI 工具 | 工具 | Skill({ skill: 'tool-creator' }) | 需要 CLI 实用工具 |
| 仅限狭窄范围/单一产物的能力 | 内联 | 仅在此产物中记录 | 过于具体,无法泛化 |
生态对齐契约(强制)
此创建者技能是协同创建者生态的一部分。在此创建的任何产物都必须与相关创建者保持一致,并通过其验证:
agent-creator:负责所有权和执行路径skill-creator:负责能力打包和分配tool-creator:负责可执行自动化界面hook-creator:负责强制执行和防护措施rule-creator和semgrep-rule-creator:负责策略和静态检查template-creator:负责标准化脚手架workflow-creator:负责编排和阶段门控command-creator:负责用户/操作员命令 UX
跨创建者握手(必需)
完成前,请验证所有相关握手:
- 产物路由已存在于
.claude/CLAUDE.md和相关路由文档中。 - 已更新发现/注册表条目(视情况更新目录/索引/注册表)。
- 已创建配套产物,或明确说明豁免理由。
- 为创建的产物运行
validate-integration.cjs并通过验证。 - 技能元数据变更时,重新生成技能索引。
研究关卡(Exa + arXiv — 两者均为强制要求)
对于新模式、模板或工作流,必须进行研究:
- 使用 Exa 研究实现和生态模式:
mcp__Exa__web_search_exa({ query: '<topic> 2025 best practices' })mcp__Exa__get_code_context_exa({ query: '<topic> implementation examples' })
- 搜索 arXiv 上的学术研究(AI/ML、Agent、评估、编排、记忆/RAG、安全领域为强制要求):
- 通过 Exa:
mcp__Exa__web_search_exa({ query: 'site:arxiv.org <topic> 2024 2025' }) - 直接 API:
WebFetch({ url: 'https://arxiv.org/search/?query=<topic>&searchtype=all&start=0' })
- 通过 Exa:
- 在产物参考资料/文档中记录决策、约束和非目标。
- 保持更新精简,避免过度设计。
当主题涉及以下领域时,arXiv 研究为强制要求(不是备用选项): AI Agent、大模型评估、编排、记忆/RAG、安全、静态分析或任何新兴方法。
安全回归交付
- 行为变更须严格遵循 RED -> GREEN -> REFACTOR。
- 对变更模块运行有针对性的测试。
- 对变更文件运行 lint/format。
- 按关注点划分提交(逻辑/文档/生成的产物)。
评论
支持 Markdown