Уязвимости в 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().

Источник: http://www.opennet.ru/opennews/art.shtml?num=51979