• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Гостевая статья Уязвимость OpenSMTPD (CVE-2020-8794) может привести к повышению привилегий и удаленному выполнению кода

Уязвимость повышения привилегий и удаленного выполнения (обозначенная как ) была обнаружена в бесплатном демоне Unix с открытым исходным кодом OpenSMTPD. Недостаток происходит из-за чтения, которое злоумышленники могут использовать для выполнения произвольного кода в уязвимых системах.

В чем заключается уязвимость?
Qualys Research Labs и раскрытая 24 февраля 2020 года, эта уязвимость затрагивает все версии OpenSMTPD до 6.6.4. Являясь частью проекта OpenBSD, OpenSMTPD облегчает обмен сообщениями по электронной почте, позволяя извлекать и доставлять почту, и реализует протокол SMTP.

Это третья уязвимость OpenSMTPD, обнаруженная в прошлом месяце, причем две предыдущие - это уязвимость удаленного выполнения кода ( ), позволяющая злоумышленникам выполнять произвольные команды от имени пользователя root с помощью специально созданного сеанса SMTP и уязвимости ( ), что позволяет локальным пользователям потенциально читать произвольные системные файлы.

Эта уязвимость (CVE-2020-8794) особенно важна, поскольку она затрагивает установки по умолчанию OpenSMTPD, а самая последняя версия OpenBSD (версия 6.6 на момент написания) поставляется с уязвимой версией.

CVE-2020-8794, первоначально представленный в OpenSMTPD в версии 5.7.1 и включенный в OpenBSD с декабря 2015 года, позволял злоумышленникам запускать команды от имени любого пользователя без полномочий root. Эффект от этой ошибки ухудшился после того, как OpenSMTPD переключился на новую грамматику сообщений в мае 2018 года, где он позволял злоумышленникам запускать команды от имени пользователя root.

Как можно использовать уязвимость?
Местоположение уязвимости находится в mta_session.c, в частности, в функции mta_io, которая отвечает за анализ многострочных ответов от SMTP-сервера. Ошибка за пределами допустимого диапазона возникает, когда последняя строка ответа не соответствует стандартному формату трехзначного кода / пробела / текста (например, вместо «250 ДАННЫЕ» мы передаем «250»).

Когда это происходит, указатель, используемый программой для чтения строки, в конечном итоге указывает на местоположение, которое находится после нулевого терминатора '\ 0'. В результате программа неправильно читает его и добавляет следующие строки в буфер.

Если ответное сообщение является ошибкой, содержимое (включая дополнительные строки) сохраняется внутри конверта, описывающего поведение почты. Поскольку символы новой строки могут быть включены в дополнительные строки, злоумышленник может изменить этот внутренний файл и, таким образом, изменить поведение OpenSMTPD.

fig-1-opensmtpd-vuln-code-mta-io-function.png

Рисунок 1. Уязвимый код внутри функции mta_io : если последняя строка ответа имеет неправильный формат, все оставшееся содержимое также добавляется в replybuf, поскольку p указывает на местоположение после нулевого байта

Уязвимость находится в части кода на стороне клиента, а не на стороне сервера, поэтому для ее использования необходимо проделать определенную работу, поскольку клиент обычно прослушивает только локальный хост. Существует два способа использования уязвимости: на стороне клиента и на стороне сервера.

Эксплуатация на стороне клиента является более простым методом. По сути, если клиентский компьютер отправляет почтовое сообщение на скомпрометированный почтовый сервер, сервер может ответить, используя специально созданный ответ, который приводит к возникновению ошибки чтения вне пределов. Затем он вставляет следующие строки в почтовый конверт:

fig-2-opensmtpd-vuln-lines-injected.png

Рисунок 2. Линии, введенные в почтовый конверт, где команда является произвольной, которую злоумышленник хочет выполнить

Поскольку тип сообщения был изменен на MDA (агент доставки сообщений), OpenSMTPD выполняет команду, когда сообщение не доставляется, давая злоумышленнику возможность выполнить произвольный код на уязвимой машине.

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

После перезапуска сервера он выполнит команду, сохраненную в сообщении, с временной ошибкой.

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

Более старые версии (до мая 2018 года) имеют очень похожий метод эксплуатации - основными отличиями являются ответное почтовое сообщение, имеющее немного другой формат, и тот факт, что разрешены только пользователи без полномочий root.

fig-3-opensmtpd-vuln-lines-injected-older-versions.png

Рисунок 3. Линии, введенные в конверт для старых версий

Уязвимость была исправлена в версии 6.6.4, и исправление работает, добавляя дополнительную проверку длины последней строки сообщения, превышающей 4. Таким образом, указатель p больше не может указывать за нулевой символ; в результате он больше не будет читать за пределами содержимого.
fig-4-opensmtpd-vuln-lines-mta-io-function-check-string.png

Рисунок 4. Патч функции mta_io закрывает прочтение за пределами проверки, проверяя, равна ли длина строки как минимум 4, прежде чем собирать сообщение


Истоник:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!