Раскрыта критическая уязвимость под названием 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
одна система на базе Debian, одна — на базе Alpine. вводите команды. всё выполняется прямо здесь, в вашем браузере; никакие данные никуда не передаются
одна система на базе Debian, одна — на базе Alpine. вводите команды. всё выполняется прямо здесь, в вашем браузере; никакие данные никуда не передаются