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层的过滤)依然不能丢。
  • 对"业务特权"保持警惕任何为了业务便利(如自动续签、健康检查)而开的"后门"或"白名单",都必须经过最严格的安全审计。

转载地址: https://mp.weixin.qq.com/s/LjeIGd4IN9u6hAn7A6fy_w