HTTP 响应头里的 prompt injection 攻击面与分层防御

HTTP 响应头可以承载外部可控的字符串,AI 代理把这些字符串拼进上下文时,间接提示注入就有了入口。2025 年公开的 CamoLeak 漏洞完整走通了这条路,攻击者在代码平台的拉取请求里埋入隐藏指令,让编程助手逐字符地把私有仓库内容和云访问密钥经平台自身的图片代理送出。风险成立要凑齐三个条件,不可信内容进入模型上下文、模型输出能触发自动的网络请求、出站流量缺少限制。

响应头为什么会进入模型上下文

浏览器渲染 HTML 要转义,AI 代理没有这层假设,它把工具的原始返回当自然语言读。代理抓网页时常用响应头判断内容类型,再把响应体和部分头字段拼进提示词。Content-Type、Content-Language、自定义调试头、Link 头里的文本都可能原样进入模型视野。攻击者只要能影响目标站点的响应头,就能写入指令。本地服务是同类入口。2026 年 4 月披露的一起漏洞里,某个开发者知识库工具默认把服务绑在回环地址、不加鉴权、还带通配符跨域头,恶意网页因此能写入持久化载荷,之后每次会话都重新喂给代理。

从注入到外传要凑齐哪几步

让模型读到一段恶意文本,通常不足以拿走数据。链条需要四步。

  1. 攻击者把指令写进代理会读取的位置,可以是响应头、隐藏注释或 JSON 字段。
  2. 模型把这段文本当成要执行的要求,而不是要转述的数据。
  3. 模型产出的内容能引发一次真实出站请求,载体常见的是渲染出的图片、链接预取或一次工具调用。
  4. 通道足够宽,能把敏感内容编进查询串、子域名字段或请求路径。

CamoLeak 的特殊之处在第四步,图片请求指向平台自己签过名的地址,外传流量走的是平台本人的域名。同类形态还有把数据编进 DNS 查询的子域名,容器里 HTTP 出站被禁但解析开放时这条路依然通畅。

加固顺序怎么排

  1. 建立不自动取回的约束,模型输出出现资源引用时不产生任何网络请求,除非用户明确点击或独立授权放行。
  2. 拆掉模型输出到工具调用的直连,凡由模型内容触发的调用都走一遍独立授权。
  3. 出站默认拒绝,白名单同时覆盖 HTTP 和 DNS,并把平台自身域名纳入审视。
  4. 渲染前检查输出,去掉动态的 Markdown 与 HTML,收紧 img-src、frame-src、connect-src 与更宽松的 font-src。
  5. 工具调用、记忆写入和流式分片都纳入审计,只查最终回答会漏掉攻击。

哪些做法看着有用其实不够

扫描输出里的可疑 URL 只能拦住低水平攻击,换成子域名编码就绕过,语义层面的检测也会被改写和翻译绕过。把提示词当保密对象也不成立,行业规范已明确提示词不应被当作安全控制手段。控制偏弱的系统会出现一种情形,安全组件已经标记了可疑的工具序列,外传仍然完成,因为工具图里那条通道没被同一个判定拦住。

适用边界与遗留风险

这套防御管的是不可信内容进入上下文后的外传环节,对模型被诱导产出错误结论帮助有限。允许用户自配目标 API 地址、允许代理读任意网页正文的场景,风险明显高于只做内部检索问答。判断暴露面可以照三个问题自查,模型输出能不能直接引发网络请求,出站白名单有没有把平台自身域名排除在外,DNS 解析是否参与数据编码。

常见问题

问,加了内容安全策略是不是就安全了。策略是必要的一层,攻击者已经演示过用更宽松的指令和平台内可信域名绕过只针对图片源的规则。

问,模型厂商修了漏洞还需要自己加固吗。修补针对具体实现,把模型输出当成不可信输入这条原则得由部署方落地。