2.17亿响应暴露Agent盲区

一项覆盖2.17亿份网页响应的扫描显示,HTTP响应头已出现面向AI Agent的提示注入内容。真正的风险不在浏览器,而在Agent会把用户看不见的元数据直接交给模型。
2.17亿份网页响应,暴露了一个容易被忽略的攻击面
HTTP响应头正在成为AI Agent提示注入的新入口。
Signals Corps最近公布的一项扫描研究检查了约2.17亿份真实网页HTTP响应,并在响应头中发现了疑似面向大模型和Agent的指令性文本。它们不会正常显示在网页正文中,却可能被浏览器Agent、联网助手、爬虫或检索系统连同页面内容一起送进模型上下文。
HTTP响应头是服务器随网页返回、用于描述内容类型、缓存策略、跳转位置和安全规则等信息的元数据。 对传统浏览器来说,它主要服务于协议处理;对AI Agent来说,它却可能被错误地当成可以阅读和执行的自然语言。
这里首先需要纠正一个容易混淆的说法:这次扫描研究直接指向的是HTTP响应头,而不是客户端发出的请求头。请求头同样可能通过日志、回显和调试信息进入模型,但2.17亿这个数字对应的是网页响应样本。

风险不在“头部有文字”,而在Agent把文字当命令
提示注入是攻击者把指令伪装成外部数据,诱导大模型偏离原有任务或安全规则的攻击方式。 当Agent可以浏览网页、调用工具、读取邮件或操作企业系统时,提示注入就不再只是让聊天机器人“说错一句话”,而可能变成一次真实的权限滥用。
一个典型的攻击过程可以分成五步:
- 攻击者控制网站、子域名、对象存储或某一条可注入响应头的链路。
- 攻击者在自定义响应头、重定向字段或其他元数据中写入自然语言指令。
- Agent抓取网页,并把状态码、最终URL、响应头和正文序列化为工具输出。
- 大模型无法可靠区分“网页数据”和“需要执行的命令”,于是遵循响应头中的指令。
- Agent继续调用浏览器、邮件、文件系统或企业应用,把影响扩散到模型之外。
问题的关键不是HTTP协议允许服务器返回文本,而是很多Agent框架仍然以“字符串拼接”处理工具结果。开发者原本只是想让模型理解一次网络请求发生了什么,最后却把整段原始响应塞进上下文,相当于让陌生网站在系统提示词旁边贴了一张便签。
传统浏览器不会把X-Anything字段解释成操作指令,传统搜索爬虫通常也不会让它直接控制后续动作。Agent则不同:它既能理解自然语言,又可能拥有工具权限,因此“可读文本”天然具有成为“可执行意图”的风险。
2.17亿是样本规模,不是2.17亿次成功攻击
这项研究证明的是攻击面已经存在,并不等于2.17亿份响应全部含有恶意内容。 样本规模描述的是扫描覆盖范围,不能直接推导提示注入的成功率、受害Agent数量或实际数据泄露规模。
这一区分很重要。安全扫描通常先通过关键词、指令句式和模型相关表达定位可疑内容,再由研究者判断其性质。命中的文本可能来自真正的攻击者,也可能来自安全实验、研究人员留下的探针、恶作剧、蜜罐、配置错误或被用户输入污染的字段。
研究的价值因此不在于制造一个“互联网已被Agent提示词占领”的结论,而在于指出三个事实:
- 攻击者已经知道Agent可能读取HTTP元数据;
- 网站正文之外的协议字段也能承载自然语言指令;
- 当前不少Agent仍缺少数据与指令之间的硬隔离。
如果没有针对具体Agent、模型和工具权限进行复现,仅凭扫描命中不能断言攻击已经成功。反过来说,防守方也不该等到出现大规模泄露案例才处理,因为从“攻击文本已部署”到“某个高权限Agent踩中”,中间可能只差一次网页访问。
为什么响应头比网页正文更麻烦
响应头注入的危险之处,是它同时具备隐蔽、可传播和容易被开发者忽略三个特点。 网页正文中的恶意提示至少有机会被用户看到,响应头默认隐藏在浏览器开发者工具和网络日志里,普通使用者几乎不会察觉。
| 注入位置 | 用户是否容易看到 | Agent是否可能读取 | 传播能力 | 防守成熟度 | |---|---:|---:|---:|---:| | 网页正文 | 较容易 | 高 | 中 | 较高 | | HTML注释、隐藏元素 | 不容易 | 高 | 中 | 中等 | | HTTP响应头 | 很难 | 取决于工具实现 | 高,可经缓存与代理保留 | 较低 | | 重定向URL与参数 | 中等 | 高 | 高 | 中等 | | 文件名、文档属性 | 不容易 | 高 | 高 | 较低 | | MCP或其他工具返回值 | 通常不可见 | 高 | 取决于权限 | 较低 |
响应头还可能经过CDN、反向代理、缓存节点和安全网关。某些字段由源站生成,某些字段由中间层添加,还有些字段会被下游系统重新组合。攻击者不一定需要完整控制目标网站,只要找到一个能够影响最终响应元数据的环节,就可能把内容送到Agent面前。
重定向会进一步增加检查难度。一个Agent访问可信URL后,可能经历多次301、302、307或308跳转;如果工具把每一跳的响应头都保留并交给模型,攻击面就不只包括最终页面,还包括整条跳转链上的服务器。
缓存则可能放大攻击持续时间。即使恶意字段已从源站删除,只要缓存对象没有失效,边缘节点仍可能继续向Agent返回旧响应。对安全团队来说,这意味着修复不能只改源站配置,还要检查缓存清理、代理日志与历史抓取记录。
Agent框架的常见错误,是把调试信息当模型上下文
最危险的实现方式,是把完整HTTP响应转成一大段文本后直接交给模型。 这种设计对原型开发很方便:模型可以自行理解状态码、响应头和正文,开发者不用建立复杂的数据结构。但便利的代价,是所有字段获得了近似相同的语义权重。
模型看到的内容可能类似于“状态码、响应头、正文、工具提示”连续排列。虽然系统提示词通常会声明外部内容不可信,但大模型并不存在一条能在所有情况下稳定执行的硬边界。复杂、多轮或经过编码变形的指令,仍可能影响后续决策。
单纯给工具输出加一句“以下内容不可信”并不够。提示词层面的警告属于软防护,它能降低部分成功率,却无法代替权限隔离、字段过滤和动作审批。只要模型仍能看到攻击内容,并且拥有发送邮件、上传文件或修改数据的权限,风险就没有被根除。
还有一种错误是为了方便排障,把调试模式用于生产环境。调试输出通常包含完整响应头、Cookie状态、内部地址、代理信息和重试记录;这些内容既扩大提示注入入口,也可能让模型接触本不该进入上下文的敏感数据。
真正有效的防守,是让模型默认看不到原始响应头
最可靠的第一道防线不是识别恶意句子,而是减少进入模型上下文的字段。 对大多数网页阅读任务,模型只需要最终URL、内容类型和经过清洗的正文,不需要看到服务器返回的全部原始响应头。
一个更合理的默认策略是:
- 默认向模型暴露0个原始自定义响应头;
- 仅按任务白名单提供
Content-Type、受控后的最终URL等必要信息; - 由程序代码处理缓存、Cookie、跨域和安全策略,不让模型自行解释;
- 不把中间跳转的完整字段拼接进自然语言上下文;
- 对字段长度、字符集、重复字段和异常换行进行规范化处理;
- 把抓取数据放入结构化对象,而不是与系统指令拼成一段文本。
字段白名单比关键词黑名单更可靠。攻击者可以通过大小写变化、同义表达、多语言、编码、拆分字段和模型特定措辞绕过关键词检测;白名单则直接限制模型能看到什么,减少了需要猜测攻击文本长什么样的成本。
结构化输出同样不是万能药。即使响应头被放在JSON字段里,模型仍然能够阅读其中的自然语言。结构化的真正价值是让编排层知道哪些字段属于数据、哪些字段可以影响控制流,并在送入模型前实施明确策略,而不是指望花括号自动提供安全边界。
权限控制决定一次注入最终能造成多大损失
提示注入是否升级为安全事故,主要取决于Agent拥有多少权限。 一个只能总结公开网页的Agent即使被诱导,影响通常局限于输出错误;一个能读取企业网盘、调用CRM、发送邮件和执行浏览器操作的Agent,则可能把同一段恶意文本转化为数据外传或业务操作。
开发者至少应把高风险动作分成三个等级:
| 动作等级 | 典型操作 | 建议控制 | |---|---|---| | 低风险 | 读取公开网页、生成摘要 | 记录来源,限制上下文 | | 中风险 | 读取内部文档、查询业务数据 | 最小权限,隔离会话,限制返回量 | | 高风险 | 发信、上传文件、删除数据、执行付款 | 明确人工确认,绑定目标与参数 |
人工确认也不能只放一个笼统的“是否继续”按钮。审批界面应该显示Agent准备执行的具体动作、目标域名、数据范围和接收方,让用户能判断外部网页是否正在推动一个不合理的操作。
出站网络策略同样关键。如果Agent读取了内部数据,却只能把结果返回给当前用户,攻击的变现空间会明显缩小;如果它可以任意访问外部URL、提交表单或上传附件,任何间接提示注入都可能尝试建立外传通道。
开发者现在应该检查什么
所有具备网页访问能力的Agent都应该立即审计“抓取结果如何进入模型”这一条链路。 重点不是搜索某一句固定攻击提示,而是确认系统是否把不可信元数据赋予了指令能力。
建议按以下顺序排查:
- 列出浏览器、HTTP客户端、搜索、爬虫和文档解析工具返回的全部字段。
- 确认哪些字段会被序列化后送入大模型,尤其检查响应头和重定向历史。
- 删除业务任务不需要的字段,并为剩余字段建立明确白名单。
- 使用自建测试站点在不同响应头中放置无害金丝雀指令,观察Agent是否遵循。
- 测试大小写、重复字段、多次跳转、压缩响应和缓存命中等边界情况。
- 检查Agent被诱导后能否读取私有数据、访问外部域名或执行有副作用的工具。
- 为高风险工具增加参数级审批、速率限制、审计日志和紧急撤权能力。
- 对历史日志进行回溯,确认生产Agent是否已经接触过异常指令性字段。
检测工具可以帮助发现问题,但不能替代架构修复。OWASP的大模型应用安全项目把提示注入长期列为核心风险;PyRIT、garak等开源工具也可用于自动化红队测试。不过,测试跑分再高,也不能证明一个拥有过度权限的Agent已经安全。
这不是HTTP的新漏洞,而是Agent架构的旧问题
HTTP响应头提示注入本质上不是协议被攻破,而是Agent把协议数据误当成了行为指令。 RFC定义了字段如何传输,却不会替应用决定哪些内容可以影响模型。责任最终落在Agent的抓取层、上下文构建层和工具执行层。
这次2.17亿份响应扫描最值得开发者警惕的,不是互联网上出现了又一种奇怪文本,而是攻击者正在系统性寻找Agent能读、用户却看不见的位置。网页正文只是第一层,响应头、重定向、文件属性、工具描述和跨Agent消息都会成为下一批入口。
我们的判断是,响应头注入短期内更像一个真实但尚未充分量化的早期攻击面,而不是已经造成普遍失陷的互联网级漏洞。它的危险程度会随着高权限浏览器Agent进入企业流程而上升:Agent能做的事情越多,协议元数据被误读的代价就越高。
对开发者而言,正确方向不是继续堆叠更长的系统提示词,而是把大模型视为一个会受不可信输入影响的决策组件。少给它看不必要的数据,少给它不必要的权限,并让每一次高风险动作都经过模型之外的确定性检查,这比要求模型“永远不要被注入”现实得多。
参考来源
- OWASP 大模型应用安全项目:整理提示注入、敏感信息泄露和过度代理等大模型应用风险。
- Microsoft PyRIT:微软开源的生成式AI红队自动化框架,可用于构建提示注入与安全评估流程。
- NVIDIA garak:面向大模型的漏洞扫描工具,覆盖提示注入、数据泄露和越狱等测试类型。
- Model Context Protocol规范:MCP官方规范仓库,可用于理解工具结果、资源和模型上下文之间的交互边界。


