RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式。
如果正在使用RMI提供服务给外部访问(公司内网环境应该不会有攻击风险),同时应用里依赖了老的common-collections包(dubbo不会依赖这个包,请排查自己的应用有没有使用)的情况下,存在反序列化安全风险。
请检查应用:
如果服务接口继承了java.rmi.Remote接口,可以和原生RMI互操作,即:
如果服务接口没有继承java.rmi.Remote接口
<dubbo:protocol name="rmi" codec="spring" />
,将不生成$Remote接口,而使用Spring的RmiInvocationHandler接口暴露服务,和Spring兼容。定义 RMI 协议:
<dubbo:protocol name="rmi" port="1099" />
设置默认协议:
<dubbo:provider protocol="rmi" />
设置服务协议:
<dubbo:service protocol="rmi" />
多端口:
<dubbo:protocol id="rmi1" name="rmi" port="1099" /> <dubbo:protocol id="rmi2" name="rmi" port="2099" /> <dubbo:service protocol="rmi1" />
Spring 兼容性:
<dubbo:protocol name="rmi" codec="spring" />
Java标准的远程调用协议
(1) 约束:
(2) 配置:
dubbo.properties
dubbo.service.protocol=rmi
(3) RMI配置:
java -Dsun.rmi.transport.tcp.responseTimeout=3000
更多RMI优化参数请查看: http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html