Вразливості в OpenBSD, що дозволяють підвищити привілеї та обійти аутентифікацію в smtpd, ldapd та radiusd

Компанія Qualys виявила чотири уразливості в OpenBSD, одна з яких дозволяє віддалено підключитися без аутентифікації до деяких мережевих сервісів, а решта трьох підвищити свої привілеї в системі. У звіті Qualys відзначено швидку реакцію розробників OpenBSD — усі проблеми були усунені в OpenBSD 6.5 и OpenBSD 6.6 протягом 40 годин після приватного повідомлення.

Уразливість, що віддалено експлуатується, викликана помилкою при організації виклику обробника аутентифікації в бібліотеці libc, яка викликає
програму /usr/libexec/auth/login_style з передачею аргументів у командному рядку. У тому числі при викликі login_style за допомогою опціонального параметра "-s service" допускається передача назви протоколу. У разі використання на початку імені користувача символу "-", це ім'я буде оброблено як опція при запуску login_style. Відповідно, якщо вказати при аутентифікації як ім'я користувача "-schallenge" або "-schallenge:passwd" то login_style сприйме звернення як запит використання оброблювача S/Key.

Проблема в тому, що протокол S/Key login_style підтримується лише формально, а фактично ігнорується з висновком ознаки успішної аутентифікації. Таким чином, атакуючий може, представившись користувачем "-schallenge", обійти автентифікацію та отримати доступ без вказівки пароля чи ключів. Потенційно проблемі піддаються всі мережеві сервіси, які використовують штатні виклики libc щодо аутентифікації. Наприклад, можливість звернення в обхід автентифікації підтверджена smtpd (AUTH PLAIN), ldapd і radiusd.

У sshd вразливість не проявляється, оскільки в ньому є додатковий захист із перевіркою присутності користувача у системі. Тим не менш, sshd можна використовувати для перевірки схильності системи вразливості - при поводженні з ім'ям користувача "-sresponse:passwd" з'єднання зависає, так як sshd чекає від login_passwd повернення параметрів виклику (challenge), а login_passwd чекає передачі параметрів, що відсутні (ім'я sresponse» сприймається як опція). Потенційно локальний атакуючий може спробувати обійти аутентифікацію в утиліті su, але передача імені "-sresponse" призводить до краху процесу через повернення нульового покажчика при виконанні функції getpwnam_r("-schallenge", ...).

Інші вразливості:

  • CVE-2019-19520 — локальне підвищення привілеїв через маніпуляції з утилітою xlock, що поставляється з прапором sgid, що змінює групу на auth. У коді xlock перевизначення шляхів до бібліотек забороняється тільки при зміні ідентифікатора користувача (setuid), що дозволяє атакуючому змінити змінну оточення «LIBGL_DRIVERS_PATH» і організувати завантаження своєї бібліотеки, що розділяється, код якої буде виконаний після підвищення привілеїв до групи «auth».
  • CVE-2019-19522 — дозволяє локальному користувачеві, що входить до групи auth, запустити код з правами root при включенні в системі аутентифікації через S/Key або YubiKey (за замовчуванням не активні). Входження в групу «auth», доступ до якої може бути отриманий через експлуатацію зазначеної вразливості в xlock, дозволяє записати файли в каталоги /etc/skey і /var/db/yubikey. Наприклад, атакуючий може додати новий файл /etc/skey/root для створення одноразових ключів для аутентифікації під користувачем root через S/Key.
  • CVE-2019-19519 – можливість підвищення лімітів на ресурси через маніпуляції з утилітою su. При вказівці опції «-L», яка передбачає циклічне повторення спроб автентифікації у разі невдачі, клас користувача встановлюється лише один раз і не скидається за наступних спроб. Атакуючий може виконати "su -l -L" і при першій спробі ввести чужий логін з іншим класом облікового запису, але при другій спробі успішно автентифікуватися під собою. У цій ситуації користувачі будуть встановлені ліміти, що відповідають класу користувача, вказаного при першій спробі (наприклад, максимальна кількість процесів або розмір пам'яті для процесу). Метод працює тільки для запозичення лімітів від непривілейованих користувачів, тому що для користувача root потрібна присутність у групі wheel).

Додатково можна відзначити реалізацію в OpenBSD нового методу перевірки допустимості звернення до системних викликів, що додатково ускладнює експлуатацію вразливостей. Метод допускає здійснення системних викликів, лише якщо до них звертаються із попередньо зареєстрованих областей пам'яті. Для позначення областей пам'яті запропонований новий системний виклик msyscall().

Джерело: opennet.ru