白帽故事 · 2026年1月23日

Cloudflare 零日漏洞:全球任意主机访问

几乎每个现代网站上,都有一个为机器而非人类准备的 URL:它位于 /.well-known/acme-challenge/ 这个路径下。

在证书颁发流程的短短几秒钟里,一个自动化机器人会访问这里,检查你是否真的控制着该域名。按理说,这只是一次平淡无奇的例行任务:没人关注、不会出错、也不该引发任何动静。

但在这个案例里,正是这条“安静的小路”,制造了巨大的声响。

本文将讲清楚一个关键问题:即使应用的其他部分已经被用户设置的 WAF 规则严格阻挡,为什么指向证书验证路径的请求仍然能穿过 Cloudflare,直接抵达源站?


关于 ACME 的 60 秒入门

ACME 是一种协议,用来让证书颁发机构(CA)验证你对域名的控制权。

在最常见的 HTTP-01 验证方式中,CA 会要求你的网站在下面这个路径提供一个一次性令牌:

/.well-known/acme-challenge/{token}

随后,CA 会像普通用户访问网页一样,通过 HTTPS 去请求这个令牌内容;如果返回字节完全匹配,证书就会被签发。

这个机制的设计目标非常“克制”:

  • 只访问一个固定的路径
  • 只读取一个临时的小文件
  • 不触碰任何业务逻辑

ACME 通道本质上是给一个“拿着剪贴板的机器人”准备的,而不是让一群人趁守卫不注意溜进系统内部。


不合常理的发现

研究人员在审查一组应用的访问控制策略时,发现了一个不合理的现象。

这些应用部署在 Cloudflare 后方,并且 WAF 被配置为:

  • 默认阻挡所有来源
  • 只允许特定来源访问

在绝大多数路径上,WAF 都严格执行了这些规则。但当请求目标变成:

/.well-known/acme-challenge/{token}

奇怪的事情发生了:WAF 没有拦截,反而放行了请求,源站直接返回了应用自己的响应。

最明显的线索就是“谁在说话”变了:

  • 正常请求:返回 Cloudflare 的拦截页面
  • ACME 路径请求:返回 源站框架的响应页面(通常是 404)

即使不看响应头,仅从页面风格也能一眼分辨:一个是 Cloudflare 的页面,另一个明显是应用自身的页面。


可复现的演示环境

为了确认这不是某个租户的特殊错误配置,研究人员搭建了一个受控的演示环境:在 Cloudflare 后面部署了几个默认会阻断正常访问的站点:

在普通路径下访问这些站点,你会看到 Cloudflare 的阻挡页面。

但当你用任意真实令牌访问这些站点的 ACME 挑战路径时,你会得到源站生成的响应——最常见的是框架自己的 404 页面。

这种差异非常直观:

  • 一个是 Cloudflare 的拦截页
  • 一个是应用框架的错误页

更确信的证据:不需要真实 ACME 文件也能绕过

在演示主机上,研究者进一步验证:即使请求并不存在的挑战文件,也能触发该行为。

他们使用了小型、幂等的请求,并在令牌后附加无害后缀(例如在令牌后加上 /ae),用来证明:

绕过并不依赖于真实存在的 ACME 文件。

在每一种情况下,结果都一致:

  • 收到的是源站响应
  • 而不是预期中的 WAF 阻挡页面

以下是演示环境的代表性截图:

第一张图:正常请求最终显示 Cloudflare 阻挡页面
第二张图:用于阻挡 cf-* 主机名的自定义规则
接下来的三张图:请求指向 ACME 路径后,返回了源站框架生成的 404 页面

阻挡页面(正常请求)

图片

自定义规则 – 阻挡包含 cf-* 的主机名

为了演示,研究者创建了一条规则:阻挡任何包含 cf- 的主机名。

在真实生产环境中,很多团队也会采取类似策略——阻挡公共互联网访问,仅允许公司 VPN 出口的流量进入。此规则模拟的就是这种“默认拒绝”的安全姿态。

图片

源站 404 页面(Next.js)

图片

源站 404 页面(Spring)

图片

源站 404 页面(PHP)

图片


如何获取一个稳定的挑战令牌(方便长期复现)

为了做可重复演示,研究者需要一个不会在测试过程中失效的挑战令牌。

Cloudflare 的 SSL/TLS 自定义主机名(Custom Hostnames) 功能允许你为第三方主机名管理证书(通常是 CNAME 到你的域名),并支持多种验证方式。

研究者添加了一个名为:

cf-well-known.fearsoff.org

的自定义主机名,并明确选择 HTTP 验证。下面截图展示了添加流程以及最终的“待验证”状态:

图片
图片

关键点在于:研究者故意不为 cf-well-known.fearsoff.org 创建 DNS 记录,让证书签发流程永久停留在“待定”状态。

在这种状态下,Cloudflare 会提供 CA 将要访问的 HTTP-01 URL,例如:

http://cf-well-known.fearsoff.org/.well-known/acme-challenge/yMnWOcR2yv0yW-...Jm5QksreNRDUmqKfKPTk

他们并没有完成验证,也没有在该路径部署任何挑战文件。

他们的目的很明确:

  • 获得一个确定性、长期有效的 token 形式
  • 用它作为测试锚点
  • 避免和真实 CA 的验证窗口“赛跑”

这样一来,就能在全球任何 Cloudflare 节点上持续测试 /.well-known/acme-challenge/{token} 的行为。


为什么这个问题在现实中很危险?

WAF 本应是“前门”。

但如果有一条特殊路径绕过了这扇门,那么“内部”和“外部”的边界就被改变了。

