深入解析cURL代理授权头跨域重定向泄露漏洞

本文详细分析了cURL在跨域重定向时未能正确剥离Proxy-Authorization头的安全漏洞,探讨了其技术原理、复现步骤及与Golang类似漏洞的对比,并记录了官方对此问题的回应和处理过程。

报告 #3180396 - cURL在跨域变更时未能剥离Proxy-Authorization头

摘要

cURL在跨域重定向时未能正确剥离Proxy-Authorization头,可能导致代理授权信息泄露。报告者grahamcampbell在维护PHP Guzzle HTTP包时发现此问题,并参考了Golang近期修复的类似漏洞CVE-2025–4673。

受影响版本

8.14.1

复现步骤

cURL会剥离Authorization和Cookie头,但不会剥离Proxy-Authorization头。向服务器发送包含这三个头的请求,服务器响应重定向到另一主机时,只有前两个头在后续请求中被剥离。

示例命令

1
2
3
4
curl -L 'https://github.com/php/php-src/archive/refs/tags/php-8.4.8.tar.gz' \
  -H 'Authorization: foo' \
  -H 'Proxy-Authorization: bar' \
  -vvv

请求和响应流程

  1. 初始请求
1
2
3
4
5
6
> GET /php/php-src/archive/refs/tags/php-8.4.8.tar.gz HTTP/2
> Host: github.com
> User-Agent: curl/8.7.1
> Accept: */*
> Authorization: foo
> Proxy-Authorization: bar
  1. 服务器响应
1
location: https://codeload.github.com/php/php-src/tar.gz/refs/tags/php-8.4.8
  1. 后续请求
1
2
3
4
5
> GET /php/php-src/tar.gz/refs/tags/php-8.4.8 HTTP/2
> Host: codeload.github.com
> User-Agent: curl/8.7.1
> Accept: */*
> Proxy-Authorization: bar

注意:Authorization头被剥离,但Proxy-Authorization头未被剥离。

影响

代理授权头信息可能暴露给恶意攻击者。

官方回应

cURL团队认为这不是一个安全问题,而是预期行为。用户可以通过使用cURL的代理凭证选项来正确处理此问题。Proxy-Authorization头是"逐跳"头,通常在同一代理下保持不变,即使重定向到其他主机。

讨论与参考

  • Golang团队近期修复了类似问题,并提供了补丁参考。
  • 其他项目如Python Requests也存在相关安全公告,但问题不同。
  • cURL团队强调,不同API有不同的设计和文档约定,不应假定所有实现行为一致。

报告状态

  • 提交时间:2025年6月6日 1:26 UTC
  • 关闭时间:2025年6月7日 8:43 UTC
  • 状态:不适用(Not Applicable)
  • 披露时间:2025年6月27日 9:48 UTC
  • 严重性:中等(4 ~ 6.9)
  • 弱点:信息泄露
  • CVE ID:无
  • 赏金:无

结论

cURL团队认为此行为符合文档约定,不属于安全漏洞。建议用户通过代码层面 mitigation 来处理敏感头信息。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计