У поштовому сервері Exim
У конфігурації за замовчуванням атака може бути здійснена без зайвих ускладнень локальним користувачем, оскільки застосовується 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.
Примітно, що вразливість була
Виправлення для попередніх версій, які продовжують застосовуватися в дистрибутивах, поки що доступне лише у вигляді
Джерело: opennet.ru