На пощенския сървър Exim критична (), който може да доведе до дистанционно изпълнение на код на сървъра с права 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 юни. Актуализации на пакетите са подготвени за , , . и предоставят версия 4.92, в която проблемът не се проявява. RHEL и CentOS не страдат от проблема , тъй като Exim не влезе в тяхната стандартна пакетна репозитория.
Източник: opennet.ru
