Уязвимость в OpenSSH на Alpine Linux позволяет войти без пароля через длинный пароль
В OpenSSH обнаружена критическая уязвимость, из-за которой на некоторых серверах Alpine Linux злоумышленник может войти в учётные записи без пароля, включая учётки только с SSH-ключом. Исправление вышло в версии OpenSSH 10.6p2.

Главное в цифрах
- Диапазон длины пароля для атаки: от 257 до 1024 байт
- Исправленная версия OpenSSH: 10.6p2
- Образы tiny-cloud с уязвимостью: с 3.18.11 по 3.24.3
Атаке нужен сетевой доступ к серверу, имя учётной записи и пароль длиной от 257 до 1024 байт. Уязвимость затрагивает серверы, где sshd проверяет пароли без интерфейса PAM, включён вход по паролю и хотя бы у одной другой учётной записи на машине есть пароль. Пакет openssh-server в Alpine собран без PAM, а вход по паролю включён по умолчанию.
По словам Дэмиена Миллера из проекта OpenSSH, проблема связана с работой sshd с библиотекой musl, на которой построен Alpine. Системы не на Linux, Linux на glibc и системы, проверяющие пароли через PAM, не затронуты. OpenSSH оценивает уязвимость как критическую. Миллер призвал всех, у кого уязвим сервер, немедленно выставить PasswordAuthentication=no или отключить SSH. Атак с использованием этой уязвимости пока не зафиксировано.
Как это работает
Без PAM sshd сам проверяет пароль: хеширует попытку через crypt() и сравнивает результат с сохранённым значением. У учётной записи без пароля там стоит только символ «*», который слишком короткий, чтобы содержать соль. Поэтому sshd берёт соль у другой учётной записи, у которой есть настоящий хеш.
Для типов хешей $5$ и $6$ функция crypt() в musl отказывается обрабатывать пароли длиннее 256 байт и возвращает «*» как сигнал ошибки. Этот символ совпадает с сохранённым «*», и sshd принимает вход. Верхняя граница диапазона соответствует собственному лимиту sshd в 1024 байта.
По данным из источника, проблема появилась из-за изменения в musl от 9 августа 2012 года и изменения в OpenSSH от 15 июля 2016 года. Исследователь Özgün Kültekin из Wakefield, который сообщил об уязвимости, считает, что проблема существует с 2016 года.
Что делать
На Alpine нужно обновить пакет и перезапустить sshd, так как обновление пакета не перезапускает работающий процесс. Исправленные пакеты есть в точечных выпусках 3.21.10, 3.22.8, 3.23.8 и 3.24.4, а ветки с 3.16 по 3.21 тоже получили исправления.
Если обновиться сразу нельзя, можно отключить вход по паролю: задать PasswordAuthentication no, проверить конфигурацию командой sshd -t и перезапустить sshd. Перед этим убедитесь, что вход по ключу работает, и не закрывайте текущую сессию до успешного нового входа. Администраторам также стоит проверить в /var/log/messages строки Accepted password для учётных записей без пароля и просмотреть использование doas, новых пользователей и authorized_keys. Если нельзя исключить вход, по рекомендации источника машину нужно считать скомпрометированной.
Отдельно: образы tiny-cloud с 3.18.11 по 3.24.3 дают пользователю alpine doas без пароля. Они безопасны при первом запуске, но становятся уязвимыми, когда на машине появляется хеш $6$, например после установки пароля для консоли.
Контекст
Уязвимость не ограничивается Alpine: Kültekin называет другие системы на musl, включая OpenWrt, Buildroot и Yocto. По его данным, OpenWrt по умолчанию использует Dropbear, который не затронут. На момент публикации CVE-идентификатор не присвоен.
Миллер сообщил, что команда узнала об уязвимости на этой неделе и выпустила исправление максимально быстро. Он заявил, что длинные эмбарго сейчас видятся опасными, так как ИИ-агенты недавно находили те же ошибки, иногда за несколько часов.

