Вразливість у OpenSMTPD, що дозволяє віддалено виконати код з правами root

У поштовому сервері, що розвивається проектом OpenBSD OpenSMTPD виявлено критична вразливість (CVE-2020-7247), що дозволяє віддалено виконати shell-команди на сервері з правами користувача root. Вразливість виявлено під час повторного аудиту, проведеного компанією Qualys Security (минулий аудит OpenSMTPD проводився 2015 року, а нова вразливість присутня з травня 2018 року). Проблема усунута у випуску OpenSMTPD 6.6.2. Всім користувачам рекомендується терміново встановити оновлення (для OpenBSD можна виправити виправлення через syspatch).

Запропоновано два варіанти атаки. Перший варіант працює в конфігурації OpenSMTPD за умовчанням (прийом запитів тільки з localhost) і дозволяє експлуатувати проблему локально, коли атакуючий може звернутися до локального мережного інтерфейсу (loopback) на сервері (наприклад, на системах хостингу). Другий варіант проявляється у разі настроювання OpenSMTPD для прийому зовнішніх мережевих запитів (поштовий сервер, який приймає сторонню пошту). Дослідниками підготовлено прототип експлоїту, який успішно працює як з варіантом OpenSMTPD зі складу OpenBSD 6.6, так і з версією, що переноситься для інших ОС (проведено в Debian Testing).

Проблема викликана помилкою у функції smtp_mailaddr(), що викликається для перевірки коректності значень у полях «MAIL FROM» та «RCPT TO», що визначають відправника/одержувача та передаються під час з'єднання з поштовим сервером. Для перевірки частини поштової адреси, що йде перед символом @, в smtp_mailaddr() викликається функція
valid_localpart(), яка вважає допустимими (MAILADDR_ALLOWED) символи «!#$%&'*/?^`{|}~+-=_», відповідно до вимог RFC 5322.

При цьому безпосереднє екранування рядка виконується у функції mda_expand_token(), яка замінює лише символи «!#$%&'*?`{|}~» (MAILADDR_ESCAPE). В подальшому, підготовлений в mda_expand_token() рядок використовується при виклику агента доставки (MDA) за допомогою команди 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...). листи в mbox через /bin/sh запускається рядок "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", де значення "%{mbox.from}" включає екрановані дані з параметра "MAIL FROM".

Суть уразливість у тому, що smtp_mailaddr() має логічну помилку, через яку у разі передачі порожнього домену в email, функція повертає успішний код перевірки, навіть якщо частина адреси до @ містить неприпустимі символи. Далі при підготовці рядка функцією mda_expand_token() екрануються не всі можливі спецсимволи shell, а лише спецсимволи, допустимі в поштовій адресі. Таким чином, для запуску своєї команди достатньо використовувати в локальній частині email символ ";" та пропуск, які не входять до набору MAILADDR_ESCAPE і не екрануються. Наприклад:

$ nc 127.0.0.1 25

HELO professor.falken
MAIL FROM:<;sleep 66;>
RCPT TO:
ДАНІ
.
ВИХІД

Після цього сеансу OpenSMTPD при доставці до mbox запустить через shell команду

/usr/libexec/mail.local -f; sleep 66; root

При цьому можливості атаки обмежуються тим, що локальна частина адреси не може перевищувати 64 символи, а спецсимволи '$' і '|' замінюються на ":" при екрануванні. Для обходу цього обмеження використано те що, що тіло листи передається після запуску /usr/libexec/mail.local через вхідний потік, тобто. через маніпуляції з адресою можна запустити лише командний інтерпретатор sh і використовувати тіло листа як набір інструкцій. Оскільки на початку листа вказуються службові SMTP-заголовки, їх пропуску пропонується використовувати виклик команди read в циклі. Робочий експлоїт набуває приблизно такого вигляду:

$ nc 192.168.56.143 25

HELO professor.falken
MAIL FROM:<;for i in 0 1 2 3 4 5 6 7 8 9 abcd;do read r;done;sh;exit 0;>
RCPT ДО:[захищено електронною поштою]>
ДАНІ
#0
#1
...
#d
for i in WOPR; do
echo -n «($i) » && id || break
done > /root/x.»`id -u`».»$$»
.
ВИХІД

Джерело: opennet.ru

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