CVE-2025-5399: WebSocket无限循环
漏洞概述
在libcurl的commit 12d13b84fa40aa657b83d5458944dbd9b978fb7e中,curl_ws_send()
函数存在一个无限循环漏洞,特定条件下恶意服务器可触发此漏洞。
当应用程序使用curl_ws_recv()
和curl_ws_send()
与WebSocket服务器通信时,恶意服务器可在客户端通过CURLWS_OFFSET
构建帧期间发送精心计时的PING消息,导致后续curl_ws_send()
调用无法终止数据刷新循环。
受影响代码
漏洞位于文件lib/ws.c
的curl_ws_send()
函数第1376-1419行:
|
|
buflen
来自应用程序,表示要发送的数据长度。如果循环开始时ws->sendbuf_payload == 0
,则buflen > ws->sendbuf_payload
始终为真。成功执行ws_flush()
后,sent
、buffer
和buflen
保持不变,导致循环无限运行。
概念验证(PoC)
客户端代码
|
|
恶意服务器代码
|
|
执行步骤
- 后台启动服务器:
|
|
- 运行客户端:
|
|
此时可观察到./client
占用100% CPU且永不终止。
漏洞解释
虽然对WebSocket代码的理解尚未达到100%,但大致情况如下:
客户端尝试通过3次curl_ws_send()
调用构建70字节帧
前两次调用提供1 + 53 = 54字节
随后到达包含16字节内容的PING消息
当从应用程序提供最后16字节时,发生循环
如果通过以下方式禁用自动PONG功能:
|
|
则无限循环不再发生。根本原因似乎在于PING消息的处理。
影响评估
由于此漏洞:
- 可由远程服务器触发
- 导致程序停止执行并在无限时间内消耗100% CPU
- 仅在客户端以特定方式行为时发生
建议严重性评级为"低"。
修复方案
以下补丁可修复该漏洞:
|
|
或者更优的方案:
|
|
时间线
- 2025年5月30日 03:38 UTC:z2_提交报告
- 2025年5月31日 12:26 UTC:提交修复PR
- 2025年5月31日 15:03 UTC:分配CVE-2025-5399
- 2025年6月4日 05:54 UTC:问题修复并发布
根本原因
通过二分法追踪,此漏洞由commit 3588df9478d7c27046b34cdb510728a26bedabc7引入,随curl 8.13.0版本发布。
状态
- 状态:已解决
- 严重性:低(0.1 ~ 3.9)
- 弱点:具有不可达退出条件的循环(无限循环)
- CVE ID:CVE-2025-5399