Apache ActiveMQ NMS RCE 漏洞分析
字数 1703 2025-08-24 10:10:13

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支持多种消息格式:

  1. ActiveMQBlobMessage - 二进制大对象消息
  2. ActiveMQBytesMessage - 字节数组消息
  3. ActiveMQMapMessage - 键值对消息
  4. ActiveMQObjectMessage - 对象消息(漏洞所在)
  5. ActiveMQStreamMessage - 流消息
  6. ActiveMQTextMessage - 文本消息

漏洞分析

漏洞根源

漏洞存在于ActiveMQObjectMessage类型的消息处理中。当处理此类消息的body时,会对其进行序列化和反序列化操作,且未施加任何限制,导致远程代码执行。

序列化过程分析

  1. 当调用producer.Send(IObjectMessage)发送消息时

  2. 调用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);
    }
    
  3. activeMqMessage类型为ActiveMQObjectMessage时,会调用ActiveMQObjectMessage#BeforeMarshall()方法对消息体进行序列化

  4. 序列化使用BinaryFormatter,将构造的恶意对象序列化后存入content字段

反序列化触发点

  1. 客户端消费消息时获取ActiveMQObjectMessage实例:

    IObjectMessage message = consumer.Receive() as IObjectMessage;
    
  2. 处理消息体时调用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;
        }
    }
    
  3. Deserialize方法直接对之前存储的序列化对象content进行反序列化,无任何安全检查

漏洞复现

利用链

复现中使用的利用链是TextFormattingRunProperties,这是.NET中一个已知的反序列化gadget链。

复现步骤

  1. 构造恶意对象,利用TextFormattingRunProperties等gadget链
  2. 创建ActiveMQObjectMessage,将恶意对象设置为body
  3. 发送消息到ActiveMQ服务器
  4. 当客户端消费此消息时,触发反序列化漏洞,执行任意代码

补丁分析

修复方案

官方补丁引入了SerializationBinder来限制反序列化类型,支持自定义白名单机制:

  1. 实现了类型白名单验证
  2. 默认情况下只允许反序列化安全类型
  3. 允许管理员配置自定义白名单

修复版本

  • activemq-nms-openwire >= 2.1.0-rc1
  • Apache.NMS.AMQP.dll >= 2.1.0
  • Apache.NMS.ActiveMQ.dll >= 2.1.0

防护建议

  1. 升级组件:立即升级到2.1.0或更高版本
  2. 网络隔离:限制ActiveMQ服务的网络访问,仅允许可信客户端连接
  3. 输入验证:在自定义应用中验证所有输入消息
  4. 最小权限:以最小必要权限运行ActiveMQ服务
  5. 监控日志:监控异常反序列化行为和安全事件

总结

该漏洞源于ActiveMQ NMS库中对ActiveMQObjectMessage的不安全反序列化处理,攻击者可通过构造恶意消息在客户端触发远程代码执行。修复方案通过引入类型白名单机制有效缓解了此风险。建议所有使用受影响版本的用户立即升级到安全版本。

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 方法处理消息: 当 activeMqMessage 类型为 ActiveMQObjectMessage 时,会调用 ActiveMQObjectMessage#BeforeMarshall() 方法对消息体进行序列化 序列化使用 BinaryFormatter ,将构造的恶意对象序列化后存入 content 字段 反序列化触发点 客户端消费消息时获取 ActiveMQObjectMessage 实例: 处理消息体时调用 message.body 属性,触发反序列化: 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 的不安全反序列化处理,攻击者可通过构造恶意消息在客户端触发远程代码执行。修复方案通过引入类型白名单机制有效缓解了此风险。建议所有使用受影响版本的用户立即升级到安全版本。