引用参考【1】,总结下JMX可能遇到的反序列化问题
- JMX自身存在反序列化漏洞,例如CVE-2016-3427
- RMI服务,特定版本可以被直接攻击
- MBean的反序列化
其中1、2可以参考原文,这里暂不跟进,简单跟踪下3
JMX 方法
JMX调用远程MBean方法的流程可以简单概括为
- MBean name、MBean Function Name、 params,发送给远程rmi server,其中params的处理需要注意下,统一先转为MarshalledObject,在writeObject为String,然后进入网络传输
- RMI Server监听到网络请求,包含MBean name、MBean Function Name、 params,其中params经过MarshalledObject.readObject() 反序列化,再通过invoke调用原函数。
可以看出,MarshalledObject 进行了序列化和反序列化操作,那么必然就存在反序列化的问题。
Show me the code
1 | /** |
server端对应的调用链如下
解释下:
为什么选java.util.logging:type=Logging/getLoggerLevel?
java.util.logging:type=Logging 比较通用,换其他ObjectName也行,比如com.sun.management:type=DiagnosticCommand,不过需要注意FucntionName需要为String
getLoggerLevel为read操作,不会影响到系统,getParentLoggerLevel、setLoggerLevel也都可以
小结
本节跟踪远程MBean函数调用过程,发现会经过序列化/反序列化过程,由此产生的反序列化安全问题及其攻击原理。有关RMI的攻击之后单独系列再讲。
参考
- [1] 如何入侵基于RMI的JMX服务
- [2] Class MarshalledObject
- [3] Java JMX-RMI
- [4] JMX学习笔记(四) JMX RMI