Критична уязвимост в Exim, която позволява изпълнение на код на сървъра с права root

В пощенския сървър Exim е открита критична уязвимост (CVE-2019-10149), което може да доведе до отдалечено изпълнение на код на сървъра с права root при обработка на специално форматирано искане. Възможността за експлоатация на проблема е отбелязана в версиите от 4.87 до 4.91 включително или при компилация с опцията EXPERIMENTAL_EVENT.

В конфигурацията по подразбиране атаката може да бъде извършена без излишни усложнения от локален потребител, тъй като се прилага 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.

Забележително е, че уязвимостта е е отстранена в излезлия през февруари 4.92, без акцентиране на факта, че корекцията може да доведе до проблеми със сигурността. Няма основания да се смята, че е имало съзнателно прикриване на уязвимостта от разработчиците на Exim, тъй като проблемът е бил отстранен в процеса на поправки срива, който възниква при предаване на некоректни адреси, а уязвимостта е била открита от компанията Qualys при провеждане на одит на промените в Exim.

Корекция за предишни версии, които продължават да се използват в дистрибутивите, все още е налична само във вида на пач. Коригиращи издания за предишните версии с отстраняване на проблема са планирани за 11 юни. Актуализациите на пакетите са подготвени за Debian, Ubuntu, openSUSE. Arch Linux и Fedora представят версия 4.92, в която проблемът не се проявява. RHEL и CentOS по проблема не са податливи, тъй като Exim не влиза в техния стандартен репозиториум за пакети.

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster