Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Совсем недавно, в начале лета, появились массовые призывы к обновлению Exim до версии 4.92 из-за уязвимости CVE-2019-10149 (Срочно обновляйте exim до 4.92 — идёт активное заражение / Хабр). А на днях выяснилось, что вредонос Sustes решил воспользоваться этой уязвимостью.
Теперь все экстренно обновившиеся могут опять «порадоваться»: 21 июля 2019 г. исследователь Zerons обнаружил критическую уязвимость в Exim Mail Transfer agent (MTA) при использовании TLS для версий от 4.80 до 4.92.1 включительно, позволяющую удаленно выполнять код с привилегированными правами (CVE-2019-15846).
Уязвимость
Уязвимость присутствует при использовании библиотек как GnuTLS, так и OpenSSL при установке защищенного TLS-соединения.
По словам разработчика Heiko Schlittermann, файл конфигурации в Exim по умолчанию не использует TLS, однако многие дистрибутивы во время установки создают необходимые сертификаты и включают защищенное соединение. Также более новые версии Exim устанавливают опцию tls_advertise_hosts=* и генерируют необходимые сертификаты.
depends on the configuration. Most distros enable it by default, but Exim needs a certificate+key to work as a TLS server. Probably Distros create a Cert during setup. Newer Exims have the tls_advertise_hosts option defaulting to "*" and create a self signed certificate, if none is provided.
Сама же уязвимость заключается в некорректной обработке SNI (Server Name Indication, технология, введенная в 2003 в RFC 3546 для запроса клиентом корректного сертификата для доменного имени, Распространение стандарта TLS SNI / Блог компании WEBO Group / Хабр) в ходе TLS-рукопожатия. Злоумышленнику достаточно отправить SNI, оканчивающийся бэкслешем ("\") и нулл-символом ("\0").
Исследователи из компании Qualys обнаружили баг в функции string_printing(tls_in.sni), который заключается в некорректном экранировании "\". В результате происходит запись обратного слеша в неэкранированном виде в файл заголовков print spool. Далее этот файл с привилегированными правами считывается функцией spool_read_header(), что ведет к переполнению кучи (heap overflow).
Стоит отметить, что на данный момент разработчики Exim создали PoC уязвимости с выполнением команд на удаленном уязвимом сервере, но в публичном доступе он пока отсутствует. В силу простоты эксплуатации бага это всего лишь вопрос времени, причем довольно короткого.
С более детальным исследованием компании Qualys можно ознакомиться здесь.
Использование SNI в TLS
Количество потенциально уязвимых публичных серверов
По статистике крупного хостинг-провайдера E-Soft Inc на 1 сентября, на арендованных серверах версия 4.92 используется в более чем 70% хостов.
Version | Number of Servers | Percent |
---|---|---|
4.92.1 | 6471 | 1.28% |
4.92 | 376436 | 74.22% |
4.91 | 58179 | 11.47% |
4.9 | 5732 | 1.13% |
4.89 | 10700 | 2.11% |
4.87 | 14177 | 2.80% |
4.84 | 9937 | 1.96% |
Other versions | 25568 | 5.04% |
Статистика компании E-Soft Inc
Если обратиться к поисковой системе Shodan, то из 5,250,000 в базе серверов:
- около 3,500,000 используют Exim 4.92 (около 1,380,000 с использованием SSL/TLS);
- более 74,000 используют 4.92.1 (около 25,000 с использованием SSL/TLS).
Таким образом, публично известных и доступных Exim потенциально уязвимых серверов насчитывается порядка 1.5 млн.
Поиск Exim-серверов в Shodan
Защита
- Самый простой, но не рекомендуемый вариант — не использовать TLS, что приведет к пересылке почтовых сообщений в открытом виде.
- Более предпочтительным для избежания эксплуатации уязвимости будет обновление до версии Exim Internet Mailer 4.92.2.
- В случае невозможности обновления или установки пропатченной версии можно задать ACL в конфигурации Exim для опции acl_smtp_mail со следующими правилами:
# to be prepended to your mail acl (the ACL referenced # by the acl_smtp_mail main config option) deny condition = ${if eq{\\}{${substr{-1}{1}{$tls_in_sni}}}} deny condition = ${if eq{\\}{${substr{-1}{1}{$tls_in_peerdn}}}}