Разработчики OpenSSH опубликовали экстренное обновление OpenSSH 10.6p2, в котором добавлена защита от критической уязвимости (CVE не назначен), получившей кодовое имя «SSHole» и позволяющей обойти аутентификацию. В системах с библиотекой Musl уязвимость позволяет подключиться к пользователю, для которого не установлен пароль, введя любой пароль, содержащий больше чем 256 символов. Проблема затрагивает дистрибутивы Linux, использующие стандартную библиотеку musl, но не использующие PAM (Pluggable Authentication Modules), такие как OpenWRT, Alpine, Buildroot и Yocto. Особую опасность представляет то, что часто вход по паролю блокируется для пользователя root, что даёт возможность любому удалённо подключиться с правами администратора.
Ошибка, приводящая к уязвимости, не в коде OpenSSH, но эксплуатируется через sshd. При этом ввиду серьёзности проблемы в версии OpenSSH 10.6p2 предложен обходной вариант блокирования уязвимости. Владельцам подверженных проблеме систем рекомендовано не дожидаться появления обновлений, а немедленно отключить парольную аутентификацию через параметр «PasswordAuthentication no» в /etc/ssh/sshd_config или полностью отключить SSH.
Проблема не проявляется в системах, отличных от Linux, и в Linux-окружениях на базе glibc, а также в системах, использующих PAM при аутентификации по паролю. Исправление уже доступно в Alpine и OpenWRT.
Уязвимость связана с некорректным взаимодействием OpenSSH и функции crypt() из musl. Для защиты от определения существования пользователей через анализ различий во времени обработки запросов c 2016 года OpenSSH при проверке беспарольных учётных записей использует штатную процедуру проверки пароля: вызывает функцию «crypt(переданный пароль, соль)» c солью другого пользователя, имеющего действительный хеш пароля, после чего сравнивает возвращённый функцией crypt хеш со значением из поля с хешем пароля.
Однако в musl функция crypt() для хешей SHA-512 возвращает символ «*», если длина переданного пароля превышает 256 байт (ограничение введено в 2012 году для защиты от DoS-атак, так как при передаче больших значений возникает большая нагрузка на CPU). Такой же символ используется в поле с хешем пароля в «/etc/shadow» для обозначения учётных записей, для которых аутентификация по паролю заблокирована.
В результате атакующий, имеющий возможность соединиться с SSH-сервером, может подключиться к любой учётной записи, у которой в «/etc/shadow» в поле пароля указан символ «*», передав строку длиной от 257 до 1024 байт. Проблема охватывает множество существующих Docker-образов, построенных с использованием Alpine Linux, а также штатные образы Alpine для облачных систем AWS и Azure, у пользователя root в которых вместо хеша пароля выставлен знак «*».
Примечательно, что изначально в официальных Docker-образах, использующих Alpine, c 2015 года выставлялся пустой пароль root, а после выявления этого факта, вместо хеша пароля был выставлен знак «!». Но его наличие блокировало вход по SSH-ключам, поэтому с 2022 года символ для блокировки входа по паролю был заменён на «*».
Источник: opennet.ru
