Разбор OLE2-документов в GNU libextractor приводит к переполнению стека и выполнению кода

GNU InetUtils

Библиотека libextractor из проекта GNU извлекает метаданные из файлов десятков форматов: заголовки, имена авторов, названия вложений, содержимое архивов. В её плагине для формата OLE2 нашлась уязвимость, из-за которой слишком длинный блок данных из документа переполняет буфер на стеке. Злоумышленник отправляет подготовленный файл .doc, и приложение, разбирающее его через эту библиотеку, падает. В многопоточных сборках у атакующего появляется возможность выполнить собственный код. Уязвимость зарегистрирована под идентификатором CVE-2026-91752. Нашёл её исследователь Haitam Lazaar, координатором выступила компания VulnCheck. Оценка по CVSS 4.0 - 8.7 балла, по CVSS 3.1 - 7.5. Библиотека распространяется свободно и входит в состав многих дистрибутивов Linux, поэтому её версия в системе не всегда очевидна.

Уязвимость CVE-2026-91752

Формат OLE2 знаком по старым документам Word, таблицам Excel и презентациям PowerPoint. По сути это контейнер, внутри которого лежат вложенные потоки с текстом, изображениями и служебными сведениями. Плагин libextractor читает такой поток и берёт его размер прямо из файла: автор документа задаёт это значение сам. Затем размер попадает в объявление массива на стеке, то есть в массив переменной длины. Стек - небольшой ресурс с жёстким пределом, обычно от одного до восьми мегабайт на поток. Потолок в четыре мегабайта, который поставили разработчики, почти ничего не меняет: в него укладывается значительная часть стека. Данные пишутся в буфер, и стек переполняется. Классификация относит проблему к двум категориям: выделение памяти по чрезмерно большому значению (CWE-789) и переполнение буфера на стеке (CWE-121).

Первое последствие - отказ в обслуживании. Для атаки не нужны учётные данные, не требуется и участие пользователя: достаточно, чтобы сервис принял файл на обработку. Документы приходят через загрузку на портал, письмо с вложением или общую сетевую папку, поэтому сетевой вектор здесь не теоретический. Падение разбора обрывает всю операцию. Если разбор идёт в рабочем процессе сервиса, вместе с парсером уходит и сам сервис. Свойства уязвимости удобны для злоумышленника: низкая сложность эксплуатации, отсутствие требований к привилегиям, автоматическое срабатывание при разборе файла.

Второе последствие тяжелее. Современные компиляторы добавляют проверку, которая ловит резкий прыжок указателя стека, - защиту от конфликтов стека, известную как -fstack-clash-protection. В однопоточном приложении она превращает атаку в обычное падение, и выполнить код не удаётся. В многопоточной программе стеки потоков расположены в памяти рядом. Проверки проходят по чужому стеку, защита не срабатывает, и переполнение становится управляемым. Разработчики признают такой обход рабочим и описывают методику в сопроводительных материалах к находке.

Страдают все версии библиотеки с плагином OLE2 вплоть до 1.14. Круг пострадавших не ограничен утилитой командной строки. libextractor подключают почтовые шлюзы, индексаторы файлов, поисковые системы, сервисы загрузки документов, сканеры вложений. В самом проекте GNU на неё опирается GNUnet - инструмент для обмена и индексирования файлов в распределённой сети. Проверки показали, что публикация подготовленного документа в GNUnet роняет служебный процесс, отвечающий за работу с файлами. Встраивают библиотеку и в серверные приложения, которые принимают вложения от внешних пользователей.

Демонстрационный стенд исследователь собрал на контейнерах. Скрипт создаёт вредоносный документ и отправляет его веб-сервису, индексирующему загруженные файлы. Сервис падает, а в сценарии с обходом защиты на сервере выполняется произвольная команда. Стенд воспроизводим, конфигурация открыта, поэтому выводы может проверить каждый. Для служб безопасности это удобная возможность протестировать собственные фильтры и убедиться, что вредоносный документ не доходит до парсера.

Исправление появилось в libextractor 1.15. Разработчики отказались от массива переменной длины. Теперь плагин работает с буфером фиксированного размера и читает из потока ровно столько байт, сколько тот вмещает. Обновление снимает и сценарий с отказом в обслуживании, и сценарий с выполнением кода. Администраторам нужно обновить библиотеку вместе с приложениями, которые подтягивают её как зависимость. Если установка откладывается, разумно изолировать разбор недоверенных документов в отдельные процессы с урезанными правами. Полезно также не запускать разбор в том же процессе, где работают остальные потоки сервиса. Проверить наличие уязвимой версии помогают системы учёта зависимостей и перечни компонентов сборки.

Проблема в libextractor повторяет закономерность последних лет. Библиотеки для разбора форматов получают данные напрямую от пользователя, и службы безопасности проверяют их реже. Обновляют такие компоненты медленнее, чем прикладное программное обеспечение, а зависимость от них косвенная. Потому проверка состава зависимостей и скорость установки исправлений дают больше, чем разовые меры вроде сетевых фильтров. Пока библиотека остаётся в сборке, файл от незнакомого отправителя несёт риск для всего сервиса, а не только для одного документа.

Ссылки

Комментарии: 0