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

Компанія Qualys виявила ще одну віддалену критичну вразливість (CVE-2020-8794) у поштовому сервері OpenSMTPD, що розвивається проектом OpenBSD. Як і виявлена ​​наприкінці січня вразливість, нова проблема дає можливість віддалено виконати довільні команди shell на сервері з правами користувача root. Вразливість усунута у випуску OpenSMTPD 6.6.4p1.

Проблема викликана помилкою в коді, що здійснює доставку пошти на віддалений поштовий сервер (не в коді, що обробляє вхідні з'єднання). Атака можлива як за клієнта, і за сервера. На стороні клієнта атака можлива у конфігурації OpenSMTPD за умовчанням, у якій OpenSMTPD приймає запити лише внутрішньому мережевому інтерфейсі (localhost) і відправляє поштові повідомлення зовнішні сервери. Для експлуатації вразливості достатньо, щоб у процесі доставки листа OpenSMTPD встановив сеанс із поштовим сервером, підконтрольним атакувальному, або щоб атакуючий міг вклинитися в з'єднання клієнта (MITM або перенаправлення під час атак через DNS або BGP).

Для атаки на стороні сервера необхідно, щоб OpenSMTPD був налаштований на прийом зовнішніх мережних запитів від інших поштових серверів або обслуговував сторонні сервіси, що дозволяють надіслати запит на довільний електронний лист (наприклад, форми підтвердження адреси на сайтах). Наприклад, зловмисник може з'єднатися з сервером OpenSMTPD і відправити некоректний лист (неіснуючому користувачеві), який призведе до відправки у відповідь листа з кодом помилки (bounce) на сервер атакуючого. Зловмисник може експлуатувати вразливість у момент, коли OpenSMTPD приєднається для доставки повідомлення на сервер атакуючого. Впроваджені під час атаки shell-команди поміщаються у файл, який виконується з правами root при перезапуску OpenSMTPD, тому атакуючий для завірення атаки повинен дочекатися перезапуску OpenSMTPD або ініціювати крах OpenSMTPD.

Проблема присутня у функції mta_io() у коді для аналізу багаторядкової відповіді, що повертається видаленим сервером після встановлення з'єднання (наприклад, «250-ENHANCEDSTATUSCODES» і «250 HELP»). В OpenSMTPD розраховано, що перший рядок включає тризначне число та текст, розділені символом «-«, а другий рядок тризначне число та текст, розділені пробілом. Якщо в другому рядку після тризначного числа не слідує пробіл і текст, покажчик, що використовується для визначення тексту, встановлюється на байт, що слідує за символом '\0' і робиться спроба копіювання в буфер даних, що йдуть після кінця рядка.

На прохання проекту OpenBSD публікацію деталей про експлуатацію вразливості відкладено до 26 лютого, щоб дати користувачам можливість оновити свої системи. Проблема є у кодовій базі з грудня 2015 року, але експлуатація до виконання коду з правами root можлива з травня 2018 року. Дослідниками підготовлено робочий прототип експлоїту, який успішно протестований у збірках OpenSMTPD для OpenBSD 6.6, OpenBSD 5.9, Debian 10, Debian 11 (testing) та Fedora 31.

В OpenSMTPD також виявлено ще одна вразливість (CVE-2020-8793), що дозволяє локальному користувачеві прочитати перший рядок будь-якого файлу в системі. Наприклад, можна прочитати перший рядок /etc/master.passwd, у якому розміщується хеш пароля користувача root. Вразливість також дозволяє прочитати весь вміст файлу, що належить іншому користувачеві, якщо файл знаходиться в одній ФС з каталогом /var/spool/smtpd/. Проблема не експлуатується у багатьох дистрибутивах Linux, у яких значення /proc/sys/fs/protected_hardlinks виставлено до 1.

Проблема є наслідком неповного усунення проблем, озвучених у процесі аудиту, проведеного Qualys у 2015 році. Атакуючий може домогтися виконання свого коду з правами групи _smtpq, виставивши змінну PATH=. та розмістивши в поточному каталозі скрипт з ім'ям makemap (утиліта smtpctl запускає makemap без явного вказівки шляху). Отримавши доступ до групи «_smtpq», атакуючий потім може викликати стан гонки (створити великий файл у каталозі offline і відправити сигнал SIGSTOP) і, до завершення обробки, підмінити файл у каталозі offline на жорстке символічне посилання, що вказує на цільовий файл, вміст якого потрібно прочитати .

Примітно, що Fedora 31 вразливість дозволяє відразу отримати привілеї групи root, так як процес smtpctl забезпечений прапором setgid root, замість setgid smtpq. Отримавши доступ до групи root, можна перезаписати вміст /var/lib/sss/mc/passwd і отримати повний root-доступ у системі.

Джерело: opennet.ru

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