Идеальный кошмар для Linux-сервера — когда злоумышленнику достаточно добраться до порта Secure Shell (SSH), войти и захватить контроль. Именно это произошло с Alpine Linux, популярным легковесным Linux-сервером. В довершение всего, это случилось всего через несколько дней после того, как Alpine Linux увернулся от пули размером с дыру в безопасности в своей реализации GitLab.

Как объяснил инженер по безопасности Грегори Брайант в своем посте в LinkedIn: «Большинство обходов аутентификации происходят из-за сложных логических цепочек, но вчерашняя уязвимость OpenSSH в Alpine Linux (CVE-2026-123158) сводится к одному символу: *».

Если вы используете Alpine Linux (или другой дистрибутив на основе musl) со стандартным пакетом openssh-server (без Pluggable Authentication Modules, или PAM) и включенной PasswordAuthentication, злоумышленник может войти в учетные записи с отключенным паролем или только с ключом, просто отправив пароль длиной от 257 до 1024 байт.

Alpine Linux — не единственная операционная система, использующая musl, облегченную версию стандартной библиотеки C (libc). Другие операционные системы, использующие musl и потенциально уязвимые, включают Adélie Linux; Void Linux; Sabotage Linux; OpenWrt, вариант Android; и Yocto Project, который используется для сборки встраиваемых дистрибутивов Linux.

Wind River, выпускающая коммерческий встраиваемый дистрибутив Linux Wind River Linux, также изучает этот вопрос. Представитель компании сказал мне: «Wind River серьезно относится к безопасности. Мы активно изучаем сообщенную уязвимость и оцениваем ее потенциальное воздействие. Мы примем соответствующие меры по мере необходимости».

За кулисами, когда OpenSSH собран без PAM, он проверяет пароли путем хеширования попытки пароля с помощью функции crypt() библиотеки C. Затем он сравнивает результат с сохраненным полем пароля учетной записи. Пока все хорошо.

Но когда ключ длиннее 256 байт, функция crypt() в musl возвращает строку * в качестве индикатора ошибки. Это же значение содержит поле пароля для любой учетной записи без пароля, например, для учетной записи только с ключом. Таким образом, «хеш» совпадает, и вход выполняется, и злоумышленник проходит внутрь.

Чтобы воспользоваться этим, злоумышленнику нужно только имя такой учетной записи. Ему также нужна хотя бы одна другая учетная запись на машине с 5- или 6-символьным хешем пароля, а затем отправить пароль длиной от 257 до 1024 байт. По словам Alpine, одного пользователя с паролем достаточно, чтобы сделать доступными все учетные записи без пароля.

В Linux-системах, использующих crypt() из glibc, а это почти все, та же попытка вернула бы NULL при ошибке, которую sshd уже отклоняет, поэтому Debian, Ubuntu, Fedora и т.д. не затронуты.

По словам *sshole, группы, обнаружившей проблему, это побочный эффект, скрывавшийся с 2016 года.

Alpine сообщила, что затронуты все проверенные выпуски: с 3.21 по 3.24, edge и более старые ветки с 3.16 по 3.20. Для эксплуатации требуется следующее:

Root в большинстве случаев напрямую не подвержен. Он поставляется как root:* в базовом образе примерно с Alpine 3.16, но директива OpenSSH по умолчанию PermitRootLogin prohibit-password блокирует его. Другая учетная запись, которая может стать root, например, через doas, все равно дает злоумышленнику путь к root.

Alpine особо выделила свои официальные образы tiny-cloud, версии с 3.18.11 по 3.24.3, как особенно уязвимые. Они поставляются с пользователем alpine с полем пароля * и doas без пароля. Они безопасны при первой загрузке, но становятся уязвимыми, как только на машине появляется любой 6-символьный хеш. Это может произойти, когда администратор устанавливает пароль консоли или когда пользовательские данные добавляют пользователя с хешированным паролем, что означает, по сути, все они.

Alpine выпустила 3.21.10, 3.22.8, 3.23.8 и 3.24.4 в четверг, включив исправление OpenSSH в число изменений безопасности. Она также опубликовала исправленные пакеты для каждого выпуска вплоть до 3.16. Поддержка Alpine 3.21 закончилась 1 ноября.

Только что выпущенный OpenSSH 10.6p2 избегает проблемы в sshd. Стабильные ветки Alpine содержат патч для той же проблемы. Вам следует выполнить apk upgrade -U -a, а затем перезапустить th