Apache ActiveMQ NMS RCE漏洞分析与防护指南
漏洞概述
漏洞类型:远程代码执行(RCE)
影响组件:Apache ActiveMQ NMS(.NET Message Service)
漏洞描述:该漏洞允许远程攻击者在受影响的Apache ActiveMQ NMS安装上执行任意代码。漏洞存在于Body访问器方法中,由于缺乏对用户提供数据的适当验证,可能导致不可信数据的反序列化。
受影响版本
- activemq-nms-openwire < 2.1.0-rc1
- Apache.NMS.AMQP.dll (AMQP协议) < 2.1.0
- Apache.NMS.ActiveMQ.dll (OpenWire协议) < 2.1.0
技术背景
NMS消息格式
Apache ActiveMQ NMS支持多种消息格式:
ActiveMQBlobMessage- 二进制大对象消息ActiveMQBytesMessage- 字节数组消息ActiveMQMapMessage- 键值对消息ActiveMQObjectMessage- 对象消息(漏洞所在)ActiveMQStreamMessage- 流消息ActiveMQTextMessage- 文本消息
漏洞分析
漏洞根源
漏洞存在于ActiveMQObjectMessage类型的消息处理中。当处理此类消息的body时,会对其进行序列化和反序列化操作,且未施加任何限制,导致远程代码执行。
序列化过程分析
-
当调用
producer.Send(IObjectMessage)发送消息时 -
调用
ActiveMQMessageMarshaller#LooseMarshal方法处理消息:public override void LooseMarshal(OpenWireFormat wireFormat, object o, BinaryWriter dataOut) { ActiveMQMessage activeMqMessage = (ActiveMQMessage) o; activeMqMessage.BeforeMarshall(wireFormat); base.LooseMarshal(wireFormat, o, dataOut); activeMqMessage.AfterMarshall(wireFormat); } -
当
activeMqMessage类型为ActiveMQObjectMessage时,会调用ActiveMQObjectMessage#BeforeMarshall()方法对消息体进行序列化 -
序列化使用
BinaryFormatter,将构造的恶意对象序列化后存入content字段
反序列化触发点
-
客户端消费消息时获取
ActiveMQObjectMessage实例:IObjectMessage message = consumer.Receive() as IObjectMessage; -
处理消息体时调用
message.body属性,触发反序列化:public object Body { get { if (this.content != null && this.body == null) { this.body = this.Deserialize(this.content); } return this.body; } set { this.body = value; this.content = null; } } -
Deserialize方法直接对之前存储的序列化对象content进行反序列化,无任何安全检查
漏洞复现
利用链
复现中使用的利用链是TextFormattingRunProperties,这是.NET中一个已知的反序列化gadget链。
复现步骤
- 构造恶意对象,利用
TextFormattingRunProperties等gadget链 - 创建
ActiveMQObjectMessage,将恶意对象设置为body - 发送消息到ActiveMQ服务器
- 当客户端消费此消息时,触发反序列化漏洞,执行任意代码
补丁分析
修复方案
官方补丁引入了SerializationBinder来限制反序列化类型,支持自定义白名单机制:
- 实现了类型白名单验证
- 默认情况下只允许反序列化安全类型
- 允许管理员配置自定义白名单
修复版本
- activemq-nms-openwire >= 2.1.0-rc1
- Apache.NMS.AMQP.dll >= 2.1.0
- Apache.NMS.ActiveMQ.dll >= 2.1.0
防护建议
- 升级组件:立即升级到2.1.0或更高版本
- 网络隔离:限制ActiveMQ服务的网络访问,仅允许可信客户端连接
- 输入验证:在自定义应用中验证所有输入消息
- 最小权限:以最小必要权限运行ActiveMQ服务
- 监控日志:监控异常反序列化行为和安全事件
总结
该漏洞源于ActiveMQ NMS库中对ActiveMQObjectMessage的不安全反序列化处理,攻击者可通过构造恶意消息在客户端触发远程代码执行。修复方案通过引入类型白名单机制有效缓解了此风险。建议所有使用受影响版本的用户立即升级到安全版本。