Обнаружена критическая уязвимость в C++ библиотеке libxml2: угроза для тысяч проектов
Сообщество разработчиков на C++ было встревожено новостью об обнаружении критической уязвимости в широко используемой библиотеке libxml2. Эта библиотека, являющаяся стандартом де-факто для парсинга XML-документов в C и C++ проектах, используется в операционных системах Linux, macOS, в веб-браузерах, офисных пакетах и бесчисленном множестве прикладного программного обеспечения. Уязвимость, получившая идентификатор CVE-2024-XXXX (номер присвоен, подробности ожидаются), позволяет злоумышленнику выполнить произвольный код на целевой системе.
Суть проблемы
Исследователи из команды Project Zero обнаружили, что ошибка кроется в механизме обработки рекурсивных сущностей (entities) в XML-документах. При обработке специально сформированного XML-файла, содержащего вложенные ссылки на внешние сущности, происходит переполнение буфера в куче (heap buffer overflow). Это приводит к повреждению памяти и, в зависимости от стека защиты, к возможности выполнения произвольного кода с привилегиями текущего процесса.
Особенность уязвимости в том, что атака возможна даже без включения опции расширения сущностей (XML_PARSE_NOENT). Стандартный парсинг с помощью функций xmlReadFile() или xmlParseDoc() оказывается уязвимым, если входной XML-документ содержит злонамеренную структуру.
Кто под ударом?
Список проектов, использующих 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или аналогичную команду для вашего менеджера. - Включить sandbox: Для серверных приложений, парсящих пользовательский XML, рекомендуется запускать парсер в изолированном окружении (chroot, Docker) с минимальными привилегиями.
- Отключить неиспользуемые функции: В коде используйте
xmlCtxtUseOptions(parser_ctxt, XML_PARSE_HUGE | XML_PARSE_NOENT | XML_PARSE_DTDLOAD)только при крайней необходимости.
Дополнительно, для повышения безопасности, можно реализовать предварительную валидацию XML-документов с помощью DTD-схемы. Однако это не является полной защитой от данной конкретной уязвимости — только обновление до последней версии гарантирует безопасность.