Крытычная ўразлівасць у 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 и Мяккая фетравы капялюш пастаўляюць версію 4.92, у якой праблема не праяўляецца. RHEL і CentOS праблеме не схільныя, так як Exim не ўваходзіць у іх штатны рэпазітар пакетаў.

Крыніца: opennet.ru

Дадаць каментар