MCP 让 Agent 能连数据库和文件系统,但多数 server 握着长期 API key。一次提示注入就能把仓库带走。本文给一套可落地的旁路代理方案,附成本和红队意见。
2026-11-13 · MCP、安全、最小权限
一句话:MCP 的安全问题不在工具本身,在"一次授权、永久有效"。把长期 key 换成按任务签发的短期令牌,是投入产出比最高的一步。
MCP server 通常这么装:你把一个长期 API key 写进配置,server 用它连数据库、文件系统、浏览器。之后每个 Agent、每个任务都用这把钥匙。
只要有一次提示注入成功,攻击者拿到的就是"你所有任务的权限之和"——不是当前任务需要的那个子集。这类事故的共同点是:授权粒度和任务粒度不匹配。
在 Agent 和 MCP server 之间插一层代理,按任务签发短期令牌。令牌里只放这次任务真正要用的工具。
| 环节 | 做法 |
|---|---|
| 签发 | 任务开始时申请令牌,只含该任务的工具与资源,5 分钟有效 |
| 校验 | 代理逐次校验调用;越权直接拦截,不转发 |
| 留痕 | 记录 who / what / when / 参数摘要 / 结果哈希 |
| 失效 | 到期自动失效,吊销即时生效 |
代理本身约 5 人日(估算);每次调用预计增加约 2.4 毫秒;不增加 token 成本。我们给自己定的验收线是:在 5 个 MCP server 上接入测试,越权调用拦截率 100%、延迟增幅低于 5 毫秒。这是验收标准,不是已经跑完的实测数据。
5 分钟令牌到期,长任务怎么办?续期时用户不在场,如果不加约束,等于又变回长期权限。
我们最终补的规则是:续期必须由人类确认,且只允许"同一任务、未超预算"时续 5 分钟,每次续期写审计。不自动续。这一条不写清,前面的设计全部作废。
先别上代理。第一步是把所有长期 key 列出来,标出每个 key 的任务范围;第二步把范围最大的那个拆成两个;第三步再考虑代理。拆 key 是零成本的,代理要五个人日。
在 Agent 与 MCP server 之间加一层代理,按任务签发短期、只含必要工具的令牌,越权调用直接拦截并留痕。
长期 key 的权限是任务权限的并集,一次提示注入就能拿到全部权限,而不是当前任务需要的那部分。
要。长任务续期时用户往往不在场,自动续期会让短期令牌退化成长期权限,必须在续期环节加人工确认。
代理约 5 人日,每次调用增加约 2.4 毫秒延迟,不增加 token 成本。