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。

检查理解

下一章:工具、代码和网络如何把文本风险放大?

进入 keel 阅读