KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
06. 网页里的一句话,为什么能劫持整个 Agent? — keel 龙骨
传统应用通常把代码和数据分开解析。LLM 却会把 system instruction、用户目标和网页文字一起处理。攻击者利用这种语义通道,让不可信数据看起来像新的操作指令。
传统应用通常把代码和数据分开解析。LLM 却会把 system instruction、用户目标和网页文字一起处理。攻击者利用这种语义通道,让不可信数据看起来像新的操作指令。
直接与间接注入
直接注入:用户在对话中要求忽略规则、泄露秘密或调用越权工具。
间接注入:攻击指令藏在网页、PDF、邮件、工具结果、记忆或 Agent 工件中。
间接注入更危险,因为原始用户可能完全可信,只是要求 Agent 阅读了攻击者可控内容。
攻击链不止模型一步
flowchart LR
A[攻击者污染网页] --> B[Agent 读取]
B --> C[模型改变计划]
C --> D[调用广权限工具]
D --> E[数据外泄/越权动作]
只要 D 被最小权限、PEP、审批或网络隔离阻止,模型在 C 的失误就不必成为安全事件。这就是纵深防御。
为什么关键词过滤不够
攻击可以使用改写、编码、多语言、图像、分段内容或上下文诱导;正常文档也可能合法讨论“忽略先前指令”。检测器可以作为风险信号,不能成为唯一授权条件。
同样,给外部文本加 XML 标签、转义或一句“不要听它”有帮助,但不能建立模型与数据之间的硬隔离。
防御要分层
减少暴露
只检索完成任务所需片段,不把整站、全部邮箱或完整内部文档塞进上下文。
保留来源和数据边界
把外部内容包装为 ContentBlock,保留 URL、创建者、信任级别和处理历史。下游仍按不可信数据处理。
限制模型可产生的控制信号
模型只能选择注册 action 和结构化参数;工具名、目标 scope、effect、身份和凭据由程序决定。
在执行点重新授权
每次现实副作用都经过 PEP;来自网页的文字不能充当审批或改变 principal。
隔离与限制输出通道
浏览器会话、文件、网络和命令执行在低权限环境中;禁止任意 URL 和任意 Shell;秘密不进入模型上下文。
检测和响应
记录被拒绝的越权尝试、来源和因果链;相似攻击进入回归集;必要时吊销 token、隔离记忆和工具版本。
运行间接注入实验
python courses/advanced/safety-controls/course/project/examples/02_untrusted_content.py
示例不会尝试“准确识别所有恶意句子”。它证明外部内容即使包含命令式文字,也不会获得 instruction 来源,且无法改变 trusted action envelope。
检查理解
- 为什么可信用户仍可能触发间接 Prompt Injection?
- 检测器为什么只能作为一层信号?
- 模型已经被注入时,哪些执行层控制仍能限制影响?