绕过Cloudflare的缓存密钥和WAF:基于HTTP请求头溢出的漏洞分析
漏洞摘要(来自Cloudflare公共漏洞赏金项目)
我们的前端处理(Front Line,简称FL)在HTTP请求头解析方面存在一个限制,使得攻击者能够绕过已定义的规则集。openresty解析的HTTP请求头(包括内部头)最大数量为100个。此问题适用于所有基于HTTP头的规则集。攻击者能够以此绕过例如WAF规则,并执行缓存强制/投毒攻击。我们的WAF团队已实施一条全局规则,在提供过多请求头时进行阻止(WAF更新日志),建议启用此规则。
我们希望强调的是,http.request.headers.truncated字段可用于指示规则集是否未能看到所有请求头。此外,解析HTTP头时的长度问题将随着我们新前端处理(Front Line)实现的逐步部署得到缓解。
漏洞细节(来自研究者david96)
漏洞概述
HTTP请求头处理中的一个漏洞使得攻击者能够对所有Cloudflare客户发起缓存投毒攻击。通过在超过94个请求头后追加一个关键请求头(触发溢出),攻击者可以操纵缓存行为。
该漏洞使攻击者能够绕过Cloudflare的缓存密钥配置(参考Cloudflare缓存密钥文档)。当请求头数量超过94个时,自定义和默认的关键请求头都会从缓存密钥评估中被排除。
这也使得攻击者能够强制缓存本不应缓存的资产,从而绕过缓存规则。例如,根据特定请求头或Cookie配置为避免缓存的响应,却被缓存了起来。
当请求头数量超过94个时,Cloudflare对缓存规则、自定义缓存密钥和默认缓存密钥的评估就会停止。
攻击示例
例如,攻击者可以使用如下请求结构:
|
|
攻击者可以添加一个最初包含在缓存密钥中的请求头(例如X-HTTP-Method-Override)来操纵响应,并缓存错误或恶意的内容,以便在后续响应中提供。
这导致了缓存投毒拒绝服务攻击和存储型XSS攻击。
WAF绕过
攻击者还可以**绕过Cloudflare的Web应用程序防火墙(WAF)**以及自定义和托管的防火墙规则,使得恶意请求能够未经检查地到达源服务器。
此漏洞可被用于通过缓存投毒和WAF绕过来实现存储型XSS。例如,考虑一个网站有一条严格的规则,禁止闭合标签(如</tag>),并在其响应中反射User-Agent请求头。如果请求没有触发请求头溢出,该网站的WAF会返回403错误页面。通过操纵User-Agent,攻击者可以将这些问题串联起来,毒化缓存,并实现存储型XSS。
示例请求:
|
|
当前前端处理行为
正如Cloudflare规则集引擎文档所述,当前的前端处理层并未缓解此问题。建议使用http.request.headers.truncated字段来检测和阻止请求头过多的请求。
时间线与状态
- 报告者:david96
- 报告时间:2025年3月10日 00:38 UTC
- 报告对象:Cloudflare公共漏洞赏金项目
- 报告ID:#3027461
- 严重程度:高 (7 ~ 8.9)
- 状态:已解决
- 披露时间:2025年11月18日 08:08 UTC
- 弱点分类:不恰当的访问控制 - 通用
- CVE ID:无
- 赏金:已发放(金额未显示)
关键时间节点:
- 2025年3月12日,david96提交报告。
- 2025年4月17日,Cloudflare员工将严重程度从中等更新为高。
- 2025年4月23日,Cloudflare向david96和相关黑客发放了赏金。
- 2025年5月13日,Cloudflare员工关闭报告,状态标记为“已解决”。
- 2025年6月20日,david96请求公开披露报告。
- 2025年10月,Cloudflare员工表示,在完全迁移到新的前端处理层后,WAF将具备检查/阻止所有请求头的能力。
- 约8天前(相对报告时间),Cloudflare员工同意披露报告,报告随即被公开。
注释:Cloudflare指出,针对此问题,当前前端处理层的行为将保持不变。建议使用请求头截断检测机制(http.request.headers.truncated)。在完全迁移到新的前端处理层后,WAF将具备检查和阻止所有请求头的能力。