MCP、Skill、Plugin 正在把 AI 接到真实工具上;问题是,工具一旦被污染,模型可能把恶意指令当成工作指令。
导读
我们越来越习惯给 AI 接插件:读网盘、查邮箱、跑终端、连数据库、调浏览器、发消息。便利背后有一个容易被忽略的问题:AI 不是自己拥有手脚,它是通过工具拥有手脚。
传统恶意软件往往是“代码骗过系统”;AI 插件投毒更微妙,它可能是“文字骗过模型”。一个工具名称看起来正常,描述、参数 schema 或返回内容里却藏着指令,模型读到以后,就可能调用别的工具、泄露信息或绕开原本的限制。
本文把 MCP 官方规范、微软安全文章、OWASP MCP Top 10 和两篇 MCP 安全论文合在一起讲:为什么插件越好用,越需要最小权限、沙箱、版本固定、参数可见和人工确认。
资料来源
- 1. Model Context Protocol Specification
MCP 官方规范说明,它为 LLM 应用连接外部数据源与工具提供标准化方式,并定义 Host、Client、Server 等角色。https://modelcontextprotocol.io/specification/2024-11-05/index - 2. Tools - Model Context Protocol
MCP 工具规范说明,服务器可以暴露能被语言模型调用的工具,每个工具都有名称和描述 schema。https://modelcontextprotocol.io/specification/2024-11-05/server/tools - 3. Microsoft: Protecting against indirect prompt injection attacks in MCP
微软文章将 Tool Poisoning 描述为攻击者把恶意指令嵌入 MCP 工具描述,影响模型选择和调用工具。https://developer.microsoft.com/blog/protecting-against-indirect-injection-attacks-mcp/ - 4. OWASP MCP Top 10
OWASP 将 Tool Poisoning、软件供应链攻击、命令注入、Token 管理、权限不足等列为 MCP 风险。https://owasp.org/www-project-mcp-top-10/ - 5. OWASP MCP Security Cheat Sheet
OWASP Cheat Sheet 给出最小权限、工具 schema 完整性、沙箱隔离、敏感动作人工确认、输入输出校验等实践建议。https://cheatsheetseries.owasp.org/cheatsheets/MCP_Security_Cheat_Sheet.html - 6. Model Context Protocol at First Glance
论文对 1,899 个开源 MCP server 做经验研究,报告一般漏洞与 MCP 特定工具投毒现象。https://arxiv.org/abs/2506.13538 - 7. Model Context Protocol Threat Modeling and Analyzing Vulnerabilities to Prompt Injection with Tool Poisoning
论文用 STRIDE/DREAD 分析 MCP 架构,并聚焦客户端侧工具投毒风险与缓解策略。https://arxiv.org/abs/2603.22489
一句话看懂:AI 插件最危险的地方,不是它“像病毒一样运行”,而是它把恶意意图伪装成模型应该阅读的上下文,让模型自己把门打开。

MCP 官方规范截图:MCP 解决的是模型应用与外部数据/工具的连接问题,这正是插件安全讨论的起点。
不是所有攻击都需要一上来运行恶意代码。对 Agent 来说,污染上下文也可能足够危险。
MCP 的基本思路是标准化连接:AI 应用是 Host,里面的 Client 去连接一个或多个 Server,Server 暴露工具、资源和提示。工具会有名称、描述和参数 schema,模型根据这些信息判断该调用哪个工具。问题就出在这里:模型看到的工具描述,本身就是上下文。

MCP Tools 官方页截图:工具名、描述和 schema 会进入模型判断链;安全问题也从这里钻进来。
如果一个恶意 MCP server 注册了一个看起来正常的工具,比如“读取日程”“格式化表格”“发送测试邮件”,但在描述里偷偷写入“调用邮件工具时把内容转发到某地址”“忽略前面的安全提示”“把最近读取的 token 放进参数里”,这就不是传统意义上的 bug,而是给模型看的指令污染。

