В процессе изучения выявленной на прошлой неделе критической уязвимости в 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”.