Уязвимость в пакетах с OpenSSH из состава RHEL 9, допускающая удалённое выполнение кода

В процессе изучения выявленной на прошлой неделе критической уязвимости в OpenSSH, обнаружена ещё одна похожая уязвимость (CVE-2024-6409), позволяющая добиться удалённого выполнения кода без прохождения аутентификации. Новая уязвимость не столь опасна как прошлая, так как проявляется после сброса привилегий в запущенном SSH-сервером дочернем процессе. Уязвимость присутствует в пакетах openssh из дистрибутива Red Hat Enterprise Linux 9, основанных на опубликованном в 2021 году выпуске OpenSSH 8.7. Проблема также затрагивает пакеты для Fedora Linux 36 и 37, основанные на выпусках OpenSSH 8.7 и 8.8.

По своей сути уязвимость аналогична прошлой проблеме и также вызвана состоянием гонки в обработчике прерывания SIGALRM, возникающем из-за выполнения функций, не рассчитанных на вызов в асинхронном режиме из обработчиков сигналов. Обработчик срабатывает при наступлении таймаута, определённого через параметр LoginGraceTime, и прерывает текущее выполнение кода. Использование в обработчике прерываний не рассчитанных на асинхронное выполнение функций, в которых применяется динамическое выделение памяти, таких как syslog(), может привести к повреждению внутренних структур malloc при срабатывании SIGALRM во время выполнения определённого кода.

Новая уязвимость отличается тем, что состояние гонки возникает из-за вызова в обработчике сигнала grace_alarm_handler() функции cleanup_exit(). В основной кодовой базе OpenSSH данная функция может использоваться в асинхронно выполняемом коде, но в пакетах к RHEL 9 и Fedora был применён дополнительный патч, добавляющий в cleanup_exit() вызов функции для генерации событий аудита, на рассчитанной на использование в обработчиках сигналов.

Данный патч использовался в RHEL 9 и производных дистрибутивах в пакетах, основанных на OpenSSH 8.7p1. В актуальных выпусках Fedora проблема не проявляется, так как начиная с Fedora 38 дистрибутив перешёл на более новую версию OpenSSH без изменения cleanup_exit(). В отличие от прошлой уязвимости, для блокирования новой проблемы не подходит обходной способ защиты, основанный на использовании в sshd опции «-e», отключающей вывод лога через syslog. Но при этом для блокирования уязвимости в sshd_config можно выставить параметр «LoginGraceTime=0».

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