
Раскрыта критическая уязвимость под названием sshhole в OpenSSH на системах с библиотекой musl Linux (musl-based Linux, используемой в Alpine, OpenWrt, Buildroot, Yocto, а также во множестве образов Docker, которые вы, возможно, скачивали), которая с 2016 года позволяла получить доступ к учётным записям, не защищённым паролем. Пояснение от Alpine Linux (техническое уточнение проблемы), исправление в OpenWRT.
Учётные записи, которые в принципе не должны требовать пароля (например, root, пользователь для развёртывания, использующий только SSH-ключи, пользователи из LDAP или пользователь по умолчанию в образах Alpine для AWS и Azure), начинали принимать любой пароль, если его длина превышает 256 символов.
Уязвимость связана с некорректным взаимодействием 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, с 2015 года выставлялся пустой пароль root, а после выявления этого факта, вместо хеша пароля был выставлен знак «!». Но его наличие блокировало вход по SSH‑ключам, поэтому с 2022 года символ для блокировки входа по паролю был заменён на «*».
Затронуты ли вы этой проблемой?
Работает ли ваш sshd в среде с библиотекой musl (например, в Alpine, OpenWrt, Buildroot или Yocto)?
Не используется ли при этом PAM? (В Alpine пакет openssh‑server по умолчанию настроен без PAM; возможно, вы также явно указали UsePAM no в конфигурации).
Разрешён ли вход по паролю? (По умолчанию он разрешён).
Есть ли в системе учётная запись, у которой в качестве пароля установлен символ * (например, пользователи, использующие только ключи; пользователи из LDAP; или учетная запись root в Alpine)?
И есть ли при этом в системе другая учётная запись с полноценным паролем?
Если да, то для учётной записи с паролем * система примет любой пароль длиной от 257 до 1024 символов.
В официальных образах Alpine для AWS и Azure такая настройка присутствует у пользователя по умолчанию (alpine), который к тому же имеет право выполнять команды через doas без ввода пароля — фактически, это дает права суперпользователя (root).
Если вы используете Debian, Ubuntu, Fedora или любой другой дистрибутив с библиотекой glibc, если у вас настроен PAM, или если вы используете dropbear либо OpenSSH в реализации OpenBSD — вы в безопасности.
Вас взломали? Проверьте.
$ grep "Accepted password" /var/log/messages Nov 2 03:14:07 your-box sshd[2211]: Accepted password for alpine from 203.0.113.66 port 41822 ssh2 $ grep '^alpine:' /etc/shadow alpine:*:20125:0:99999:7:::
В обновлении OpenSSH 10.6p2 эта уязвимость устранена.
# пока нет возможности обновиться? отключите вход по паролю. $ echo "PasswordAuthentication no" > /etc/ssh/sshd_config.d/00-no-passwords.conf $ rc-service sshd restart