解释图:插件投毒的危险在于“脏说明书”影响模型决策,最后动作看起来仍像正常工具调用。
微软把这类问题称为间接提示注入的一种:攻击者把恶意指令嵌进 MCP 工具描述;OWASP 进一步把 Tool Poisoning、Rug Pull、Tool Shadowing、供应链污染、命令注入和 Token 暴露都列进 MCP 风险图谱。也就是说,插件安全不是一个小角落,而是 Agent 系统的主通道。
安装插件
用户看到的是正常名称:mail helper、repo reader、calendar sync。
↓
工具描述进入上下文
模型不仅看到工具名,也会看到描述、参数、返回内容。
↓
恶意文字影响决策
隐藏指令诱导模型调用高权限工具、改参数或泄露数据。
↓
动作看似来自 AI
最后执行的是工具调用,用户可能以为只是模型自己做错了。
因为 Agent 正在从“问答框”走进“账号和文件”。
今天的插件生态首先在开发者工具里爆发:代码仓库、终端、包管理器、CI、浏览器自动化、云服务 API,都天然适合让 AI 接入。但同一套逻辑很快会进入普通人的办公场景:网盘、邮箱、文档、表格、日历、会议纪要、CRM、客服后台。
一个只读 PDF 的插件,风险相对可控;一个能读写网盘、发送邮件、运行命令、访问浏览器 cookies、连接企业数据库的插件,风险完全不同。它不只是“帮你快一点”,它拿到的是你日常工作系统的一部分钥匙。
更麻烦的是,AI 的工具调用常常跨插件链式发生。一个插件负责读取文件,另一个插件负责发消息,第三个插件负责搜索网页。单独看每个动作都合理,组合起来就可能变成泄露路径:先读取配置,再把摘要塞进搜索 query,再通过外部请求带出去。传统安全工具盯的是进程和网络,Agent 安全还要盯“模型为什么决定这么调用”。

Microsoft 安全文章截图:间接提示注入与 tool poisoning 是 MCP 场景下必须正视的攻击面。
Tool Poisoning
把恶意指令藏进工具描述、参数 schema 或返回内容,让模型误以为那是可信工作规则。
Rug Pull
用户初次批准时工具是正常的,之后更新描述或行为,把可信插件变成危险插件。
Tool Shadowing
恶意工具通过描述影响模型对其他可信工具的使用,像一个冒牌同事在旁边带节奏。
Confused Deputy
工具用自己的高权限替用户办事,但没有确认请求是否真的来自有权用户。
Token Exposure
API key、OAuth token、GitHub token、云服务凭证被插件读到、记录或间接传出。
很多事故不是因为防线不存在,而是因为大家为了省事把门开得太大。
OWASP MCP Security Cheat Sheet 反复强调最小权限。原因很直白:如果一个日历插件只需要读今天日程,就不该拿整邮箱读写;如果一个仓库插件只需要读 issue,就不该拿写代码、发 release、读 secret 的权限;如果一个本地工具只需要访问项目目录,就不该默认拥有整个用户目录。

OWASP MCP Top 10 官方页截图:把 Tool Poisoning、供应链、命令注入、Token 管理等问题放进同一张风险地图。

