几天网上又报出来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/");    }}