Pingora 请求走私漏洞(CVE-2025-4366)事件

227 阅读3分钟

时间线一览

时间(UTC)事件
2025-04-11 09:20研究员通过 Cloudflare 漏洞赏金计划报告漏洞
2025-04-12 06:44Cloudflare 彻底切断受影响组件的流量,漏洞被抑制
2025-04-19 01:56修补程序发布,缓存全部作废,恢复上线

1. 发生了什么?

  • 漏洞类型:HTTP/1.1 请求走私 (Request Smuggling)。

  • 漏洞编号:CVE-2025-4366

  • 影响对象

    1. 使用 Cloudflare 免费 CDN 的网站(因内部用到 Pingora)。
    2. 直接使用开源 pingora-proxy / pingora-cache 的开发者。
  • 结果:攻击者可把一段伪造的请求塞进同一条连接,进而改写下一条正常请求的 Header 或 URL,甚至把访客引到自己的服务器。

  • 现状:Cloudflare 22 小时内完成缓解并打了补丁;未发现被利用的证据。


2. “请求走私”到底是什么?

想像你点外卖,订单先到前台(负载均衡器),再转餐厅后厨(应用服务器)。
如果前台和后厨对「一个订单的结束位置」理解不同,骗子就能把两张订单拼成一张交给前台,而后厨会把它拆成两张执行——其中一张就可能是恶意操作。

在网络世界里,HTTP/1.1 一条 TCP 连接可以连续发多条请求。各环节靠 Content-LengthTransfer-Encoding 这类头来判断“哪里是一条请求的结尾”。只要两端的解析规则不一致,就给了攻击者可乘之机。


3. 漏洞细节(简化版)

  1. 根因:Pingora 在“缓存命中(cache hit)”时跳过了一段清理逻辑。

  2. 结果:如果第 1 条请求的包体里偷偷塞了“第 2 条请求的起始行”,Pingora 会把这段内容当成下一条完整请求来处理。

  3. 典型利用链

    GET /attack/foo.jpg HTTP/1.1
    Host: example.com
    Content-Length: 79                ← 告诉服务器后面还有 79 字节
    
    GET / HTTP/1.1                    ← 这 79 字节的恶意数据
    Host: attacker.example.com        ← 被当成“下一条”请求
    
  4. 二次影响:部分源站会把带有陌生 Host 的请求 301 重定向到攻击者域名,浏览器跟随跳转时会带上 Referer,攻击者就能看到受害者原本访问的 URL,并可投毒恶意脚本。


4. Cloudflare 的应对

  • 立即响应:安全团队确认后,第一时间把走私风险组件下线。
  • 补丁发布:4 月 19 日发布 0.5.0,新版在缓存命中时也会严格消费/丢弃多余包体。
  • 额外措施:清空旧缓存,防止已被篡改的条目继续生效。

5. 用户需要做什么?

你是谁需要行动吗?
Cloudflare 免费 CDN 用户不需要,官方已全网修复。
自己在用 Pingora 的开发者必须升级≥ 0.5.0,否则仍存在风险。

6. 结语

这次事件再次说明:任何解析不一致都可能被构造成“走私”攻击面
感谢研究员 James KettleWannes Verwimp 的负责任披露,也感谢所有对 Cloudflare 和 Pingora 社区安全做出贡献的人。