Cloudflare高危逻辑漏洞剖析:SSL证书续签机制如何成为WAF后门
01 基础知识:ACME协议与HTTP-01挑战
现在的网站基本上都上了HTTPS,为了省事,大家都会用Certbot这类工具来自动申请和续签证书(比如Let's Encrypt)。这个自动化的过程,就是基于ACME协议的。
CA机构(发证书的)需要确认"这域名真是你的",最常用的方法就是HTTP-01 Challenge。简单来说,流程是这样的:
- CA说"你在你服务器上放一个文件,路径是/.well-known/acme-challenge/<TOKEN>,内容是特定的指纹。"
- **你(客户端)**照做,把文件放好。
- CA的服务器发起一个HTTP GET请求去访问这个URL。
- 验证如果能读到且内容正确,域名验证通过,下发证书。
02 那个"好心办坏事"的逻辑
当你的网站接入Cloudflare后,所有的流量都会先经过CF的边缘节点。这里存在两种情况:
- CF帮你管理证书 CF直接拦截这个ACME请求,自己替你回答CA,完成验证。
- 你自己管理证书 CF发现这不是它发起的订单,就把请求转发回你的源站(Customer Origin),让你的服务器去响应。
WAF的职责是拦截异常流量。但是,CA机构过来验证的请求,通常是一堆自动化脚本,长得特别像"爬虫"或者"恶意扫描"。如果不做处理,WAF很容易把CA的验证请求给拦截了,导致证书续签失败。
为了防止这种"误杀",Cloudflare的工程师写了一段逻辑: "如果请求的路径是/.well-known/acme-challenge/*,且Token看起来是有效的,那咱们就别让WAF介入了,直接放行吧!"
03 漏洞复盘:移花接木的艺术
安全研究员FearsOff发现,Cloudflare在判断"Token是否有效"时,犯了一个严重的上下文逻辑错误。
之前的有缺陷逻辑是这样的:
- 用户发起请求:GET https://target.com/.well-known/acme-challenge/<TOKEN>
- CF检查:< TOKEN>是否存在于CF的全球系统中?(注意:它只检查了Token是否存在,没严格检查这个Token属于哪个域名!)
- 如果Token存在(哪怕是属于攻击者自己域名的):CF禁用WAF。
- CF继续检查:这个Token是属于target.com的吗?
- 发现不匹配(因为Token是攻击者的):CF认为这不是自己该处理的订单,于是把请求透传给target.com的源站。
攻击者可以先给自己控制的域名申请一个ACME Token。然后,拿着这个合法的Token,去访问受害者域名的ACME路径。此时,Cloudflare的边缘节点一看:"哟,这Token我认识,是有效的(虽然不是这家的),为了防止误杀CA,先把WAF关了吧。"
然后,因为Token和域名不匹配,CF并没有拦截响应,而是把请求转发给了源站。**结果就是:**攻击者构造的请求,成功绕过了WAF,直接打到了你的源站服务器上!
04 官方的修复与启示
Cloudflare在收到报告后(2025年10月),迅速修复了这个Bug。
修复方案其实很简单: 收紧校验逻辑。只有当请求的Token不仅有效,而且**明确属于当前请求的主机名(Hostname)**时,才禁用WAF规则。如果Token是有效的但属于别的域名?对不起,WAF规则照常开启,该拦截拦截。
05 技术总结
这个案例虽小,但给我们的架构设计敲响了警钟:
- 上下文隔离至关重要在做权限校验或白名单时,千万不能只校验"对象是否存在",必须校验"对象是否归属于当前上下文"。这和常见的越权漏洞(IDOR)原理其实是一样的。
- **纵深防御(Defense in Depth)**不要把所有的安全希望都寄托在WAF这一层。源站本身的安全配置(比如限制只允许CF IP访问、Nginx层的过滤)依然不能丢。
- 对"业务特权"保持警惕任何为了业务便利(如自动续签、健康检查)而开的"后门"或"白名单",都必须经过最严格的安全审计。