Важно, критическая уязвимость в OpenSSH!
01/07/2024
15:10
Компания Qualys выявила критическую уязвимость (CVE-2024-6387) в OpenSSH, позволяющую добиться удалённого выполнения кода с правами root без прохождения аутентификации. Уязвимость, которая получила кодовое имя regreSSHion, проявляется в конфигурации по умолчанию начиная с версии OpenSSH 8.5 на системах со стандартной библиотекой Glibc.
Возможность совершения атаки продемонстрирована на 32-разрядной системе с Glibc с включённой защитой ASLR (рандомизация адресного пространства). Для успешной атаки в лабораторных условиях потребовалось 6-8 часов, в течение которых с сервером непрерывно устанавливались соединения с максимально допустимой в конфигурации sshd интенсивностью. Совершение атаки упрощается и требует меньше времени на системах без ASLR или в дистрибутивах, использующих модифицированный OpenSSH, в котором отключена повторная рандомизация ASLR для каждого соединения. Рабочий прототип эксплоита до повсеместного устранения уязвимости решено не публиковать публично, но при этом доступно достаточно подробное описание сути уязвимости, которое делает появление сторонних эксплоитов делом времени.
Не исключается возможность совершения атаки и на 64-разрядные системы, но рабочий эксплоит для таких систем пока не готов. Предполагается, что проведение атаки на 64-разрядные системы будет занимать гораздо больше времени, но не более недели. OpenSSH в OpenBSD проблеме не подвержен, так как в данной системе с 2001 года применяется механизм защиты, блокирующий подобные классы атак. В других системах на основе стандартных библиотек, отличных от Glibc, теоретически возможна адаптация метода для совершения атаки (в Qualys данный вопрос пока не изучался).
Уязвимость устранена в опубликованном сегодня выпуске OpenSSH 9.8 (патч). Проследить за публикацией обновлений пакетов в дистрибутивах можно на страницах: Debian, Ubuntu, RHEL, SUSE/openSUSE, Fedora, ROSA, Gentoo, ALT Linux, Arch и FreeBSD. В качестве обходного пути блокирования уязвимости в sshd_config можно выставить параметр "LoginGraceTime=0", при этом отключение таймаута упростит инициирование отказа в обслуживании при установке большого числа соединений, превышающих лимиты, заданные через параметр MaxStartups. Одним из признаков попыток совершения атаки является появление в логе большого числа записей "Timeout before authentication".
Уязвимость появилась в результате регрессивного изменения, вошедшего в состав выпуска OpenSSH 8.5 и приводящего к состоянию гонки в коде обработки сигналов в sshd. Регрессия привела к прекращению действия защиты от старой уязвимости CVE-2006-5051, проявлявшейся до версии OpenSSH 4.4 (2006 год) и носившей теоретический характер. В ходе разработки OpenSSH 8.5 по ошибке из функции sigdie(), которая напрямую вызывается из обработчика SIGALRM, была удалён блок "#ifdef DO_LOG_SAFE_IN_SIGHAND".
Обработчик SIGALRM вызывается в sshd в асинхронном режиме, если клиент не выполнил аутентификацию в течение времени, ограниченного таймаутом подключения (LoginGraceTime, по умолчанию 120 сек). Атака основана на том, что обработчик сигнала вызывает функции не безопасные при асинхронной обработке сигналов, такие как syslog(). Функция syslog() в Glibc не рассчитана на использование в асинхронно выполняемых обработчиках сигналов, так как вызывает функции malloc() и free(). Срабатывание сигнала SIGALRM, прерывающего работу определённого кода в sshd, может привести к нарушению состояния выполнения, а задача эксплоита сводится к созданию условий для прерывания нужного кода в необходимый момент его выполнения. Уязвимость не затрагивает OpenBSD, так как в нём вместо syslog() из обработчика сигнала SIGALRM вызывается функция syslog_r(), специально созданная для асинхронного запуска.