几天网上又报出来Dubbo的一个反序列化漏洞,一时间Dubbo又被推上了风口浪尖,对dubbo本身也褒贬不一.
漏洞报告地址如下,有兴趣的可以自己研究下:
https://www.mail-archive.com/dev@dubbo.apache.org/msg06544.html
其实在2月份就有相似的漏洞报出来了,漏洞地址如下:
https://www.mail-archive.com/dev@dubbo.apache.org/msg06225.html
我们抛开Dubbo不提,看看反序列化漏洞到底是什么样的?
序列化:
序列化是将Java对象转换成二进制字节,这些字节可以保存到磁盘上, 也可以通过网络传输,发送到其他服务上.
调用方法:
ObjectOutputStream.writeObject(Object)
反序列化:
与序列化相反,是将二进制字节转换成Java对象
调用方法:
ObjectInputStream.readObject();
而漏洞也就出现在这个readObject()过程中,当二进制数据不可控时,或者说二进制中存在恶意代码时,就会在这个阶段执行.
通过分析readObject的层层调用,可以发现会调用到对象中自定义readObject()方法.
也就是利用这个自定义方法进行的漏洞攻击
ObjectInputStream.readObject();↳ Object obj = readObject0(false); ↳ readOrdinaryObject(unshared); ↳ readSerialData(obj, desc); ↳ slotDesc.invokeReadObject(obj, this); ↳ readObjectMethod.invoke(obj, new Object[]{ in });
在进行反序列化就会执行系统命令,打开计算器.
class MyObject implements java.io.Serializable { String name; private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); Runtime.getRuntime().exec("open /Applications/Calculator.app/"); }}