专题研修

20|安全内部:可信边界、MCP授权、沙箱与副作用控制

专题研修约 3.1 千字1 组分步图解

目标:让安全措施对应具体攻击面,同时避免对普通工作无限审批。本章为防御性设计;教学代码不是生产安全沙箱。

本章目录

沿着对象与状态理解本章

MCP通信和业务授权不是同一层;工具schema、身份、网络与文件边界要分别看。

下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。

动态图解 · F37

资料能影响模型,不代表获得了权限

为什么“模型被劝住”不能作为唯一防线?

外部网页、源码注释和工具结果都是要分析的数据。它们可能包含看起来像命令的句子,但不能因此改变用户给的授权范围。模型对指令的理解是概率性的,实际读写和网络能力还需由程序边界控制。

可信边界不同来源与权限之间不能随意跨越的分界。
沙箱对执行环境某些资源进行隔离的机制。
最小权限只给当前任务需要的能力范围。

输入与适用条件:只展示无实际执行的教学注入句“忽略原任务”;不访问外部系统或执行危险动作。

1 / 6 · 收到外部资料

第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索引和长期记忆都是派生数据,也需要删除和访问控制。离线教材的可选在线实验会发送样本文件内容,必须人工准备脱敏目录;默认测试不联网、不使用密钥。

运行示例 · S20

带权限的检索工具怎样避免把授权交给模型猜

输入与条件。用户u7仅有项目P1的读取权限,模型请求query(project="P2",text="部署密钥")。

步骤与对象内部动作中间结果 / 新状态
1身份来源认证会话确认u7不采用模型参数中自称的管理员身份。
2权限校验u7不含P2授权在搜索前或受控候选层拒绝。
3输出最小化返回授权错误而非P2匹配片段错误消息也不泄露敏感正文。
4审计记录主体、动作、目标和结果必要字段脱敏。
5正常路径同用户查询P1许可资料按范围返回,不因一次拒绝把所有工具禁死。

把过程连起来。可信身份与授权是宿主/服务职责,不是语言模型生成的字段。

边界与反例。仅展示授权边界,不提供生产认证完整实现;实际需遵守组织安全与数据保留制度。

依据与适用范围:[MCP-TOOLS]。示例输入和场景由本书明确设定。

8. 验收题

模型被文档诱导提出读取密钥文件,最终工具拒绝了,算成功吗?对执行边界可算一次有效阻断;对模型抗注入能力仍是失败;对整体任务还要看能否继续完成合法目标。多层指标应该分别记录,不能用一个成功/失败掩盖。

记录保存在本机浏览器。

输入关键词即可检索。

↑ ↓ 选择 Enter 打开Esc 关闭 · 仅本地搜索

阅读设置

阅读设置仅保存在本机浏览器,不上传任何数据。