В конфигурации по умолчанию атака может быть совершена без лишних усложнений локальным пользователем, так как применяется ACL «verify = recipient», выполняющий дополнительные проверки для внешних адресов. Совершение удалённой атаки возможно при изменении настроек, например, при работе в роли вторичного MX для другого домена, удалении ACL «verify = recipient» или определённых изменениях в local_part_suffix). Удалённая атака также возможна если злоумышленник сможет удержать соединение с сервером открытым в течение 7 дней (например, отправляя по одному байту в минуту для обхода обрыва по таймауту). При этом не исключается, что для удалённой эксплуатации проблемы существуют и более простые векторы атаки.
Уязвимость вызвана некорректной проверкой адреса получателя в функции deliver_message(), определённой в файле /src/deliver.c. Через манипуляцию с форматированием адреса атакующий может добиться подстановки своих данных в аргументы команды, вызываемой через функцию execv() с правами root. Для эксплуатации не требуется применение сложных техник, используемых при переполнениях буфера или повреждении памяти, достаточно просто подстановки символов.
Проблема связана с применением для преобразования адресов конструкции:
deliver_localpart = expand_string( string_sprintf("${local_part:%s}", new->address)); deliver_domain = expand_string( string_sprintf("${domain:%s}", new->address));
Функция expand_string() является переусложнённым комбайном, в том числе распознающим команду «${run{команда аргументы}», приводящую к запуску внешнего обработчика. Таким образом для атаки в рамках SMTP-сеанса достаточно локальным пользователем передать команду вида ‘RCPT TO «username+${run{…}}@localhost»‘, где localhost один из хостов из списка local_domains, а username имя существующего локального пользователя. Если сервер работает в качестве почтового релея достаточно удалённо отправить команду ‘RCPT TO «${run{…}}@relaydomain.com»‘, где relaydomain.com один из хостов, перечисленных в секции настроек relay_to_domains. Так как по умолчанию в exim не применяется режим сброса привилегий (deliver_drop_privilege = false), переданные через «${run{…}}» команды будут выполнены с правами root.
Проблема выявлена компанией Qualys, которая пока не опубликовала прототип эксплоита, но утверждает о наличии тривиальной и работающей техники эксплуатации. Примечательно, что уязвимость была устранена вышедшем в феврале в выпуске 4.92 без акцентирования внимания на то, что исправление может привести к проблемам с безопасностью. Нет оснований полагать, что имело место осознанное сокрытие уязвимости разработчиками Exim, так как проблемы была устранена в ходе исправления сбоя, а уязвимость была выявлена при проведении аудита изменений в Exim.
Исправление для прошлых версий, которые продолжают применяться в дистрибутивах, пока доступно только в виде патча. Корректирующие выпуски для прошлых веток с устранением проблемы запланированы на 11 июня. Обновления пакетов подготовлены для Debian, Ubuntu, openSUSE. Arch Linux и Fedora поставляют версию 4.92, в которой проблема не проявляется. RHEL и CentOS проблеме не подвержены, так как Exim не входит в репозиторий пакетов.
Источник: http://www.opennet.ru/opennews/art.shtml?num=50819
