文章总结: 本文实测snykagentscan工具,用于扫描MCP服务器和skill中的提示注入、恶意代码及凭证泄露等风险。工具可自动发现多种agent配置,支持四层作用域扫描,输出0-1000分风险指标。建议在沙箱中运行,注意数据边界,报告需人工复核。
综合评分: 82
文章分类: ai安全,安全工具,漏洞分析,恶意软件
「MCP安全扫描实测」Snyk Agent Scan:一条命令扫出MCP服务器提示注入、恶意Skill与凭证泄露
原创
句芒安全实验室
句芒安全实验室
句芒安全实验室
2026年9月21日 14:43
上海
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
过去一年句芒给你推的 AI 安全工具,大多在回答一个问题:模型和 Agent 能被怎么打。但真到了你自己动手搭 Agent 的时候,麻烦往往不在模型那一层——而在你装进 Agent 里的那一堆东西:MCP 服务器、Skill、插件。
这些东西绝大多数是从网上抄来的配置,粘进 mcp.json 就能用,你根本没读过它的工具描述里写了什么。而这恰恰是 2026 年最现实的攻击面:工具投毒、工具影子、间接提示注入,全都藏在”看起来很正常”的配置和 Skill 描述文本里。
今天句芒深推一个专门查这个的工具:Snyk Agent Scan。
先核身份:它不是小作坊,但换了门牌
按老规矩,发布前用 GitHub API 当天核实。仓库地址是 snyk/agent-scan,3076 颗星、278 个 fork,Python 实现,Apache-2.0 协议。2025-04-07 建仓,最近一次推送是 2026-09-19——也就是两天前还在改。
这里有个很多人会踩的坑:这个仓库以前叫 invariantlabs-ai/mcp-scan。它原本是 Invariant Labs 的项目,后来 Invariant Labs 被 Snyk 收编,仓库整体迁到了 snyk/agent-scan,名字也从 mcp-scan 改成 Agent Scan。你现在去访问老地址,GitHub 会返回 301 永久跳转,脚本里如果写死了老路径,某些情况下会拿到一个”Moved Permanently”的 JSON 而不是仓库信息——不是仓库没了,是门牌换了。
最新版本是 v0.6.3(2026-09-10 发布),同时提供 Linux/macOS/Windows 的独立二进制、SBOM 和 GPG 签名的校验和文件。
它到底干什么:扫你机器上”Agent 装了什么”
一句话概括它的定位:发现你机器上所有 Agent 组件(Agent 本体、MCP 服务器、Skill),然后把它们扫一遍,找提示注入和漏洞。
注意这个”发现”的覆盖面——README 里列了一张表,能自动识别 Windsurf、Cursor、VS Code、GitHub Copilot、Claude Desktop、Claude Code、Gemini CLI、Kiro、OpenCode、Antigravity、Codex、Amazon Q,还有 OpenClaw 和 Amp 的 Skill。而且它不只是扫你当前项目,配置作用域分四层:
- System:机器级/管理员下发/企业统一下发的配置(
managed-mcp.json、/etc、/Library/Application Support这类路径) - User:你 home 目录下的配置,跨所有项目生效
- Project / workspace:只在打开的项目里生效的配置
- Extension / plugin:装在扩展或插件里的组件
这个分层很重要。句芒见过太多人只检查自己项目里的 .mcp.json,结果被企业统一下发或某个扩展里塞的服务器绕过去。
它扫哪些风险:MCP 四类 + Skill 九类
v0.6 之后它把结果做成打分制的风险指标,不是简单的一串报错码。每条指标都带 0–1000 的分数和人类可读的证据,分数分四档:100(Low)、300(Medium)、600(High)、1000(Critical)。
MCP 服务器侧主要有四类:
prompt_injection_tool_desc(工具描述里的提示注入):工具描述里混进了”越界”的指令性文本,模糊了”描述性元数据”和”给 Agent 的命令”之间的界线。这类内容可以覆盖用户意图、套取数据、或者让 Agent 干坏事。untrusted_content(不可信内容):服务器把攻击者能提交数据的内容通道暴露给 Agent——邮件、issue 跟踪器、工单系统都算。Agent 处理这些内容时就会吃到间接提示注入。private_data(私有数据):服务器能取到敏感非公开数据,比如个人通信、财务记录、凭证。这类数据一旦进了 Agent 上下文,提示注入的后果就被放大。destructive_capabilities(破坏性能力):服务器暴露了能改共享基础设施、执行系统命令、影响其他用户和服务的工具。
Skill 侧更多,覆盖到 prompt_injection_skill_instructions(Skill 指令里的隐藏操纵性指令)、suspicious_download_url(让 Agent 从不可信/被混淆的位置下载并执行内容)、malicious_code(数据外泄、凭证窃取、后门、混淆载荷)、insecure_credential_handling(让 Agent 直接摆弄 API key/token/密码)、secret_detection(Skill 里直接躺着真实密钥而不是占位符)、direct_money_access(直接给 Agent 支付/银行/钱包/交易系统的权限)、third_party_content_exposure、unverifiable_dependencies(运行时从远端 URL 拉可执行代码,行为能随时变)、modifying_system_services(改系统文件、服务、用户、权限)、missing_skill_md(Skill 里连 SKILL.md 清单都没有)。
这份清单句芒建议你逐条读一遍原文,它其实是把”Skill 生态的威胁模型”用可检测的形式写出来了。
上手:一条命令,但先准备 token
它不发 npm 包,两条路选一条:用 uvx 跑 Python 包,或者去 Releases 下对应平台的独立二进制。
# 先拿 token:snyk.io 注册 → app.snyk.io/account 里 API Token 处复制
export SNYK_TOKEN=你的token
# 扫整台机器(自动发现所有已知 MCP 配置和 Skill)
uvx snyk-agent-scan@latest
# 只扫一个配置文件或一个 Skill
uvx snyk-agent-scan@latest ~/.vscode/mcp.json
uvx snyk-agent-scan@latest ~/path/to/my/SKILL.md
# 只做发现、不做安全分析
uvx snyk-agent-scan@latest inspect
# CI 模式
uvx snyk-agent-scan@latest --ci --dangerously-run-mcp-servers
v0.5.x 和 v0.6 之后的命令不一样,别混:v0.5.x 要写 uvx [email protected](锁版本),输出是 issue code(E001/E002/E004 这类);v0.6 之后直接 @latest,输出是上面那些风险名 + 分数。两个版本用的是不同的分析 API(v0.5.x 走 2025-09-02,v0.6 之后走 2026-07-10)。
另外它自带一个故意做成有漏洞的 MCP 服务器用来演示:克隆仓库,在仓库根目录建一个 mcp.json 指向 demoserver/server.py,然后扫这个文件就能看到报告长什么样。想先看效果再去扫自己的机器,可以先拿这个练手。
内部原理:它是怎么扫的
流程分四步,理解这四步你就知道它为什么必须联网:
- 发现:翻你本地各种 Agent 的配置文件,找出装了哪些 Agent、哪些 Skill、哪些 MCP 服务器。
- 连接:对 MCP,它会真的连上服务器,把工具描述取回来——这一步很关键,见下面的避坑第一条。
- 分析:本地检查 + 把组件信息发给 Agent Scan 的分析 API 做验证。发出去的内容包括 Agent 应用信息、MCP 服务器配置和签名、工具名和工具描述、Skill 正文。
- 脱敏:配置值和文本里的密钥在传输前先做 redaction。
它也提供 Background 模式(MDM):定时扫机器,把结果上报到一个 Snyk Evo 实例,安全团队可以在一个地方集中看全公司的 Agent 供应链。这是企业玩法,个人用 Scan 模式就够了。
避坑:这几条不看清会出事
第一,扫 MCP 配置会真的执行里面的命令。 这是官方 README 里用加粗警告标出来的:Agent Scan 扫一个 MCP 配置文件时,为了拿到工具描述,它会按配置里写的 command 和 args 启动 stdio MCP 服务器——也就是说,配置里写什么,你机器上就跑什么。
所以:评估第三方或不可信的 MCP 配置时,必须在沙箱里跑(Docker 容器、虚拟机、或者一次性环境);交互模式下它默认会为每个服务器弹一次 y/n 确认,确认前先看清要执行的完整命令和参数;--dangerously-run-mcp-servers 这个标志会跳过确认直接启动全部服务器,只在你逐条确认过所有命令的可信环境里用,它出现在命令名里的那个词不是修辞。
第二,CLI 输出被官方标记为 experimental。 README 里连着两段说明:v0.5.x 的 issue code、字段名、严重度标签、响应结构都可能不通知就变;v0.6 之后的 risk 名、分数、字段名、响应结构同样可能不通知就变。官方明确写”不建议构建依赖特定 CLI 输出字段或风险名的生产流程”。所以拿它做人看的结果没问题,接进 CI 流水线去卡门禁要接受它会变。v0.5.x 这条线官方说计划废弃。
第三,清楚数据边界。 它的分析会把组件信息送到 Snyk 的接口,脱敏只覆盖配置值和文本里的密钥。企业版走的是 Snyk Evo 平台,官方说明 CLI 输出不保证和 Evo 平台上看到的一致。企业环境要先和账号团队对齐再决定怎么部署。
第四,仓库不收外部 PR。 README 里有一节直接写明 “Agent Scan is closed to contributions”,只收 issue 形式的建议和 bug 报告。所以别指望提 PR 改它的检测逻辑。
适合谁
- 自己搭 Agent、装了一堆 MCP 服务器的开发者:先跑一遍知道自己的攻击面有多大,尤其是你从别人博客/群里抄来的配置。
- 写 Skill 的人:发布前自查一遍,别把自己的 Skill 送进
secret_detection或insecure_credential_handling。 - 企业安全团队:要看全公司的 Agent 供应链,Background 模式 + Evo 是它的正经用法。
- 做 AI 安全研究的:
docs/risks.md那份清单本身就是一份可检测化的威胁模型,比很多论文的 taxonomy 好用。
最后提醒一句:这类工具的报告是线索不是结论。分数高不等于一定被打了,分数低也不等于干净——尤其是工具描述里那种很隐蔽的注入,检测和绕过一直在互相追。扫完报告要自己去看 evidence 里引用的原文,别只信那个数字。
仓库和文档自己翻:GitHub 搜 snyk/agent-scan,风险清单在 docs/risks.md,命令参数在 docs/cli-reference.md。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:句芒安全实验室 句芒安全实验室
句芒安全实验室《「MCP安全扫描实测」Snyk Agent Scan:一条命令扫出MCP服务器提示注入、恶意Skill与凭证泄露》