Опубликован корректирующий выпуск Exim 4.92.2 с устранением критической уязвимости (CVE-2019-15846), которая в конфигурации по умолчанию может привести к удалённому выполнению кода злоумышленника с правами root. Проблема проявляется только при включении поддержки TLS и эксплуатируется через передачу специально оформленного клиентского сертификата или модифицированного значения в SNI. Уязвимость выявлена компанией Qualys.

Проблема присутствует в обработчике экранирования спецсимволов в строке (string_interpret_escape() из string.c) и вызвана тем, что символ » в конце строки интерпретируется перед нулевым символом (‘’) и экранирует его. При экранировании последовательность » и следующий далее нулевой код конца строки обрабатывается как один символ и указатель сдвигается на данные за пределами строки, которые обрабатываются как её продолжение.

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

В конфигурации по умолчанию уязвимость может быть эксплуатирована через передачу специально оформленных данных в SNI при установке защищённого соединения к серверу. Проблема также может быть эксаплуатирована через модификацию значений peerdn в конфигурациях, настроенных для аутентификации по сертификату клиента, или при импорте сертификатов. Атака через SNI и peerdn возможна начиная с выпуска Exim 4.80, в котором функция string_unprinting() была применена для разэкранирования содержимого peerdn и SNI.

Для атаки через SNI подготовлен прототип эксплоита, работающий на архитектурах i386 и amd64 в Linux-системах с Glibc. В эксплоите используется наложение данных на область кучи, приводящее к перезаписи памяти, в которой хранится имя файла лога. Имя файла заменяется на «/../../../../../../../../etc/passwd». Далее перезаписывается переменная с адресом отправителя, который первым сохраняется в лог, что позволяет добавить нового пользователя в систему.

Обновления пакетов с устранением уязвимости выпущено дистрибутивами Debian, Ubuntu, Fedora, SUSE/openSUSE и FreeBSD. RHEL и CentOS проблеме не подвержены, так как Exim не входит в их штатный репозиторий пакетов (в EPEL обновление уже сформировано, но пока не помещено в публичный репозиторий). В коде Exim проблема устраняется однострочным патчем, отключающем экранирующее действие обратного слэша, если он находится в конце строки.

В качестве обходного пути для блокирования уязвимости можно отключить поддержку TLS или добавить в
секцию ACL «acl_smtp_mail»:

deny condition = ${if eq{\}{${substr{-1}{1}{$tls_in_sni}}}}
deny condition = ${if eq{\}{${substr{-1}{1}{$tls_in_peerdn}}}}