CVE-2018-2628补丁绕过分析与修复建议
一、漏洞背景
Oracle官方在北京时间2018年4月18日凌晨发布了关键补丁更新,其中包含了OracleWebLogic Server的一个高危反序列化漏洞(CVE-2018-2628),通过该漏洞,攻击者可以在未授权的情况下远程执行代码。
CVE-2018-2628为CVE-2017-3248修复版本的绕过,远程攻击者可利用该漏洞在未授权的情况下发送攻击数据,通过T3协议在Weblogic Server中执行反序列化操作,利用RMI(远程方法调用) 机制的缺陷,通过 JRMP 协议达到执行任意反序列化 payload 的目的。CVE-2018-2628原理为在CVE-2017-3248补丁中InboundMsgAbbrev的resolveProxyClass处理rmi接口类型,只判断了java.rmi.registry.Registry,找一个其他的rmi接口即可绕过,比如java.rmi.activation.Activator。
二、补丁分析
针对Oracle发布的最新补丁进行测试,测试版本:weblogic10.3.6.0,反序列化工具为ysoserial。
更新Weblogic 10.3.6.0至最新补丁版本(BUG27395085_10360180417):
使用大神[2]的测试脚本,利用ysoserial工具生成反序列化payload,成功执行命令,补丁仍可绕过。
测试环境使用的jdk为1.6.0.45,经测试,更新最新补丁后,ysoserial的payload仅Jdk7u21才能成功执行命令,CommonsCollections已无法执行代码。
分析BUG27395085_10360180417补丁代码,其weblogic.utils.io.oif.ebLogicFilterConfig类中定义了RMI远程反序列化的黑名单,其中”sun.rmi.server.UnicastRef”为该补丁新增的黑名单类。
private staticfinal String[] DEFAULT_BLACKLIST_CLASSES =
{"org.codehaus.groovy.runtime.ConvertedClosure","org.codehaus.groovy.runtime.ConversionHandler","org.codehaus.groovy.runtime.MethodClosure","org.springframework.transaction.support.AbstractPlatformTransactionManager","sun.rmi.server.UnicastRef" };
黑名单被InboundMsgAbbrev.class中resolveClass的checkLegacyBlacklistIfNeeded方法调用,其对于反序列化传入的类名是否在黑名单内进行判断,如在黑名单类则抛出异常。因此,该补丁尝试过滤反序列化类名sun.rmi.server.UnicastRef进行修复。
启用Weblogic调试模式[6],利用上述payload进行攻击,设置断点跟踪调试,可以发现传入的反序列化类名,依次为java.lang.Object->java.util.Vector->java.lang.reflect.Proxy->java.rmi.server.RemoteObjectInvocationHandler->java.rmi.server.RemoteObject,这也是该payload的反射链[7]。payload使用 ysoserial序列化一个 RemoteObjectInvocationHandler,RemoteObjectInvocationHandler使用UnicastRef建立到远端的 TCP 连接获取RMI registry。而新增的黑名单sun.rmi.server.UnicastRef虽然在payload中使用,但并未包含在反射链中。因此,补丁所希望起到的RMI远程反序列化修复效果并未生效,该漏洞仍可绕过。
而使用ysoserial的CommonsCollections生成的payload测试已无法成功执行命令,原因应为补丁中weblogic.rmi.ClassFilter对CommonsCollections反序列化所用到的InvokerTransformer等类设置了黑名单org.apache.commons.collections.functors:
private staticfinal String DEFAULT_BLACK_LIST =
"+org.apache.commons.collections.functors,+com.sun.org.apache.xalan.internal.xsltc.trax,+javassist,+org.codehaus.groovy.runtime.ConvertedClosure,+org.codehaus.groovy.runtime.ConversionHandler,+org.codehaus.groovy.runtime.MethodClosure,+org.springframework.transaction.support.AbstractPlatformTransactionManager";
因此,更新补丁后,对于jdk
三、修复建议
1. 此漏洞产生于Weblogic T3服务,当开放Weblogic控制台端口(默认为7001端口)时,T3服务会默认开启。关闭T3服务,或控制T3服务的访问权限,能防护该漏洞。对于不在Oracle官方支持范围内的版本,由于没有最新补丁,推荐采用此种方式进行修复。同时,Weblogic采用黑名单的方式进行反序列化漏洞的修复,存在被绕过的风险,因此控制T3服务为防护Weblogic RMI这类反序列化漏洞的有效方式。控制T3服务方式:
a)进入Weblogic控制台,在base_domain的配置页面中,进入“安全”选项卡页面,点击“筛选器”,进入连接筛选器配置。
b)在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl,在连接筛选器规则中输入:127.0.0.1 * * allow t3 t3s,0.0.0.0/0 * * deny t3 t3s(t3和t3s协议的所有端口只允许本地访问)。
c)保存后需重新启动,规则方可生效。
2. 更新Oracle官方发布的最新补丁,同时升级jdk至1.7.0.21以上版本。
3. 如以上两种策略都无法采用,则可以考虑用更改代码的方式。以10.3.6.0为例,在weblogic.utils.io.oif.WebLogicFilterConfig的黑名单DEFAULT_BLACKLIST_CLASS中添加”java.rmi.server.RemoteObjectInvocationHandler”,编译并更新swlclient.jar、wlthint3client.jar这两个用到该类的包[4]。
一、漏洞背景
Oracle官方在北京时间2018年4月18日凌晨发布了关键补丁更新,其中包含了OracleWebLogic Server的一个高危反序列化漏洞(CVE-2018-2628),通过该漏洞,攻击者可以在未授权的情况下远程执行代码。
CVE-2018-2628为CVE-2017-3248修复版本的绕过,远程攻击者可利用该漏洞在未授权的情况下发送攻击数据,通过T3协议在Weblogic Server中执行反序列化操作,利用RMI(远程方法调用) 机制的缺陷,通过 JRMP 协议达到执行任意反序列化 payload 的目的。CVE-2018-2628原理为在CVE-2017-3248补丁中InboundMsgAbbrev的resolveProxyClass处理rmi接口类型,只判断了java.rmi.registry.Registry,找一个其他的rmi接口即可绕过,比如java.rmi.activation.Activator。
二、补丁分析
针对Oracle发布的最新补丁进行测试,测试版本:weblogic10.3.6.0,反序列化工具为ysoserial。
更新Weblogic 10.3.6.0至最新补丁版本(BUG27395085_10360180417):
使用大神[2]的测试脚本,利用ysoserial工具生成反序列化payload,成功执行命令,补丁仍可绕过。
测试环境使用的jdk为1.6.0.45,经测试,更新最新补丁后,ysoserial的payload仅Jdk7u21才能成功执行命令,CommonsCollections已无法执行代码。
分析BUG27395085_10360180417补丁代码,其weblogic.utils.io.oif.ebLogicFilterConfig类中定义了RMI远程反序列化的黑名单,其中”sun.rmi.server.UnicastRef”为该补丁新增的黑名单类。
private staticfinal String[] DEFAULT_BLACKLIST_CLASSES =
{"org.codehaus.groovy.runtime.ConvertedClosure","org.codehaus.groovy.runtime.ConversionHandler","org.codehaus.groovy.runtime.MethodClosure","org.springframework.transaction.support.AbstractPlatformTransactionManager","sun.rmi.server.UnicastRef" }; 无奈人生安全网
黑名单被InboundMsgAbbrev.class中resolveClass的checkLegacyBlacklistIfNeeded方法调用,其对于反序列化传入的类名是否在黑名单内进行判断,如在黑名单类则抛出异常。因此,该补丁尝试过滤反序列化类名sun.rmi.server.UnicastRef进行修复。
启用Weblogic调试模式[6],利用上述payload进行攻击,设置断点跟踪调试,可以发现传入的反序列化类名,依次为java.lang.Object->java.util.Vector->java.lang.reflect.Proxy->java.rmi.server.RemoteObjectInvocationHandler->java.rmi.server.RemoteObject,这也是该payload的反射链[7]。payload使用 ysoserial序列化一个 RemoteObjectInvocationHandler,RemoteObjectInvocationHandler使用UnicastRef建立到远端的 TCP 连接获取RMI registry。而新增的黑名单sun.rmi.server.UnicastRef虽然在payload中使用,但并未包含在反射链中。因此,补丁所希望起到的RMI远程反序列化修复效果并未生效,该漏洞仍可绕过。 无奈人生安全网
而使用ysoserial的CommonsCollections生成的payload测试已无法成功执行命令,原因应为补丁中weblogic.rmi.ClassFilter对CommonsCollections反序列化所用到的InvokerTransformer等类设置了黑名单org.apache.commons.collections.functors:
private staticfinal String DEFAULT_BLACK_LIST =
"+org.apache.commons.collections.functors,+com.sun.org.apache.xalan.internal.xsltc.trax,+javassist,+org.codehaus.groovy.runtime.ConvertedClosure,+org.codehaus.groovy.runtime.ConversionHandler,+org.codehaus.groovy.runtime.MethodClosure,+org.springframework.transaction.support.AbstractPlatformTransactionManager";
因此,更新补丁后,对于jdk
三、修复建议
1. 此漏洞产生于Weblogic T3服务,当开放Weblogic控制台端口(默认为7001端口)时,T3服务会默认开启。关闭T3服务,或控制T3服务的访问权限,能防护该漏洞。对于不在Oracle官方支持范围内的版本,由于没有最新补丁,推荐采用此种方式进行修复。同时,Weblogic采用黑名单的方式进行反序列化漏洞的修复,存在被绕过的风险,因此控制T3服务为防护Weblogic RMI这类反序列化漏洞的有效方式。控制T3服务方式:
无奈人生安全网
a)进入Weblogic控制台,在base_domain的配置页面中,进入“安全”选项卡页面,点击“筛选器”,进入连接筛选器配置。
b)在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl,在连接筛选器规则中输入:127.0.0.1 * * allow t3 t3s,0.0.0.0/0 * * deny t3 t3s(t3和t3s协议的所有端口只允许本地访问)。
c)保存后需重新启动,规则方可生效。
2. 更新Oracle官方发布的最新补丁,同时升级jdk至1.7.0.21以上版本。
3. 如以上两种策略都无法采用,则可以考虑用更改代码的方式。以10.3.6.0为例,在weblogic.utils.io.oif.WebLogicFilterConfig的黑名单DEFAULT_BLACKLIST_CLASS中添加”java.rmi.server.RemoteObjectInvocationHandler”,编译并更新swlclient.jar、wlthint3client.jar这两个用到该类的包[4]。
copyright 无奈人生