Критична вразливість 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

Додати коментар або відгук