在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文档的预验证。但这并不能完全防御此特定漏洞——只有更新到最新版本才能保证安全。