背景
按照惯例,Oracle发布了4月份的补丁,详情见链接(https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html#AppendixFMW)一看就是一堆漏洞,高危的还好几个。
CVSS 评分为9.8的暂且不分析,我们先来看看wsee模块下的几个XXE漏洞,都是给的7.5的评分,个人觉得这分给的少,毕竟可以泄露weblogic的加密密钥和密码文件,破解之后就可以获取用户名和密码。在这些漏洞中要数@Matthias Kaiser的贡献最大,高危的都是他提交的。
简单分析
从补丁对比文件来看,在wsee模块下有5个都加了xxe的防护,那我们就从xxe漏洞入手。有一个新增的文件WSATStreamHelper.java,核心代码如下:
代码语言:javascript复制package weblogic.wsee.wstx.wsat;
import ...
public class WSATStreamHelper {
public static Source convert(InputStream in) {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXSource xmlSource = null;
try {
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
spf.setFeature("http://xml.org/sax/features/validation", false);
spf.setNamespaceAware(true);
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
xmlSource = new SAXSource(spf.newSAXParser().getXMLReader(), new InputSource(in));
} catch (Exception var4) {
if (WSATHelper.isDebugEnabled()) {
WSATHelper.getInstance().debug("Failed to call setFeature in SAXParserFactory. ");
}
}
return xmlSource;
}
}
稍微懂点xxe漏洞的人都知道这是xxe的防护代码,这个文件新加到了ForeignRecoveryContext.java和WSATXAResource.java中,就拿 ForeignRecoveryContext来入手。其修复后的代码如下:
代码语言:javascript复制public void readExternal(ObjectInput in) throws ClassNotFoundException, IOException {
klassVersion = in.readInt();
this.fxid = (Xid)in.readObject();
this.debug("ForeignRecoveryContext.readExternal tid:" this.fxid);
this.version = (Version)in.readObject();
int len = in.readInt();
byte[] eprBytes = new byte[len];
in.readFully(eprBytes);
this.epr = EndpointReference.readFrom(WSATStreamHelper.convert(new ByteArrayInputStream(eprBytes)));
this.debug("ForeignRecoveryContext.readExternal EndpointReference:" this.epr);
ForeignRecoveryContextManager.getInstance().add(this);
}
仔细对比下来就是EndpointReference.readFrom(WSATStreamHelper.convert(new ByteArrayInputStream(eprBytes)));WSATStreamHelper.convert是新加的,从前面代码中也可以看到在convert的过程中启用了xxe防护。再一看这个函数还是readExternal,这不就是典型的反序列化漏洞的入口吗?看官看到这就知道payload怎么来了,最典型的就是通过T3协议。
成果
可以看到调用栈如下:
漏洞防护
绿盟科技检测及防护产品已针对此漏洞(CVE-2019-2647)发布规则升级包。可为用户提供该漏洞的检测及防护能力。
防护产品规则信息:
规则版本号 | 升级包下载链接 | 规则编号 | |
---|---|---|---|
IPS | 5.6.10.20147 | http://update.nsfocus.com/update/downloads/id/28015 | 24470 |
5.6.9.20147 | http://update.nsfocus.com/update/downloads/id/28014 | ||
5.6.8.771 | http://update.nsfocus.com/update/downloads/id/28016 | ||
NF | 6.0.1.771 | http://update.nsfocus.com/update/downloads/id/28028 | |
5.6.7.771 | http://update.nsfocus.com/update/downloads/id/28029 |
检测产品规则信息:
升级包版本号 | 升级包下载链接 | |
---|---|---|
RSAS V6 web插件包 | V6.0R02F00.1302 | http://update.nsfocus.com/update/downloads/id/27999 |
RSAS V6 系统插件包 | V6.0R02F01.1402 | http://update.nsfocus.com/update/downloads/id/28019 |
RSAS V5 web插件包 | 5.0.18.31 | http://update.nsfocus.com/update/downloads/id/28001 |
RSAS V5系统插件包 | 5.0.18.32 | http://update.nsfocus.com/update/downloads/id/28032 |
WVSS V6 web插件包 | V6.0R03F00.129 | http://update.nsfocus.com/update/downloads/id/28006 |