近日,国家信息安全漏洞库(CNNVD)收到关于微信支付SDK XXE(XML External Entity)漏洞(CNNVD-201807-083)情况的报送。成功利用该漏洞的攻击者可以远程读取服务器文件,获取商户服务器上的隐私数据,甚至可以支付任意金额购买商品。使用有漏洞的Java版本微信支付SDK进行支付交易的商家网站可能受此漏洞影响。目前,微信官方已经发布补丁修复该漏洞,建议用户及时确认是否受到漏洞影响,尽快采取修补措施。
一、漏洞介绍
微信支付官方SDK是微信支付官方的软件工具开发包,在使用微信支付时,商家需要向微信提供一个URL用来接收异步支付结果的通知,该接口接受XML格式的数据。XML语言标准支持了与外部进行实体数据交换的特性,如果程序在解析XML时没有限制或关闭该特性,同时外部又可以传入有恶意代码的XML数据就会触发漏洞。微信支付官方提供的SDK由于编码遗漏,未关闭该XML特性。商家在其系统中如果使用该版本SDK,系统便会受漏洞影响。
微信在支付过程中,其Java版本的SDK没有关闭该XML特性,导致攻击者在获取了接收通知的URL地址的前提下,可以通过构造恶意的XML数据包发送到该URL来窃取商家网站服务器上的隐私数据。
二、危害影响
成功利用该漏洞的攻击者可以远程读取服务器文件,获取商户服务器上的隐私数据,甚至可以支付任意金额购买商品。使用有漏洞的Java版本微信支付SDK进行支付交易的商家网站可能受此漏洞影响。
三、修复建议
目前,微信官方已经发布补丁修复该漏洞,建议用户及时确认是否受到漏洞影响,尽快采取修补措施,具体措施如下:
1.如果后台系统使用了官方SDK,请更新SDK到最新版本,链接如下:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
2.如果有系统提供商,请联系提供商进行核查和升级修复;
3.如果是自研系统,请联系技术部门按以下指引核查和修复:
XXE漏洞需要在代码中进行相应的设置,不同语言设置的内容不同,下面提供了几种主流开发语言的设置指引:
【PHP】
libxml_disable_entity_loader(true);
【JAVA】
不同java组件修复方案不一样,请参考OWASP修复建议:
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#Java
【.Net】
XmlResolver = null
【Python】
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
【c/c++(常用库为libxml2 libxerces-c)】
【libxml2】:
确保关闭配置选项:XML_PARSE_NOENT 和 XML_PARSE_DTDLOAD
2.9版本以上已修复xxe
【libxerces-c】:
如果用的是XercesDOMParser:
XercesDOMParser *parser = new XercesDOMParser;
parser->setCreateEntityReferenceNodes(false);
如果是用SAXParser:
SAXParser* parser = new SAXParser;
parser->setDisableDefaultEntityResolution(true);
如果是用SAX2XMLReader:
SAX2XMLReader* reader = XMLReaderFactory::createXMLReader();
parser->setFeature(XMLUni::fgXercesDisableDefaultEntityResolution, true);
此外,针对使用XML进行数据交换的网络系统(如:第三方支付平台等),建议相关系统厂商对解析处理XML数据的功能代码进行安全检查,可参考上述方法修复漏洞,及时消除漏洞风险。
本通报由CNNVD技术支撑单位——腾讯计算机系统有限公司、北京长亭科技有限公司、北京华顺信安科技有限公司提供支持。
CNNVD将继续跟踪上述漏洞的相关情况,及时发布相关信息。如有需要,可与CNNVD联系。