Уязвимости в OpenSMTPD, позволяющие удалённо и локально получить права root

Компания Qualys выявила ещё одну удалённую критическую уязвимость (CVE-2020-8794) в почтовом сервере OpenSMTPD, развиваемом проектом OpenBSD. Как и выявленная в конце января уязвимость, новая проблема даёт возможность удалённо выполнить произвольные команды shell на сервере с правами пользователя root. Уязвимость устранена в выпуске OpenSMTPD 6.6.4p1.

Проблема вызвана ошибкой в коде, осуществляющем доставку почты на удалённый почтовый сервер (не в коде, обрабатывающем входящие соединения). Атака возможна как на стороне клиента, так и на стороне сервера. На стороне клиента атака возможна в конфигурации OpenSMTPD по умолчанию, в которой OpenSMTPD принимает запросы только на внутреннем сетевом интерфейсе (localhost) и отправляет почтовые сообщения на внешние серверы. Для эксплуатации уязвимости достаточно, чтобы в процессе доставки письма OpenSMTPD установил сеанс с почтовым сервером, подконтрольным атакующему, или чтобы атакующий мог вклиниться в соединение клиента (MITM или перенаправление в ходе атак через DNS или BGP).

Для атаки на стороне сервера необходимо, чтобы OpenSMTPD был настроен на приём внешних сетевых запросов от других почтовых серверов или обслуживал сторонние сервисы, позволяющие отправить запрос на произвольный email (например, формы подтверждения адреса на сайтах). Например, злоумышленник может соединиться с сервером OpenSMTPD и отправить некорректное письмо (несуществующему пользователю), которое приведёт к ответной отправке письма с кодом ошибки (bounce) на сервер атакующего. Злоумышленник может эксплуатировать уязвимость в момент, когда OpenSMTPD подсоединиться для доставки уведомления на сервер атакующего. Внедрённые в ходе атаки shell-команды помещаются в файл, который выполняется с правами root при перезапуске OpenSMTPD, поэтому атакующий для заверения атаки должен дождаться перезапуска OpenSMTPD или инициировать крах OpenSMTPD.

Проблема присутствует в функции mta_io() в коде для разбора многострочного ответа, возвращаемого удалённым сервером после установки соединения (например, «250-ENHANCEDSTATUSCODES» и «250 HELP»). В OpenSMTPD рассчитано, что первая строка включает трёхзначное число и текст, разделённые символом «-«, а вторая строка трёхзначное число и текст, разделённые пробелом. Если во второй строке после трёхзначного числа не следует пробел и текст, указатель, используемый для определения текста, устанавливается на байт, следующий за символом ‘’ и предпринимается попытка копирования в буфер данных, следующих после конца строки.

По просьбе проекта OpenBSD публикация деталей об эксплуатации уязвимости отложена до 26 февраля, чтобы дать пользователям возможность обновить свои системы. Проблема присутствует в кодовой базе с декабря 2015 года, но эксплуатация до выполнения кода с правами root возможна с мая 2018 года. Исследователями подготовлен рабочий прототип эксплоита, который успешно протестирован в сборках OpenSMTPD для OpenBSD 6.6, OpenBSD 5.9, Debian 10, Debian 11 (testing) и Fedora 31.

В OpenSMTPD также выявлена ещё одна уязвимость (CVE-2020-8793), которая позволяет локальному пользователю прочитать первую строку любого файла в системе. Например, можно прочитать первую строку /etc/master.passwd, в которой размещается хэш пароля пользователя root. Уязвимость также позволяет прочитать всё содержимое файла, принадлежащего другому пользователю, если этот файл находится в одной ФС с каталогом /var/spool/smtpd/. Проблема не эксплуатируема во многих дистрибутивах Linux, в которых значение /proc/sys/fs/protected_hardlinks выставлено в 1.

Проблема является следствием неполного устранения проблем, озвученных в процессе аудита, проведённого Qualys в 2015 году. Атакующий может добиться выполнения своего кода с правами группы «_smtpq», выставив переменную «PATH=.» и разместив в текущем каталоге скрипт с именем makemap (утилита smtpctl запускает makemap без явного указания пути). Получив доступ к группе «_smtpq» атакующий затем может вызвать состояние гонки (создать большой файл в каталоге offline и отправить сигнал SIGSTOP) и, до завершения обработки, подменить файл в каталоге offline на жёсткую символическую ссылку, указывающую на целевой файл, содержимое которого нужно прочитать.

Примечательно, что в Fedora 31 уязвимость позволяет сразу получить привилегии группы root, так как процесс smtpctl снабжён флагом setgid root, вместо setgid smtpq. Получив доступ к группе root можно перезаписать содержимое /var/lib/sss/mc/passwd и получить полный root-доступ в системе.

Источник: http://www.opennet.ru/opennews/art.shtml?num=52423