SSHole - уязвимость, позволяющая подключиться по SSH без пароля в системах с Musl - QubStore

SSHole — уязвимость, позволяющая подключиться по SSH без пароля в системах с Musl

В OpenSSH 10.6p2 закрыли дыру, через которую можно войти на сервер с musl без настоящего пароля — достаточно ввести строку длиннее 256 символов.

Разработчики OpenSSH выпустили внеплановый апдейт 10.6p2. Он прикрывает критическую уязвимость CVE-2026-123158, известную под именем «SSHole»: она позволяет обходить аутентификацию. В системах на библиотеке musl можно подключиться к учётной записи без пароля, набрав любой пароль длиннее 256 символов.

Под удар попадают Linux-дистрибутивы на musl, где при входе по паролю не задействован PAM — среди них OpenWRT, Alpine, Buildroot и Yocto. Опасность усугубляется тем, что вход по паролю для root там часто заблокирован — а значит, любой может удалённо получить администраторские права. Сама ошибка сидит не в коде OpenSSH, но эксплуатируется она через sshd. Учитывая серьёзность ситуации, в 10.6p2 просто предложили обходной способ блокировки: владельцам уязвимых систем советуют не ждать патчей, а сразу прописать «PasswordAuthentication no» в /etc/ssh/sshd_config либо вообще отключить SSH.

Вне Linux, в системах на glibc и там, где для парольной аутентификации используется PAM, проблема не проявляется. Исправление уже есть в Alpine и OpenWRT. Корень зла — некорректное взаимодействие OpenSSH с функцией crypt() из musl. С 2016 года OpenSSH при проверке беспарольных учёток задействует штатную процедуру: вызывает crypt(введённый пароль, соль) с солью другого пользователя, у которого есть настоящий хеш, и сравнивает результат с хешем из поля. Но в musl crypt() для хешей SHA-512 возвращает «*», если соль не «*», а длина пароля больше 256 байт — этот лимит ввели в 2012 году против DoS-атак, поскольку большие значения сильно грузят CPU. Тот же символ «*» в /etc/shadow обозначает учётки с заблокированным парольным входом.

В итоге атакующий, дотянувшийся до SSH-сервера, может войти в любую учётку, у которой в поле пароля стоит «*», отправив строку длиной от 257 до 1024 байт. Затронуты многие Docker-образы на Alpine, а также штатные образы Alpine для AWS и Azure, где у root вместо хеша стоит «*». Любопытно, что изначально в официальных Docker-образах Alpine с 2015 года у root был пустой пароль, потом там поставили «!», но он блокировал вход по SSH-ключам, и с 2022 года для блокировки пароля используют «*».

Ссылка на основную публикацию