Публикувана версия на пощенския сървър Exim 4.94.2, която отстранява 21 уязвимости (CVE-2020-28007-CVE-2020-28026, CVE-2021-27216), открити от компанията Qualys и представени под кодовото име 21Nails. 10 от проблемите могат да бъдат експлоатирани отдалечено (включително за изпълнение на код с права root), чрез манипулации с SMTP команди при взаимодействие със сървъра.
Проблемите засягат всички версии на Exim, чиято история се проследява в Git от 2004 г. За 4 локални уязвимости и 3 отдалечени проблеми са подготвени работни прототипи на експлоити. Експлоитите за локални уязвимости (CVE-2020-28007, CVE-2020-28008, CVE-2020-28015, CVE-2020-28012) позволяват повишаване на привилегиите до потребител root. Две отдалечени проблеми (CVE-2020-28020, CVE-2020-28018) позволяват без автентикация изпълнението на код с правата на потребител exim (после може да се получи достъп до root, експлоатирайки една от локалните уязвимости).
Уязвимостта CVE-2020-28021 позволява незабавно отдалечено изпълнение на код с права root, но изисква автентикиран достъп (потребителят трябва да установи автентикирана сесия, след което може да експлоатира уязвимостта чрез манипулация с параметъра AUTH в командата MAIL FROM). Проблемът произтича от това, че атакуващият може да постигне подмяна на низ в заглавката на spool файла поради записването на стойността на authenticated_sender без подходящо екраниране на специални символи (например, предавайки командата „MAIL FROM:& AUTH=Raven+0AReyes“).
Допълнително се отбелязва, че още една отдалечена уязвимост CVE-2020-28017 е годна за експлоатация за изпълнение на код с правата на потребителя 'exim' без автентикация, но изисква наличието на повече от 25 GB памет. За останалите 13 уязвимости потенциално също могат да бъдат подготвени експлоити, но работа по тази посока все още не е извършвана.
Разработчиците на Exim бяха уведомени за проблемите още през октомври миналата година и прекараха повече от 6 месеца в разработването на корекции. Всички администратори се препоръчва спешно да обновят Exim на своите пощенски сървъри. сървъри до версия 4.94.2. Всички версии Exim до публикуването на 4.94.2 са обявени за остарели (obsolete). Публикуването на новата версия беше координирано с дистрибуциите, които одновременно публикуваха обновления на пакетите: Ubuntu, Arch Linux, FreeBSD, Debian, SUSE и Fedora. RHEL и CentOS не са засегнати от проблема, тъй като Exim не е включен в техния стандартен репозиторий (в EPEL обновлението все още отсъства).
Отдалечени уязвимости:
- CVE-2020-28017: Препълване на цяло число във функцията receive_add_recipient();
- CVE-2020-28020: Препълване на цяло число във функцията receive_msg();
- CVE-2020-28023: Четене извън пределите на заделен буфер във функцията smtp_setup_msg();
- CVE-2020-28021: Вкарване на нов ред в заглавката на спул файла;
- CVE-2020-28022: Запис и четене извън пределите на заделен буфер във функцията extract_option();
- CVE-2020-28026: Отсичане и вкарване на низ във функцията spool_read_header();
- CVE-2020-28019: Срив при нулиране на указателя на функция след възникване на грешка BDAT;
- CVE-2020-28024: Препълвания през долната граница на буфера във функцията smtp_ungetc();
- CVE-2020-28018: Досъединение с буфер след неговото освобождаване (use-after-free) в tls-openssl.c
- CVE-2020-28025: Четене извън пределите на заделен буфер във функцията pdkim_finish_bodyhash().
Локални уязвимости:
- CVE-2020-28007: Атака чрез символна връзка в директорията с логовете на Exim;
- CVE-2020-28008: Атаки срещу директорията с спул;
- CVE-2020-28014: Създаване на произволен файл;
- CVE-2021-27216: Изтриване на произволен файл;
- CVE-2020-28011: Препълване на буфер във функцията queue_run();
- CVE-2020-28010: Запис извън пределите на буфера във функцията main();
- CVE-2020-28013: Препълване на буфера във функцията parse_fix_phrase();
- CVE-2020-28016: Запис извън пределите на буфера във функцията parse_fix_phrase();
- CVE-2020-28015: Вкарване на нов ред в заглавката на спул файла;
- CVE-2020-28012: Липса на флага close-on-exec за привилегирования неноменован канал;
- CVE-2020-28009: Препълване на цяло число във функцията get_stdinput().
Източник: opennet.ru
