xercesc::DOMLSParserImpl::doctypeDecl内外部实体参数颠倒问题问询
Xercesc-3.1.4中DOMLSParserImpl::doctypeDecl参数颠倒问题解答
问题确认
你遇到的是xercesc-3.1.4版本的已知参数传递bug:DOMLSParserImpl::doctypeDecl方法的has_internal和has_external参数实际传入值与方法签名语义完全颠倒——处理带外部实体的文档时,has_internal=true且has_external=false;处理内部实体时则相反。
问题背景与验证
在使用依赖xercesc-3.1.4的libxsd-3.3.0修复XXE漏洞时,重写doctypeDecl方法调整拦截逻辑后发现:原本预期拦截外部实体的if(hase)不生效,改用if(hasi)才会触发异常,日志验证也确认了参数值颠倒的现象。
是否为已知问题?
这是xercesc 3.1.x版本的特定bug,并非通用安全漏洞,后续发布的3.2.0及更高版本已经修复了这个参数传递错误。不少使用旧版本的开发者都遇到过相同问题,属于版本兼容性问题。
临时解决方案
针对xercesc-3.1.4,若仅需拦截外部实体,需颠倒判断逻辑:
void SecureDOMParser::doctypeDecl (const DTDElementDecl& e, const XMLCh* const pub_id, const XMLCh* const sys_id, const bool hasi, const bool hase) { if (hasi) // 因参数颠倒,用hasi判断外部实体 ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::Gen_NoDTDValidator, fMemoryManager); DOMLSParserImpl::doctypeDecl (e, pub_id, sys_id, hasi, hase); }
长期解决方案是将xercesc升级到3.2.0及以上版本,彻底修复该参数传递错误。
内容的提问来源于stack exchange,提问作者neutrino
相关产品推荐
相关产品推荐