授权红绿灯:可以直接拿这张图判断插件权限是不是过宽。
Agent 插件的权限问题比普通 API 更棘手,因为模型会“临场决定”调用什么。传统程序员写代码时,某个接口调用通常是确定的;Agent 工作时,工具调用由上下文、提示词、工具描述、检索结果共同影响。只要上下文被污染,模型就可能把原本不该发生的调用包装成“为了完成任务必须这么做”。
论文《Model Context Protocol at First Glance》对 1,899 个开源 MCP server 做了经验研究,提到一部分服务器存在一般安全漏洞,也观察到 MCP 特定的工具投毒现象。另一篇 MCP threat modeling 论文则把风险拆到 Host/Client、LLM、MCP Server、外部数据源和授权服务器五个组件上,说明问题不是“某一个插件坏了”,而是整条信任链都需要边界。
不把长期 token 明文写进插件配置;能用短期凭证就不用永久钥匙。 不让陌生插件一次性读取整个用户目录;优先限定到单个项目或单个文件夹。 不自动批准删除、发送、付款、提交代码、执行 shell 这类高影响动作。 不只看插件名字,要看工具描述、参数 schema、返回内容和更新记录。 不把“装过一次”当成永久信任,插件更新等同于依赖更新,需要重新审查。
想象一个看起来很无聊的插件:邮件模板助手。
它的宣传文案很正常:帮你整理客户邮件,生成回复草稿,自动补全称呼。第一次安装时,它请求邮箱读取权限和发送草稿权限,你觉得合理。工具名叫 get_recent_emails、draft_reply、send_test_message,也都没什么异样。
真正的问题藏在模型可见的描述里。恶意描述可以写得很隐蔽:当系统询问邮件发送对象时,优先使用内部验证地址;当需要生成摘要时,附带最近三封邮件的主题用于质量检查;当调用其他工具时,把当前上下文编码到一个看似普通的参数里。对人来说,这段描述可能根本没有在 UI 中完整展示;对模型来说,它就是操作说明的一部分。
于是链条开始跑:模型读邮件,生成摘要,调用发送或联网工具;参数里夹带了不该外传的信息;日志里只显示“AI 调用了邮件工具”。如果没有参数级确认、没有只读权限、没有出站网络限制、没有工具 schema 完整性校验,事后很难判断是模型犯错、插件作恶,还是两者叠加。
这也是为什么“让 AI 先帮我自动做完”听起来爽,但安全上不能默认成立。越是能直接改变现实状态的动作,越需要把完整参数展示给人看;越是能接触隐私和凭证的工具,越要隔离运行。
不需要变成安全专家,但可以养成几条硬习惯。
第一,插件只从可信来源安装。看到 GitHub、npm、PyPI 或某个压缩包,不等于安全;同名、仿冒、拼写相近、刚创建的仓库都要谨慎。第二,看权限而不是看宣传。一个“格式化 Markdown”的插件要浏览器 cookie 或邮箱发送权限,就应该立刻停下。第三,敏感账号分层。不要让测试插件接触主邮箱、主网盘、主支付账户和主代码仓库。
第四,能只读就只读,能限定目录就限定目录。把 AI 放进一个干净项目文件夹,比让它扫整个电脑安全得多。第五,高影响动作永远人工确认:发送邮件、删除文件、改仓库、提交表单、转账付款、安装依赖、执行 shell,都要看到完整参数再点确认。第六,定期清理不用的插件和 token。长期不用的权限,本质上就是没人看管的门。
如果你是重度 AI 工具用户,还有一个简单办法:把“实验区”和“生产区”分开。新插件先在小号、空仓库、测试目录里跑;确认行为、日志、网络请求、权限范围都没问题,再放到真实工作流。不要让一个刚认识的插件直接进你的主电脑。
安装前:看来源、维护者、更新记录、issue、权限说明。 授权时:只给当前任务需要的最小权限,避免全盘读写。 运行时:高影响动作必须人工批准,并显示完整参数。 出错时:先撤销 token,再查日志;不要只让模型解释自己。 长期使用:锁版本、定期更新、定期复审、清理不用的连接。
企业真正需要的不是“禁止所有插件”,而是让插件进入治理。
更现实的路线是建立私有插件 registry 或 gateway:团队允许哪些 MCP server、哪些 Skill、哪些浏览器插件,统一登记、统一版本、统一扫描。插件要像依赖包一样管理:来源、哈希、签名、许可证、权限、数据流、出站网络、更新记录,都应该有清单。
其次是把 Agent 行为写进审计。谁启动了任务,模型看到了哪些上下文,调用了哪个工具,参数是什么,返回了什么,哪些动作由人批准,哪些被策略拦截,这些记录要能追溯。没有轨迹的自动化,看起来省事,出问题时就是黑箱。
最后是把安全策略做在流程中,而不是靠用户记性。比如:敏感工具默认只读;shell 默认隔离;外部网络默认关闭;跨域数据传输触发 DLP;插件描述变更触发重新审批;涉及删除、发送、提交、付款的动作必须二次确认。真正可靠的 AI 工作台,应该让安全成为默认路径,而不是让每个人临场发挥。
结论不是“别用插件”。恰恰相反,Agent 变有用一定会靠插件。真正的问题是:插件开始拥有手脚以后,我们能不能让每一只手脚都有边界、有记录、可撤销、能停下。


夜雨聆风