Heap Overflow в Kakadu: Google обнаружила критические уязвимости в обработке JPEG 2000

Heap Overflow в Kakadu: Google обнаружила критические уязвимости в обработке JPEG 2000

Уязвимости в Kakadu ставят под удар миллионы серверов.

image

Команда Google CVR выявила серьёзные уязвимости в библиотеке Kakadu, предназначенной для работы с изображениями в формате JPEG 2000. Эта библиотека часто используется в различных крупных сервисах, включая Google, что делает проблему особенно актуальной. Обнаруженные уязвимости могут позволить злоумышленникам удалённо выполнять код (Remote Code Execution, RCE) на уязвимых серверах, что является одной из наиболее опасных угроз.

Особенности эксплуатации уязвимостей

Одной из главных сложностей при эксплуатации уязвимостей, связанных с повреждением памяти (Memory Corruption), является необходимость точного знания о целевой среде — версии бинарных файлов, операционной системы и аллокаторов памяти. Такие сведения необходимы, чтобы подготовить память системы и использовать ROP-цепочки для внедрения вредоносного кода. Поэтому подобные атаки чаще всего направлены на клиентские приложения (например, браузеры или мобильные устройства), где есть возможность детального изучения среды.

Однако в случае с серверным программным обеспечением, где у злоумышленника нет доступа к исходному коду или бинарным файлам, атака становится значительно сложнее. Особенно это касается ситуаций, когда ПО используется в распределённой среде с балансировкой нагрузки. Даже если атакующий смог победить Address Space Layout Randomization (ASLR) в одном запросе, у него нет гарантии, что следующий запрос попадёт на тот же рабочий процесс, что усложняет последовательную атаку.

Уязвимости в библиотеке Kakadu

Команда CVR сосредоточилась на библиотеке Kakadu, которая является одной из лидирующих разработок для работы с JPEG 2000. В ходе анализа были выявлены две критические уязвимости:

  • Произвольное чтение файлов. JPEG 2000 поддерживает фрагментацию потоков данных (codestream fragmentation), что позволяет разделять данные изображения на несколько фрагментов, находящихся как в локальных файлах, так и на удалённых серверах. Такая функция, описанная в стандарте JPEG 2000, имеет уязвимость, позволяющую киберпреступнику читать произвольные файлы с локальной файловой системы сервера. Используя специально созданное изображение, можно включить фрагменты данных из локальных файлов и получить доступ к этим данным после обработки изображения.

  • Запись за пределами кучи (Heap Out-Of-Bounds Write). Уязвимость возникает из-за ошибки при умножении целых чисел со знаком, что позволяет записывать данные в область памяти за пределами выделенной. Kakadu использует 4-байтовые переменные для работы с шириной и высотой изображения, что приводит к переполнению при расчётах, особенно когда изображение состоит из нескольких больших тайлов (блоков данных изображения). Это даёт злоумышленникам возможность управлять памятью и записывать данные в произвольные области.

Метод «Условная порча»

Для успешной эксплуатации уязвимостей исследователи из Google разработали специальный метод под названием «условная порча» (Conditional Corruption). Метод позволил создать специальное изображение, которое модифицировало само себя во время процесса обработки, в зависимости от условий на сервере.

Процесс эксплуатации можно разделить на несколько этапов:

  1. Поиск информации о среде. Сначала злоумышленник использует уязвимость произвольного чтения файлов для извлечения критически важных данных о целевой среде. Например, можно прочитать содержимое файлов в каталоге /proc, чтобы получить информацию о карте памяти (например, файл /proc/self/maps). Это даёт возможность определить адреса различных областей памяти, таких как куча, стек, и исполняемый код.
  2. Использование переполнения кучи. Получив необходимые сведения, злоумышленник может отправить на сервер второе изображение, которое эксплуатирует уязвимость с записью за пределы кучи. Такая ошибка позволяет перезаписать объекты в памяти, что даёт возможность перехватить управление программой.
  3. Удалённое выполнение кода. Используя полученные сведения о памяти и контролируя записываемые в память данные, атакующий может создать цепочку вызовов, которая приведёт к выполнению произвольного кода на сервере.

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

Для решения проблемы исследователи использовали технику, которая позволяла точно синхронизировать работу на одном и том же рабочем процессе. Техника основывалась на последовательных запросах, которые учитывали особенности сервера и позволяли избегать неправильного выбора процессов.

Уязвимости в библиотеке Kakadu демонстрируют, как сложные атаки на основе повреждения памяти могут быть использованы для удалённого выполнения кода в условиях ограниченных знаний о целевой среде. Благодаря методу «условной порчи» исследователи смогли преодолеть барьеры, связанные с отсутствием информации о системе, и разработать надёжный способ эксплуатации. Результаты работы подчёркивают важность регулярного обновления библиотек и применения современных методов защиты, таких как ASLR и балансировка нагрузки, которые делают эксплуатацию уязвимостей более сложной.

Ньютон уронил яблоко. Мы роняем челюсти!

Гравитация научных фактов сильнее, чем вы думаете

Подпишитесь и испытайте интеллектуальное падение