7.3. 控制 Jakarta Messaging ObjectMessage Deserialization

由于 ObjectMessage 可以包含潜在的危险对象,ActiveMQ Artemis 提供了一个简单的类过滤机制,以控制哪些软件包和类值得信任且不被信任。您可以将其类从可信软件包中的对象添加到白名单,以指明它们可以无问题地进行非序列化。您可以将其类从不受信任的软件包添加到黑列表中的对象,以防止它们被反序列化。

ActiveMQ Artemis 过滤对象以进行反序列化,如下所示:

  • 如果白名单和黑名单都为空(默认值),则允许任何可序列化的对象进行反序列化。
  • 如果对象的类或软件包与黑名单中的某一条目匹配,则不允许进行反序列化。
  • 如果对象的类或软件包与白名单中的条目匹配,则允许进行反序列化。
  • 如果对象的类或软件包与黑名单和白名单中的条目匹配,则黑名单中的条目具有优先权,这意味着不允许进行反序列化。
  • 如果对象的类或软件包都不匹配黑名单或白名单,则拒绝对象降序化,除非白名单为空,否则没有指定白名单。

如果对象全名与列表中的某一条目完全匹配,或者其软件包与列表中某一条目匹配,或者是列表中某一条目的子软件包,则对象被视为匹配项。

您可以使用 deserialization- white-list 和 deserialization- black-list 属性 ,在 connection-factory 和 pooled-connection - factory 中指定哪些对象可以被反序列化deserialization-white-list 属性用于定义允许进行反序列化的类或软件包的列表。deserialization-black-list 属性用于定义不允许进行反序列化的类或软件包的列表。

以下命令为 RemoteConnectionFactory 连接工厂创建一个黑名单,并为默认服务器创建 activemq-ra 池连接工厂的白名单。

/subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:write-attribute(name=deserialization-black-list,value=[my.untrusted.package,another.untrusted.package])
/subsystem=messaging-activemq/server=default/pooled-connection-factory=activemq-ra:write-attribute(name=deserialization-white-list,value=[my.trusted.package])

这些命令在 messaging-activemq 子系统中生成以下配置:

<connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector" ha="true" block-on-acknowledge="true" reconnect-attempts="-1" deserialization-black-list="my.untrusted.package another.untrusted.package"/>
<pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" deserialization-white-list="my.trusted.package" transaction="xa"/>

有关连接工厂和池连接工厂的详情,请参考本指南中的 配置连接工厂

您还可以通过配置激活属性在 MDB 中指定哪些对象可以被反序列化。deserializationWhiteList 属性用于定义允许进行反序列化的类或软件包的列表。deserializationBlackList 属性用于定义不允许进行反序列化的类或软件包列表。如需有关激活属性的更多信息,请参阅为 JBoss EAP 开发 Jakarta 企业 Bean 应用 时使用 部署描述符配置 MDB