当大模型只能生成文本时,一次错误回答通常停留在界面里;当它能读取邮件、检索内部文档、执行代码或控制设备时,文本就可能变成动作。提示注入的危险不在于“模型被说服”,而在于系统把来自不同信任级别的内容放进同一个上下文,又让模型同时拥有决策权和执行权。

指令与数据必须分层

网页、文档、邮件和检索片段都应被视为不可信数据。它们可以提供事实,却不能自行提升为系统指令。仅在提示词里写一句“忽略文档中的命令”并不构成安全边界,因为模型仍在同一概率生成过程中处理所有文本。

工程上应把策略放到模型之外:运行时决定哪些工具可见,参数验证器决定哪些输入合法,授权层决定当前用户能执行什么动作,模型只提出候选调用。即使模型完全遵循了恶意文本,外部策略也应阻止越权动作。

工具应遵循最小权限

不要给一个通用“执行 SQL”工具,再期望模型永远只查询。读取文章列表、修改草稿和删除用户应是三个独立能力,拥有不同的身份要求和确认策略。工具描述需要明确输入、输出、错误和副作用,服务端还要再次校验资源所有权。

高风险工具可以采用两阶段协议:第一阶段只生成预览与影响范围,第二阶段在获得明确授权后使用短期令牌执行。令牌应绑定用户、动作、资源和过期时间,避免一次确认被复用到其他操作。

限制数据外流路径

提示注入常见目标不是直接破坏系统,而是把敏感上下文发送到攻击者控制的地址。系统需要控制网络出口、URL 域名、上传目标和响应体大小。能够访问私有数据的 Agent 不应同时拥有任意 HTTP 请求能力。

日志也可能泄露数据。执行轨迹应记录工具名称、参数摘要、授权结果和返回状态,但密码、令牌、完整文档与个人信息必须脱敏。用于调试的模型上下文快照要有独立权限和保留周期。

把确认放在真正的动作前

频繁弹窗会训练用户机械点击“允许”,所以不是所有调用都需要确认。只读、低风险且范围明确的操作可以自动执行;发送消息、发布内容、删除数据、修改权限和产生费用的动作,应在执行前展示目标、关键参数和影响。

确认不能发生在规划阶段后就永久有效。Agent 可能在后续步骤中改变目标,因此确认必须绑定最终调用。对于批量动作,要展示精确数量与资源范围,而不是一句含糊的“继续吗”。

用攻击轨迹评测,而不是只测拒答

安全测试至少覆盖四层:恶意用户输入、被污染的检索文档、工具返回中的二次注入,以及多轮对话中的权限混淆。评测结果不应只统计模型是否说出拒绝语句,还要检查危险工具是否真正被调用、参数是否越界、敏感数据是否离开允许边界。

可以为每条测试保留完整事件链:输入来源、检索证据、模型计划、策略判定、工具调用与最终输出。这样才能区分“模型判断正确”和“防护层兜住了错误”,也才能在更换模型后做回归测试。

适合个人站点的落地顺序

博客助手当前只需要读取公开文章和作者资料,因此知识库保持只读即可。后台文章管理则使用独立登录态和服务端权限,不向普通对话暴露。若以后加入邮件通知或服务器运维,应该拆成新的受限服务,并为外部发送与部署动作增加确认、审计和速率限制。

安全的 Agent 不是“从不犯错的模型”,而是一个即使模型犯错也难以越过边界的系统。把权限、验证和审计留在确定性代码里,才是工具调用真正可控的起点。

参考资料