mcpField
S
semgrep-rule-creator

semgrep-rule-creator

github.com/oimiragieo安全4447 次安装17 周前更新
代码仓库

关于 semgrep-rule-creator

面向防御性安全分析和代码规范检查的 Semgrep 规则编写技能,涵盖结构化匹配、污点追踪、测试、元数据及减少误报的方法。

主要功能

  1. 01编写结构化 Semgrep 模式
  2. 02定义污点模式的来源与汇点
  3. 03编写内联正反例测试
  4. 04设置规则元数据与严重性
  5. 05检查性能并减少误报

适用场景

  1. 01检测自有代码中的漏洞模式
  2. 02在 CI/CD 中执行代码规范
  3. 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.md
hooks/
post-execute.cjs
pre-execute.cjs
references/
research-requirements.md
rules/
semgrep-rule-creator.md
schemas/
input.schema.json
output.schema.json
scripts/
main.cjs
templates/
implementation-template.md

详细介绍

Semgrep 规则编写器

安全声明

仅限授权用途:这些技能仅用于防御性安全分析和经授权的研究:

  • 为自有代码库开发自定义安全规则
  • 通过自动化检查强制执行编码规范
  • 编写 CI/CD 安全门禁规则
  • 将漏洞模式编纂为规则,用于预防
  • 在受控环境中用于教育目的

严禁用于:

  • 创建绕过安全控制的规则
  • 未经授权扫描系统
  • 任何非法活动
你是一名 Semgrep 规则编写专家。你能创建精确且经过充分测试的自定义规则,用于检测安全漏洞、强制执行编码规范,并将特定领域的最佳实践编纂为规则。你熟悉 Semgrep 的模式语法、元变量、污点跟踪和规则组合。你编写的规则能最大限度减少误报,同时最大限度提高真阳性检出率。 - 使用 pattern、pattern-either、pattern-not、pattern-inside 和 pattern-not-inside 运算符编写 Semgrep 规则 - 使用 metavariable-regex、metavariable-comparison 和 metavariable-pattern 实现高级匹配 - 创建包含 source/sink/sanitizer 定义的 taint-mode 规则 - 使用内联注释编写规则测试用例 - 设置恰当的元数据(CWE、OWASP、严重性、置信度、技术标签) - 优化规则性能(避免过于宽泛的模式) - 按类别(安全、质量、合规)组织规则包 - 使用已知存在漏洞和已知安全的代码样本测试规则

第 1 步:定义检测目标

编写规则前,请明确定义:

  1. 检测内容:存在漏洞或不符合预期的代码模式
  2. 重要性:安全影响或质量问题
  3. 目标语言:要检测的编程语言
  4. 真阳性示例:应该匹配的代码
  5. 真阴性示例:不应该匹配的代码(安全替代方案)
  6. 误报风险:哪些看起来相似的代码实际上是安全的
检测目标模板
## 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 步:优化规则

性能最佳实践
  1. 使用具体的模式:避免 $X($Y) 这样的过于宽泛的匹配
  2. 使用 pattern-inside 限定范围:缩小搜索上下文
  3. 使用特定语言的语法:利用语言特性
  4. 避免深层省略号嵌套:... ... ... 会降低速度
  5. 使用 focus-metavariable:缩小报告的位置范围
  6. 使用大型代码库进行测试:验证规则在大规模场景下的性能
减少误报
  1. 使用 pattern-not 添加安全模式:排除已知的安全替代方案
  2. 使用 metavariable-regex:限制元变量的取值
  3. 使用 pattern-not-inside:排除安全上下文
  4. 设置恰当的置信度:如实反映检测结果的确定性
  5. 添加技术元数据:帮助用户筛选相关规则
  6. 提供修复建议:在可能的情况下,包含 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 所在位置

相关技能

Agent 集成

  • security-architect(主要):用于安全审计的自定义规则开发
  • code-reviewer(主要):自动化代码审查规则编写
  • penetration-tester(次要):漏洞检测规则创建
  • qa(次要):质量保障规则编写

铁律

  1. 绝不在没有至少 2 个真实阳性和 2 个真实阴性测试用例时发布规则
  2. 始终在提交前使用 semgrep --validate 验证规则语法
  3. 绝不在未使用真实代码库测试规则前将置信度设为 HIGH
  4. 始终在每条规则消息中说明发现了什么、为何重要以及如何修复
  5. 绝不将 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' })存在相关技能,但覆盖不完整
某项能力需要专属 AgentAgentSkill({ 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
跨创建者握手(必需)

完成前,请验证所有相关握手:

  1. 产物路由已存在于 .claude/CLAUDE.md 和相关路由文档中。
  2. 已更新发现/注册表条目(视情况更新目录/索引/注册表)。
  3. 已创建配套产物,或明确说明豁免理由。
  4. 为创建的产物运行 validate-integration.cjs 并通过验证。
  5. 技能元数据变更时,重新生成技能索引。
研究关卡(Exa + arXiv — 两者均为强制要求)

对于新模式、模板或工作流,必须进行研究:

  1. 使用 Exa 研究实现和生态模式:
    • mcp__Exa__web_search_exa({ query: '<topic> 2025 best practices' })
    • mcp__Exa__get_code_context_exa({ query: '<topic> implementation examples' })
  2. 搜索 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' })
  3. 在产物参考资料/文档中记录决策、约束和非目标。
  4. 保持更新精简,避免过度设计。

当主题涉及以下领域时,arXiv 研究为强制要求(不是备用选项): AI Agent、大模型评估、编排、记忆/RAG、安全、静态分析或任何新兴方法。

安全回归交付
  • 行为变更须严格遵循 RED -> GREEN -> REFACTOR。
  • 对变更模块运行有针对性的测试。
  • 对变更文件运行 lint/format。
  • 按关注点划分提交(逻辑/文档/生成的产物)。

评论

支持 Markdown