HTTP代理绕过通过CURLOPT_CUSTOMREQUEST
动词隧道
摘要
libcurl版本8.14.1中存在一个逻辑缺陷,允许攻击者通过在CONNECT请求中"隧道化"任意HTTP动词来绕过限制性HTTP代理防火墙。通过将CURLOPT_CUSTOMREQUEST
设置为CONNECT用于标准的http:// URL,攻击者可以欺骗libcurl创建混合请求。该请求被仅允许CONNECT的代理误解为合法的隧道设置请求,因此被允许。随后,libcurl通过这个新建立的、未经过滤的TCP管道发送其请求体(例如,来自CURLOPT_POSTFIELDS
)。
此漏洞有效地破坏了在代理层实施的网络分段规则,使能够控制curl选项的攻击者(例如,通过SSRF)能够向受保护的内部服务发送任意数据。
产品信息
- 产品名称: libcurl
- 受影响版本: 8.14.1(及可能更早版本)
- 漏洞类别: CWE-284 不当访问控制
- CVSS 3.1评分: 8.6(高)
- CVSS向量: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:N
描述
该漏洞源于在使用代理时,用户定义的请求方法与libcurl假定的请求类型之间的验证不足。
当用户提供http:// URL和代理时,libcurl准备一个标准的非隧道代理请求(例如,GET http://destination/… HTTP/1.1)。
如果用户还将CURLOPT_CUSTOMREQUEST
设置为"CONNECT internal.host:port HTTP/1.1",这个自定义动词会覆盖标准的GET。
发送到代理的请求行现在以CONNECT开头,这满足仅允许CONNECT方法建立隧道的代理的安全规则。代理允许该请求,并打开到指定内部主机和端口的原始TCP连接。
由于原始URL方案是http://,libcurl的状态机不会进入其正式的"HTTPS隧道"模式。它继续执行,就好像在进行POST风格的请求(由于存在请求体),并将有效负载发送到代理刚刚打开的TCP管道中。
这允许攻击者直接向本应无法访问的内部服务发送任意数据。
概念验证(PoC)
此PoC使用标准命令行工具演示绕过。它需要三个独立的终端会话。
步骤1:设置"禁止"内部服务器(终端1)
此服务器监听端口8081。其目的是接收并显示走私的有效负载。
|
|
步骤2:设置限制性代理(终端2)
此代理监听端口8080,仅允许以CONNECT开头的请求。对于任何其他动词,它响应405 Method Not Allowed。
将此脚本保存为restrictive_proxy.sh,并使用chmod +x restrictive_proxy.sh
使其可执行。
|
|
在循环中运行代理以处理多个连接:
|
|
步骤3:验证保护措施(终端3)
此命令证明代理正确阻止正常的GET请求。
|
|
预期结果:代理将响应405 Method Not Allowed,curl命令将失败。内部服务器将不会收到连接。
步骤4:制作攻击者有效负载(终端3)
创建名为payload.txt的文件,包含要走私的数据。
|
|
步骤5:执行绕过攻击(终端3)
此命令使用漏洞绕过代理。
|
|
步骤6:观察结果
- 代理(终端2): 将打印[PROXY] Verdict: ALLOWED…,显示它被CONNECT动词欺骗。
- 内部服务器(终端1): 将停止等待并打印payload.txt的内容,证明代理被绕过,恶意有效负载已传递到受保护的内部资源。
|
|
影响
此漏洞的影响为高。它允许能够控制libcurl选项的攻击者(服务器端请求伪造漏洞的常见结果)完全绕过由仅允许CONNECT的代理实施的网络出口过滤规则。这可能导致:
- 内部网络渗透: 攻击者可以使用面向公众的应用程序作为支点,向内部不可路由服务(如数据库、内部API或云元数据服务)发送任意命令。
- 数据泄露: 建立的隧道可用于从受损的内部系统泄露敏感数据。
- 防火墙和WAF绕过: 代理上设计用于检查GET和POST请求的应用层防火墙变得无效,因为攻击者的有效负载是通过代理未配置检查的原始TCP管道发送的。
这将潜在中等风险的SSRF缺陷转变为关键的内部网络访问向量,显著提高了组织基础设施的整体风险。
建议缓解措施
lib/http.c中的逻辑应加强,以在使用代理时在URL方案和允许的HTTP方法之间建立更强的链接。建议的修复方法是:
如果使用http:// URL与代理,libcurl应明确禁止将CURLOPT_CUSTOMREQUEST
设置为CONNECT。CONNECT方法应仅由libcurl的内部隧道逻辑在使用https:// URL进行代理时使用,并且不应是标准http://代理请求的用户可控动词。这将关闭允许此绕过的逻辑间隙。
评论记录
-
jimfuller2024 (curl staff): 2025年7月1日,下午1:20 UTC “感谢报告 - 我无法复现禁止服务器发出有效负载(在curl 8.14.0上),总是得到Verdict: BLOCKED.结果…我想知道我可能遗漏了什么…”
-
bagder (curl staff): 2025年7月1日,下午1:56 UTC “我看到的是有效的curl功能描述,而不是攻击或安全问题。‘允许能够控制libcurl选项的攻击者’ - 那不是攻击者,那是使用libcurl的应用程序,他们可以自由使用API来做他们认为正确的操作。你是使用AI生成此报告的吗?”
-
alphox: 2025年7月1日,下午2:10 UTC “是的,我使用了AI工具进行初始代码分析,以帮助识别可能需要更仔细查看的复杂交互。但我不想仅依赖其输出。我基于其假设自己构建了手动概念验证。我的PoC - 代理脚本接受CONNECT动词且内部服务器接收数据 - 似乎确认了绕过,这就是为什么我自信地提交了报告。你的解释明确了关键区别:我的PoC实际上演示的是libcurl的预期功能集,而不是缺陷。防止不安全使用这些强大选项的责任在于调用应用程序。”
-
bagder (curl staff): 2025年7月1日,下午2:20 UTC “未披露使用AI违反我们的使用条款。它显然误导你提交了这个非问题,并浪费了我们所有人在此旅程中的时间。此违规行为立即将你从我们的计划中禁止。”
-
bagder (curl staff): 2025年7月1日,下午2:19 UTC “根据项目透明度政策,我们希望所有报告都被披露并公开。”
-
bagder (curl staff): 2025年7月1日,下午2:20 UTC 披露了此报告。
报告详情
- 报告时间: 2025年7月1日,下午12:47 UTC
- 报告者: alphox
- 报告对象: curl
- 报告ID: #3231321
- 严重性: 高(7 ~ 8.9)
- 披露时间: 2025年7月1日,下午2:20 UTC
- 弱点: 不当访问控制 - 通用
- CVE ID: 无
- 赏金: 无