libxml2库中的严重漏洞:对C++项目的威胁

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在C++库libxml2中发现严重漏洞:威胁数千个项目



C++开发者社区因广泛使用的libxml2库中发现严重漏洞而震惊。该库是C和C++项目中XML文档解析的事实标准,用于Linux、macOS操作系统、网页浏览器、办公套件以及无数应用软件中。该漏洞被标识为CVE-2024-XXXX(编号已分配,详情待公布),允许攻击者在目标系统上执行任意代码。



问题本质

Project Zero团队的研究人员发现,错误在于XML文档中递归实体(entities)的处理机制。当处理一个包含嵌套外部实体引用的特制XML文件时,会发生堆缓冲区溢出(heap buffer overflow)。这会导致内存损坏,并根据保护堆栈的情况,有可能以当前进程的权限执行任意代码。



该漏洞的特殊之处在于,即使不启用实体扩展选项(XML_PARSE_NOENT),攻击也可能发生。如果输入的XML文档包含恶意结构,使用xmlReadFile()或xmlParseDoc()函数的标准解析也会变得脆弱。



谁面临风险?

使用libxml2的项目列表非常庞大。直接面临威胁的有:

  • 浏览器:Chrome(通过解析SVG和XHTML)、Safari、Firefox及其衍生版本。
  • 编程语言:Python(lxml库)、Ruby(libxml-ruby)、PHP(DOM/SimpleXML扩展)。
  • 系统工具:包管理器(apt、yum)、构建系统(CMake、Meson)和配置工具。
  • 办公套件:LibreOffice、OpenOffice(用于导入ODF、DOCX格式的文档)。


保护建议

强烈建议C++开发者和系统管理员采取以下步骤:

  • 更新库:立即将libxml2更新到2.13.2或更高版本。补丁已在官方仓库中发布。
  • 检查依赖项:如果您使用包管理器(vcpkg、Conan),请执行vcpkg upgrade libxml2或适用于您的管理器的类似命令。
  • 启用沙箱:对于解析用户提供的XML的服务器应用程序,建议在隔离环境(chroot、Docker)中以最小权限运行解析器。
  • 禁用未使用的功能:在代码中,仅在绝对必要时使用xmlCtxtUseOptions(parser_ctxt, XML_PARSE_HUGE | XML_PARSE_NOENT | XML_PARSE_DTDLOAD)。

此外,为了提高安全性,可以通过DTD模式实现XML文档的预验证。但这并不能完全防御此特定漏洞——只有更新到最新版本才能保证安全。



结论

推荐库