Исследователи безопасности из компании Qualys
Проблема вызвана целочисленным переполнением в функции stralloc_readyplus(), которое может возникнуть при обработке очень большого сообщения. Для эксплуатации требовалась 64-разрядная система с объёмом виртуальной памяти более 4ГБ. При изначальном разборе уязвимости в 2005 году Дэниел Бернштейн (Daniel J. Bernstein), утверждал, что присутствующее в коде предположение о том, что размер выделяемого массива всегда укладывается в 32-битное значение основано на том, что никто не предоставляет гигабайты памяти каждому процессу. За последние 15 лет 64-разрядные системы на серверах вытеснили 32-разрядные, кардинально выросли объёмы поставляемой памяти и пропускная способность сетей.
Сопровождающие пакеты с qmail учли замечание Бернштейна и при запуске процесса qmail-smtpd ограничивали доступную память (например, в Debian 10 выставляется лимит в 7MB). Но инженеры из Qualys выяснили, что этого недостаточно и кроме qmail-smtpd удалённая атака может быть проведена на процесс qmail-local, который во всех проверенных пакетах оставался не ограничен. В качестве доказательства был подготовлен прототип эксплоита, пригодный для атаки на поставляемый в Debian пакет с qmail в конфигурации по умолчанию.
Для организации удалённого выполнения кода в ходе атаки требуется наличие на сервере 4ГБ свободного места на диске и 8ГБ ОЗУ.
Эксплоит позволяет запустить любые shell-команды с правами любого пользователя в системе, кроме root и системных пользователей, не имеющих своего подкаталога в каталоге «/home» (процесс qmail-local запускается с правами локального пользователя, которому осуществляется доставка).
Атака осуществляется
через отправку очень большого почтового сообщения, включающего несколько строк в заголовке, размером около 4GB и 576MB. Обработка такой строки в qmail-local приводит к целочисленному переполнению при попытке доставки сообщения локальному пользователю. Целочисленное переполнение следом приводит к переполнению буфера при копировании данных и возможности перезаписи страниц памяти с кодом libc. Через манипуляции с компоновкой передаваемых данных удаётся в том числе переписать адрес функции «open()», заменив его на адрес функции «system()».
Далее, в процессе вызова qmesearch() в qmail-local осуществляется открытие файла «.qmail-extension» через функцию open(), что приводит к фактическому запуску функции
system(«.qmail-extension»). Но так как часть файла «extension» образуется на основе адреса получателя (например, «localuser-extension@localdomain») атакующие могут организовать передачу команды для запуска, указав пользователя «localuser-;command;@localdomain» в качестве получателя сообщения.
В ходе анализа кода также были выявлены две уязвимости в дополнительном патче qmail-verify, который входит в состав пакета для Debian. Первая уязвимость (
Для обхода проблемы Бернштейн рекомендовал запускать процессы qmail с выставлением общего лимита на доступную память («softlimit -m12345678»), и в этом случае проблема блокируется. В качестве альтернативного способа защиты также упоминается ограничение максимального размера обрабатываемого сообщения через файл «control/databytes» (по умолчанию не создаётся при настройках по умолчанию qmail остаётся уязвим). Кроме того, «control/databytes» не защищает от локальных атак со стороны пользователей системы, так как ограничение учитывается только в qmail-smtpd.
Проблема затрагивает пакет
Источник: opennet.ru