Компания Qualys выявила критическую уязвимость (CVE-2024-6387) в OpenSSH, позволяющую добиться удалённого выполнения кода с правами root без прохождения аутентификации. Уязвимость, которая получила кодовое имя regreSSHion, проявляется начиная с версии OpenSSH 8.5 на системах со стандартной библиотекой Glibc.
Возможность совершения атаки продемонстрирована на 32-разрядной системе с Glibc c включённой защитой ASLR (рандомизация адресного пространства). Для успешной атаки в лабораторных условиях потребовалось 6-8 часов, в течение которых с сервером непрерывно устанавливались соединения с максимально допустимой в конфигурации sshd интенсивностью. Совершение атаки упрощается и требует меньше времени на системах без ASLR или в дистрибутивах, использующих модифицированный OpenSSH, в котором отключена повторная рандомизация ASLR для каждого соединения.
Не исключается возможность совершения атаки и на 64-разрядные системы, но рабочий эксплоит для таких систем пока не готов. Предполагается, что проведение атаки на 64-разрядные системы будет занимать гораздо больше времени, но не более недели. OpenSSH в OpenBSD проблеме не подвержен, но в других системах на основе стандартных библиотек, отличных от Glibc, теоретически возможна адаптация метода для совершения атаки (в Qualys данный вопрос пока не изучался).
Уязвимость устранена в опубликованном сегодня выпуске OpenSSH 9.8 (патч). Проследить за публикацией обновлений пакетов в дистрибутивах можно на страницах: Debian, Ubuntu, RHEL, SUSE/openSUSE, Fedora, Arch. В качестве обходного пути блокирования уязвимости в sshd_config можно выставить параметр “LoginGraceTime=0”.
Атака основана на том, что обработчик SIGALRM вызывается в sshd в асинхронном режиме, если клиент не выполнил аутентификацию в течение времени, ограниченном таймаутом подключения (LoginGraceTime, по умолчанию 120 сек). Состояние гонки возникает из-за того, что обработчик сигнала вызывает функции, не безопасные при асинхронной обработке сигналов, такие как syslog().
Уязвимость вызвана регрессивным изменением, вошедшим в состав выпуска OpenSSH 8.5 и приводящим к состоянию гонки в коде обработки сигналов в sshd. Регрессия привела к прекращению действия защиты от старой уязвимости CVE-2006-5051, проявлявшейся до версии OpenSSH 4.4 (2006 год) и носившей теоретический характер.
В ходе разработки OpenSSH 8.5 по ошибке из функции sigdie(), которая напрямую вызывается из обработчика SIGALRM, была удалена строка “#ifdef DO_LOG_SAFE_IN_SIGHAND”.