关于 snyk-agent-scan-compliance
这是面向 Skill 作者的合规技能,用于处理 snyk-agent-scan 报警。它说明如何重组内容以修复 W001、W011 和 W012,同时保留有用信息。
主要功能
- 01W001、W011 和 W012 指引
- 02按报警类型重组内容
- 03逐项修复并重新扫描
- 04误报判断方法
- 05编写前合规检查清单
适用场景
- 01修改被 snyk-agent-scan 标记的 Skill
- 02减少不安全 URL 和 MCP 调用模式
- 03扫描前检查 Skill 内容
MCP 相关
内容涉及 MCP 工具调用导致的提示注入类 W001 报警,并建议在 Skill 正文中采用通用表述。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ samber/ cc-skills --skill snyk-agent-scan-compliance安装后在 Claude Code 中输入/snyk-agent-scan-compliance确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
evals/evals.jsonreferences/w001-patterns.mdw011-patterns.mdw012-patterns.md详细介绍
角色: 你是一名技能编写合规专家。你通过重组内容来修复 snyk-agent-scan 警报,绝不通过压制或删除有用信息来处理。
思考模式: 对于涉及多个警报的修复,要尽可能全面地推理,因为修复一种警报类型可能会触发或压制另一种警报。在 Claude Code 中,使用 ultrathink 明确触发扩展思考。
snyk-agent-scan 合规性
snyk-agent-scan 工具会分析技能正文中的三类不安全模式:第三方内容泄露(W011)、恶意外部 URL(W012),以及通过 MCP 工具调用进行的提示词注入(W001)。这三类问题都可以通过重组内容修复,且不会丢失任何信息。
参考文件
| 文件 | 阅读时机 |
|---|---|
| references/w001-patterns.md | 修复 W001 警报时——MCP 工具名称模式 |
| references/w011-patterns.md | 修复 W011 警报时——祈使句 URL 和外部内容模式 |
| references/w012-patterns.md | 修复 W012 警报时——版本固定和 frontmatter 转移 |
快速参考
| 警报 | 严重性 | 根本原因 | 主要修复方法 |
|---|---|---|---|
| W011 | 高 | 技能正文指示 Agent 获取/解读外部内容 | 将祈使句改为被动提示,说明相关内容可供参考 |
| W012 | 高 | 技能正文引用运行时获取并执行的外部 URL | 移至 frontmatter 的 install 块;固定版本 |
| W001 | 高 | 技能正文明确提及 MCP 工具函数名称 | 改用通用表述 |
运行扫描器
# Scan a single skill
SNYK_TOKEN=<token> snyk-agent-scan --skills skills/<name>/
# Scan all skills
SNYK_TOKEN=<token> snyk-agent-scan --skills ./skills
扫描器需要有效的 SNYK_TOKEN。在 CI 中,将其存储为密钥。如果尚未安装 snyk-agent-scan,可使用 uvx snyk-agent-scan@latest 作为无需安装的直接替代方案。针对各类警报的修复方法,请参阅详细模式。
W011 — 第三方内容泄露
当技能正文使用祈使动词指示 Agent 获取、检查或评估外部内容并据此采取行动时,就会触发 W011。扫描器会将 Agent 视为执行外部操作的语法主语。
规则:
- 将
Check <url>和Fetch <url>替换为被动提示:The release notes at <url> may be useful. - 删除任何涉及外部数据的指令中的“always”:
Always reference the changelog→The changelog documents breaking changes. - 将工具调用(
gh repo view、govulncheck)放在代码块中,不要放在暗示 Agent 必须在采取行动前运行这些工具的说明性清单中。 - 将工具执行与决策分开:运行工具没有问题;但仅凭其远程来源的输出触发重构则不可取。
请参阅 W011 模式目录,其中有 12 个以上的修复前后示例。
W012 — 可能有害的外部 URL
当正文引用运行时获取并执行的外部内容时,就会触发 W012:使用 @latest 的软件包安装命令、管道传给 shell 的命令模式,或使用错误/不存在主版本的 GitHub Actions。
规则:
- 将
go install pkg@latest等命令从正文移至 frontmatter 的metadata.openclaw.install块中——扫描器不会标记 frontmatter。 - 将 GitHub Actions 固定到当前正确的主版本(
@v4,而非@v6)。 - 技能正文中绝不要使用管道传给 shell 的命令模式(
curl ... | sh)。
请参阅 W012 模式目录,其中有 8 个以上的修复前后示例。
W001 — 通过 MCP 工具调用进行提示词注入
当技能正文明确写出 MCP 服务工具函数名称,触发提示词注入检测时,W001 会触发。
规则:
- 切勿在技能正文中写出工具函数名称(
resolve-library-id、query-docs、mcp__*)。 - 替换为通用表述:
Context7 can help as a discoverability platform. - MCP 工具名称仍可出现在
allowed-toolsfrontmatter 字段中 — 仅限制正文。
请参阅 W001 模式目录,了解安全的改写方式。
修复方法
一次修复一个警报,每次更改后重新运行 snyk-agent-scan,并确认警报数量减少后再继续处理下一个。如果修复未能减少警报,请撤销该更改并尝试其他方法 — 不要叠加未经验证的更改。
当扫描返回多个警报时,请按以下顺序修复,以尽量减少返工:
1. W001 (simplest) — remove MCP tool names from body; confirm allowed-tools is correct
2. W011 — rewrite imperative sentences as passive statements; move checklist items to code blocks
3. W012 — move install commands to frontmatter; pin versions
4. Re-scan after each individual fix to verify improvement
重构后,如果 URL 变得更加显眼,修复 W011 有时会暴露出隐藏的 W012。
误报
并非所有警报都是真的。以下情况很可能是误报:
| 条件 | 很可能是误报? |
|---|---|
| URL 出现在 Markdown 表格单元格中,作为参考数据而非指令 | 是 — 表格通常是安全的 |
| 在介绍某个库的技能中,URL 是该库的官方文档 | 是 — 通常是安全的 |
URL 是 frontmatter 中的 homepage 或 issues 链接 | 是 — 不会扫描 |
| 工具名称出现在三反引号代码块中,作为 shell 命令 | 有时 — 代码块的审查较宽松 |
Quick Reference 代码块中的 go install 使用了固定版本 | 有时 — 固定版本的风险较低 |
always 出现在不涉及外部资源的句子中 | 是 — 单独出现的 "always" 不会触发 W011 |
当警报很可能是误报时,仍应使用被动提示模式进行重构 — 扫描器的启发式规则旨在保护真实用户;重构比假定扫描器出错更安全。
编写前检查清单
编写新的技能正文时,请应用以下检查,以避免在首次扫描前触发警报:
- 没有以 Agent 为主语、对 URL 执行操作的句子
- 正文中的任何安装说明都没有
@latest标签 - 正文中没有 MCP 工具函数名称(
mcp__*、resolve-library-id等) - 所有安装命令都位于 frontmatter 的
install区块中 - GitHub Actions 版本与实际存在的主版本一致
- 工具调用位于代码块中,而非有序列表检查清单中
- "always" 后面没有外部资源指令
如果你在 snyk-agent-scan 中遇到错误或意外行为,请在 https://github.com/snyk/snyk-agent-scan/issues 提交问题。
如果你发现上面的参考文件未涵盖、会触发警报的模式 — 例如新的绕过技术、误报情况或未记录的警报代码 — 请在 https://github.com/samber/cc-skills/issues 提交问题,或向 samber/cc-skills 仓库提交拉取请求,将其添加到相关模式文件中。新模式是对此技能最有价值的贡献。