20|安全内部:可信边界、MCP授权、沙箱与副作用控制
目标:让安全措施对应具体攻击面,同时避免对普通工作无限审批。本章为防御性设计;教学代码不是生产安全沙箱。
本章目录
沿着对象与状态理解本章
MCP通信和业务授权不是同一层;工具schema、身份、网络与文件边界要分别看。
下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。
资料能影响模型,不代表获得了权限
为什么“模型被劝住”不能作为唯一防线?
外部网页、源码注释和工具结果都是要分析的数据。它们可能包含看起来像命令的句子,但不能因此改变用户给的授权范围。模型对指令的理解是概率性的,实际读写和网络能力还需由程序边界控制。
输入与适用条件:只展示无实际执行的教学注入句“忽略原任务”;不访问外部系统或执行危险动作。
1 / 6 · 收到外部资料
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
读到一条命令样式的句子,不意味着这是新的用户请求。
本步状态由图形与说明共同给出。默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
为什么需要
限制错误或恶意输入能造成的真实损害。
怎样实现
源信息分层与执行隔离配合,按操作风险决定人工确认。
可能的代价与误解
只有文件隔离没有网络限制,或只限制Shell却忽略外部MCP,都可能留下空隙。
如何判断是否做对
用受控的越权尝试检查实际边界,并验证正常任务仍可完成。
1. 先画数据与权限流
用户授权进入宿主;模型读取上下文提出动作;工具执行器携带某个身份访问文件或服务;结果进入模型与日志。每条边都可能扩大信息或操作范围。威胁建模要问谁控制输入、谁持有凭据、谁能产生副作用,而不是只列“Prompt Injection”这个词。[N83]
外部文档、代码注释、网页、检索结果和工具返回通常属于低可信数据。它们可以包含与任务相关的内容,也可能试图改变模型目标。提示模型忽略恶意指令有帮助,但不能成为唯一防线;执行器必须限制动作范围。
用户要求总结文档,不等于授权文档作者要求发送邮件。一个网页自称来自管理员,也不因此获得管理员权限。身份由可信执行环境确定,不由正文声明。
2. 提示注入、数据污染与记忆污染
直接注入来自请求,间接注入藏在被读取内容中。更隐蔽的链条是恶意内容先影响摘要,再被存成长期记忆,后续作为“已验证经验”反复使用。防御要保留来源和权威,不让派生内容自动升级信任。
检索层应限制可见资料;上下文层标明不可信内容;执行层限制可做动作;输出层检查是否泄露敏感信息;记忆层控制写入与生命周期。任何一层都不能保证独立解决全部问题,但分层能减少单点误判的后果。
安全测试应包含正常任务,避免防御把所有复杂输入都拒绝。指标包括攻击成功率、正常任务误拦、额外延迟与人工审批负担。目标是适度自主性与可控风险,不是让Agent永远不能行动。
3. MCP是协议,不是信任通行证
MCP区分Host、Client、Server,支持工具、资源等接口。发现一个工具,只说明接口可被列出;调用还需要传输、身份、授权和服务端检查。工具描述不是权限证明。[N28]
本书核查的授权规范版本为2026-07-28。其HTTP授权流程使用OAuth相关机制,明确资源目标与令牌用途;STDIO传输的凭据处理与HTTP流程不同,不能把同一套网页登录步骤机械套用到本地进程。[N29]
业务层还要检查用户能否访问具体资源。获得一个允许调用files:read的令牌,不意味着可以读系统中所有人的文件。不要把模型提供的tenant字段当可信身份;应由会话与授权上下文绑定。跨服务转发令牌必须符合受众/资源约束,不能把一个服务的token随意透传给另一个。
4. 最小权限与能力边界
只读研究任务通常只需要读取样本目录或查询API;代码修改需要限定仓库和分支;部署需要额外明确批准。不要为方便默认提供主机任意Shell、整个用户目录和所有凭据。
工具可以按具体能力拆分,例如读取、生成补丁、运行预设测试、提交变更。也可以保留通用Shell但放在强隔离环境中。前者接口更多,后者隔离要求更高;选择取决于任务与运行环境,不是工具越细越安全。
审批应集中在越界、不可逆、高价值或外部副作用动作。每次ls都确认可能造成疲劳,最后用户机械同意真正危险操作。用沙箱与允许列表减少低风险审批,把注意力保留给高后果决策。
5. 路径检查与TOCTOU
检查resolve()是否位于根目录有助于拒绝普通路径越界,但在检查和打开之间,符号链接或目录可能被并发改变。硬链接、挂载和平台路径语义也会复杂化。因此本书journal.py和live_readonly.py明确不是面对恶意文件系统的完整沙箱。
更强的实现可使用目录句柄相对打开、安全标志、容器文件系统、限制写者和网络出口。采用哪一种需要操作系统与部署条件支持。不要把一段字符串过滤正则称为跨平台安全边界。
对测试执行,同样不要在高权限主机直接运行不可信仓库代码。测试脚本本身可以删除文件或发网络请求,应在隔离环境、受限网络与资源配额下运行。
6. 外部副作用的安全语义
发送邮件、创建工单、支付、删除、部署等动作需要目标对象、身份、批准与幂等性。模型输出参数变化后,旧批准可能不再适用;批准应绑定具体操作内容或范围,不能只记“用户已经说过同意”。
超时后的unknown必须对账,不应自动重复。回滚也不是万能:删除的数据可能无法恢复,邮件发出无法真正收回,数据库迁移可能不可逆。预先定义可恢复边界,比事后让模型解释更可靠。
7. 日志、密钥与数据保留
不要把密钥放进Prompt、源码示例或完整Trace。日志里保留必要的请求ID、操作类型、版本与摘要,敏感内容按权限和保留策略存储。调试方便不能成为无限保存全部用户数据的理由。
答案缓存、Embedding索引和长期记忆都是派生数据,也需要删除和访问控制。离线教材的可选在线实验会发送样本文件内容,必须人工准备脱敏目录;默认测试不联网、不使用密钥。
带权限的检索工具怎样避免把授权交给模型猜
输入与条件。用户u7仅有项目P1的读取权限,模型请求query(project="P2",text="部署密钥")。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1身份来源 | 认证会话确认u7 | 不采用模型参数中自称的管理员身份。 |
| 2权限校验 | u7不含P2授权 | 在搜索前或受控候选层拒绝。 |
| 3输出最小化 | 返回授权错误而非P2匹配片段 | 错误消息也不泄露敏感正文。 |
| 4审计 | 记录主体、动作、目标和结果 | 必要字段脱敏。 |
| 5正常路径 | 同用户查询P1许可资料 | 按范围返回,不因一次拒绝把所有工具禁死。 |
把过程连起来。可信身份与授权是宿主/服务职责,不是语言模型生成的字段。
边界与反例。仅展示授权边界,不提供生产认证完整实现;实际需遵守组织安全与数据保留制度。
依据与适用范围:[MCP-TOOLS]。示例输入和场景由本书明确设定。
8. 验收题
模型被文档诱导提出读取密钥文件,最终工具拒绝了,算成功吗?对执行边界可算一次有效阻断;对模型抗注入能力仍是失败;对整体任务还要看能否继续完成合法目标。多层指标应该分别记录,不能用一个成功/失败掩盖。