互联网缓存污染(Internet Cache Poisoning)
-
基础概念:什么是缓存?
为了理解缓存污染,必须先明白“缓存”是什么。在互联网中,缓存是一种临时存储数据副本的技术,旨在后续更快地响应对相同数据的请求。常见的缓存位置包括:用户的浏览器、公司或家庭的代理服务器、互联网服务提供商(ISP)的网络以及内容分发网络(CDN)的服务器。当您第一次访问一个网站时,您的请求会经过这些可能存在的缓存节点,最终到达源服务器获取数据。返回的响应(如图片、样式表、网页)可能会被途中的一个或多个缓存节点存储下来。 -
缓存的工作原理与关键:缓存键
缓存不是盲目存储所有内容。它需要判断两个请求是否“相同”,以便决定是返回存储的副本还是继续向源站请求。这个判断依据就是“缓存键”。一个典型的缓存键由请求的多个特征组合而成,最核心的通常是 URL(统一资源定位符) 和 请求头(如Host头)。例如,对https://www.example.com/home的请求,其缓存键可能包含https://www.example.com/home和Host: www.example.com。只有当下一个请求的缓存键与已存储的条目完全匹配时,缓存才会命中并返回旧响应。 -
污染的本质:什么是缓存污染?
互联网缓存污染,也称为缓存投毒,是一种攻击技术。攻击者通过精心构造请求,诱使缓存服务器(如CDN、代理服务器)将一个错误的、恶意的响应内容与一个合法的缓存键关联起来并存储。成功之后,所有后续使用该合法缓存键来请求资源的其他用户,都会从缓存中接收到这个被污染的恶意响应,而非来自源服务器的正确内容。这相当于攻击者“污染”了公共水源(缓存),影响了所有喝水的人(用户)。 -
攻击的起点:未规范化的请求
缓存污染攻击常常利用缓存服务器与源服务器对请求解析不一致的漏洞。一个常见入口是 HTTP 请求走私,但更直接的方式是利用对请求头和URL的不规范处理。例如,攻击者可能发送一个包含两个Host头的请求,或者一个Host头与URL中的主机名不一致的请求。如果缓存服务器和源服务器以不同方式“理解”这个有歧义的请求(例如,各自选择了不同的Host头值来构建缓存键或处理业务逻辑),就会导致安全间隙。 -
核心攻击步骤:如何实现污染?
攻击流程通常分两步:- 第一步:注入恶意响应。 攻击者向缓存服务器发送一个精心构造的、带有歧义的请求。这个请求的目的地是目标网站的一个正常页面(例如
/home)。由于请求存在歧义,缓存服务器可能以一种方式解析它(例如,使用Host: attacker.com作为缓存键的一部分),并将其转发给源服务器。而源服务器则以另一种方式解析它(例如,忽略错误的Host头,实际处理www.victim.com/home),并生成对该正常页面的正确响应。 - 第二步:固化污染条目。 关键来了:当源服务器的正确响应返回到缓存服务器时,缓存服务器会依据自己解析出的缓存键(包含
attacker.com)来存储这个响应。然而,攻击者的目标是让其他普通用户的请求命中这个被污染的条目。因此,攻击者需要确保普通用户的合法请求(其缓存键包含www.victim.com)也能匹配到攻击者创建的缓存键。这通常需要利用缓存服务器在匹配缓存键时存在的缺陷,例如忽略端口号、错误处理URL编码、或对头字段大小写不敏感等,使得attacker.com和www.victim.com在某些条件下被判定为“匹配”。
- 第一步:注入恶意响应。 攻击者向缓存服务器发送一个精心构造的、带有歧义的请求。这个请求的目的地是目标网站的一个正常页面(例如
-
污染的成功与影响
一旦上述步骤成功,污染就完成了。此后,任何不知情的用户尝试访问https://www.victim.com/home时,请求到达被污染的缓存服务器,服务器认为其缓存键命中,便会将之前存储的、来自攻击的响应(虽然内容是/home的,但攻击者可能已通过其他手段在其中注入了恶意脚本)返回给用户。攻击者借此可以发起大规模的攻击,如:- 窃取用户敏感信息(如Cookie、登录凭证)。
- 部署恶意软件或勒索软件。
- 进行网页篡改或诽谤。
- 将用户重定向到钓鱼网站。
-
防御与缓解措施
防御缓存污染需要多层协作:- 对网站运营者(源服务器): 使用完整的、规范的URL作为缓存键的基础;配置Web服务器严格验证
Host头,拒绝畸形的请求;使用最新的Web服务器软件并关注安全更新。 - 对缓存服务提供者(如CDN): 实现规范化且一致的请求解析逻辑,确保缓存键的生成无歧义;对缓存键进行严格的标准化处理(如统一小写、解码URL);实施“缓存键锁定”策略,确保关键头字段(如
Host)必须完全匹配。 - 对协议与标准: 遵循IETF(互联网工程任务组)制定的HTTP规范,减少实现上的歧义。使用更安全的替代协议,如HTTP/2和HTTP/3,它们对帧和流有更严格的定义,减少了走私和歧义空间。
- 通用最佳实践: 在Web应用程序中实施内容安全策略(CSP),即使内容被注入恶意脚本,也能限制其执行;使用子资源完整性(SRI)来确保引用的外部资源(如JavaScript库)未被篡改。
- 对网站运营者(源服务器): 使用完整的、规范的URL作为缓存键的基础;配置Web服务器严格验证