从安全角度看,问题在于:

/.well-known/acme-challenge/... 这条路径的信任边界,从 WAF 滑落到了源站。

一旦源站可以被公网访问——哪怕只开放了一个路由——那么很多原本“关在内网”的风险都会被激活:

  • 普通漏洞获得了可达路径
  • 普通页面变成了侦察入口
  • 内部调试接口可能暴露到公网

下面是演示中出现的典型影响。


Spring / Tomcat:从 ACME 路径跳到敏感端点

在正常情况下,Spring Boot 的执行器(Actuator)端点通常位于 WAF 和内网访问控制之后。

但当 ACME 路径能直达源站时,边界就变了。

研究者利用某些 Servlet 栈中众所周知的路径遍历特性(..;/),从 ACME 路径跳转访问:

/actuator/env

并返回进程环境与配置信息。

这些信息常常包含敏感内容,比如:

  • 数据库连接 URL
  • API Token
  • 云平台密钥

它会直接扩大任何错误配置或漏洞的“爆炸半径”。

图片


Next.js:源站直连导致 SSR 信息暴露风险

服务端渲染框架(如 Next.js)往往会把部分服务器端衍生数据传递给客户端用于页面注水。

在 WAF 守住前门时,这通常没问题。

但当源站开始直接响应时,同样的页面可能会暴露一些原本不希望暴露给公网的细节,例如:

  • 内部路由结构
  • 构建信息
  • 服务端逻辑痕迹

图片


PHP 路由:一旦可达,LFI 就可能变成文件读取

很多 PHP 应用会通过 index.php 路由所有请求,并通过查询参数选择视图。

如果这种模式存在本地文件包含(LFI)漏洞,那么当源站变得公网可达时,风险会升级为文件读取。

研究者用读取 ../../../../etc/hosts 来证明影响。

在演示中,甚至连 404 错误流都通过 index.php 路由,这意味着:

一旦源站开始“直接说话”,就可能暴露出更多可利用的入口。

图片
图片

需要强调的是:这些演示只是后果,而不是根因。

根本问题在于:WAF 对一条特殊路径做出了不同的决策。
一旦这扇门被打开,源站内部任何脆弱部分都可能变得“一键可达”。


不仅仅是 404:账户级 WAF 规则也被跳过

研究者进一步证明:这不是“碰巧绕过导致 404”那么简单。

他们配置了一个账户级 WAF 规则,用于阻挡带有特定信标头的请求。

在根路径下,带有 X-middleware-subrequest: 头的请求会被正常拦截。

但如果把完全相同的请求发往 ACME 路径,则会被放行,并由应用程序正常处理。

换句话说:

本应阻止请求的账户级 WAF 规则,并没有在该路径上被评估。

这为什么重要?

因为现实世界中,很多应用会依赖请求头来做逻辑判断,或者把头部信息传递到下游代码。

一旦 WAF 不再过滤这些头部,整个漏洞类别都可能重新“获得通路”,例如:

  • 遗留代码中基于头部的 SQL 拼接
  • 利用 X-Forwarded-Host / X-Original-URL 的 SSRF 与主机混淆
  • 依赖头部区分缓存键导致的缓存投毒
  • 使用 X-HTTP-Method-Override 的方法覆写
  • 通过自定义头触发调试开关或隐藏逻辑

随之而来的问题是:

有多少应用仍然过度信任头部?
又有多少团队依赖 WAF 来守住“信任与公网之间的边界”?


可能的原因与修复情况

在调查过程中,研究者的合理推测是:

位于 /.well-known/acme-challenge/ 下的请求,可能走了不同的内部处理流程——
这是一个为了证书验证而存在的“隐式例外”,并且发生在客户自定义阻挡规则之前。

这可以解释为什么:

  • ACME 路径总能到达源站
  • 其他路径却严格显示 Cloudflare 阻挡页面

2025 年 10 月 27 日,Cloudflare 部署了修复。

研究者随后重新测试,观察到了预期行为:

  • WAF 会统一应用客户规则
  • 包括 /.well-known/acme-challenge/* 路径

那条原本“该乏味就乏味”的路径,终于再次恢复乏味。


AI 与新的攻击面

像这样的 WAF 旁路问题,在 AI 驱动攻击不断发展的背景下,会变得更加紧迫。

原因很简单:自动化攻击工具可以非常快速地枚举并利用类似 /.well-known/acme-challenge/ 这种“特殊路径”,在大规模范围内探测:

  • 框架特定弱点
  • 常见错误配置
  • 内部接口暴露

举例来说:

如果一个 AI 模型被训练用于识别:

  • Servlet 的遍历特性
  • PHP 路由漏洞模式

那么它就能把“旁路路径”与“针对性 payload”串联起来,把一个原本狭窄的维护通道,扩展成广泛可用的攻击入口。

反过来,AI 也能帮助防御者:通过模拟攻击路径、自动验证边界变化来提前发现问题。研究者提到,他们与 Crypto[.]com 安全团队合作时,也利用了 AI 分析来验证该问题。

随着源站变得可直接寻址,攻击者与防御者的竞赛加剧——这使得可靠且一致的 WAF 控制比以往任何时候都更关键。


时间线

  • 2025年10月9日 – 通过 HackerOne 提交报告
  • 2025年10月13日 – 厂商验证开始
  • 2025年10月14日 – 被 HackerOne 分类
  • 2025年10月27日 – 最终修复部署完毕;重新测试确认问题已修复

原文:https://fearsoff.org/research/cloudflare-acme