apache activemq远程代码执行漏洞

热点 2026-10-17 05:25:55 84
```html

2015年8月,远程Apache ActiveMQ 5.11.1及之前版本被曝出一个远程代码执行漏洞,代码编号CVE-2015-5254。执行攻击者只需向消息代理发送一条特制的漏洞序列化消息,就能在目标服务器上执行任意命令。远程这个漏洞的代码根源不在ActiveMQ本身,而在它依赖的执行Java消息服务(JMS)对象消息处理机制——具体来说,是漏洞ObjectMessage类型在反序列化时没有做任何白名单校验。

ActiveMQ默认监听61616端口,远程用于OpenWire协议通信。代码只要这个端口暴露在公网,执行攻击者不需要任何认证就能连上去。漏洞他们构造一个包含恶意序列化数据的远程ObjectMessage,发到某个队列或主题里。代码当ActiveMQ的执行消费者端(或者broker本身在某些配置下)尝试反序列化这条消息时,恶意代码就被触发了。当时流行的利用链是CommonsCollections,通过InvokerTransformer链最终调用Runtime.exec()。你甚至不需要自己写exploit——metasploit里就有现成模块,exploit/multi/misc/apache_activemq_rce,填上目标IP和端口,一把梭。

我翻过当年的一些渗透测试报告,有个案例印象很深。某企业的监控系统用了ActiveMQ做告警消息中转,broker监听在0.0.0.0:61616,防火墙规则只限制了Web端口,61616完全敞开。攻击者从外网直接连上去,发了一条消息,服务器上就多了一个反弹shell。整个过程不到十秒。事后查日志,ActiveMQ的日志里只有一条普通的“消息入队”记录,没有任何异常告警。这就是反序列化漏洞的可怕之处——它藏在正常业务逻辑里,流量看起来完全合法。

修复方式其实不复杂。Apache官方在5.11.2版本里默认禁用了ObjectMessage的反序列化,需要手动在activemq.xml里配置trustedPackages白名单才能恢复。但问题在于,很多老系统升级困难。我见过一个金融客户,他们的交易系统还在用5.9版本,因为升级会破坏和上游系统的协议兼容性。最后只能在网络层做隔离,把61616端口限制在内网特定IP段访问。这种“打补丁不如加防火墙”的做法在国内很常见,说实话挺无奈的。

另一个容易被忽略的点是:即使你升级到了5.11.2以上,如果配置里显式开启了trustAllPackages,或者白名单里包含了java.util这种宽泛的包名,漏洞依然存在。安全配置比版本号更重要。2016年有个漏洞CVE-2016-3088,是ActiveMQ的fileserver组件任意文件写入,和这个RCE配合起来能直接拿shell。这两个漏洞经常被一起利用,因为很多运维只关注了61616端口,忘了8161管理端口上的fileserver。

从攻击面来看,ActiveMQ的远程代码执行漏洞本质上是个“信任边界”问题。消息队列设计之初假设所有生产者都是可信的,消息内容不需要校验。但现实网络里,这个假设根本不成立。现在回头看,2015年这个漏洞算是给整个消息中间件领域敲了警钟——RabbitMQ、Kafka后来都加强了反序列化安全。不过直到今天,我扫一些公网IP段,偶尔还能碰到61616端口开放的ActiveMQ,版本号还停留在5.10。这些机器就像没锁门的仓库,谁都能进去搬东西。

如果你手头有ActiveMQ在跑,别只看版本号。检查conf/activemq.xml里broker标签的plugins配置,确认有没有SimpleAuthenticationPlugin——默认是没有的。再检查网络ACL,61616端口绝对不应该对公网开放。最后,如果业务确实需要ObjectMessage,用trustedPackages精确指定允许的类,别偷懒写*。安全这件事,省下的配置时间,最后都会变成应急响应的时间。

```
本文地址:http://www.79wt.cn/news/323d1099666.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

友情链接