Удалённо эксплуатируемая уязвимость в почтовом сервере qmail

Исследователи безопасности из компании Qualys показали возможность эксплуатации уязвимости в почтовом сервере qmail, известной ещё с 2005 года (CVE-2005-1513), но остававшейся неисправленной, так как автор qmail утверждал о нереалистичности создания работающего эксплоита, который мог бы применяться для атаки на системы в конфигурации по умолчанию. В 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. Первая уязвимость (CVE-2020-3811) позволяет обойти проверку email-адреса, а вторая (CVE-2020-3812) приводит к утечке локальной информации. В частности, первая уязвимость позволяет обойти проверку корректности адреса, применяемого в эксплоите для передачи команды (проверка не срабатывает для адресов без домена, таких как «localuser-;command;»). Вторая уязвимость может использоваться для проверки наличия файлов и каталогов в системе, в том числе доступных только для root (qmail-verify запускается с правами root), через прямое обращение к локальному обработчику.

Для обхода проблемы Бернштейн рекомендовал запускать процессы qmail с выставлением общего лимита на доступную память («softlimit -m12345678»), и в этом случае проблема блокируется. В качестве альтернативного способа защиты также упоминается ограничение максимального размера обрабатываемого сообщения через файл «control/databytes» (по умолчанию не создаётся при настройках по умолчанию qmail остаётся уязвим). Кроме того, «control/databytes» не защищает от локальных атак со стороны пользователей системы, так как ограничение учитывается только в qmail-smtpd.

Проблема затрагивает пакет netqmail, входящий в репозитории Debian. Для данного пакета подготовлен набор патчей, устраняющий как старые уязвимости 2005 года (через добавление в код функции alloc() жёстких лимитов на память), так и новые проблемы в qmail-verify. Отдельно подготовлен обновлённый вариант патча qmail-verify. Разработчики ответвления notqmail подготовили свои патчи для блокирования старых проблем, а также запустили работу по устранению всех возможных целочисленных переполнений в коде.

Источник: opennet.ru