Хакеры начали прописывать свои SSH-ключи через уязвимость SSHole в OpenSSH

8 ноября атакующие через уязвимость SSHole в OpenSSH добавили свой SSH-ключ пользователям root и alpine на сервере-ловушке. Это зафиксировала компания GreyNoise.
Ключ ed25519 с меткой SSHHOLE-HIT записали через doas в файлы authorized_keys обоих пользователей в 00:13–00:15 UTC. Привязать эту сессию к конкретному IP-адресу GreyNoise не смогла.
В authorized_keys хранятся открытые ключи, с которыми сервер пускает пользователя без пароля. Добавленный ключ позволяет атакующему вернуться на сервер, даже если уязвимость потом закроют обновлением. Настройка OpenSSH по умолчанию запрещает root входить по паролю, но не по ключу, поэтому ключ в каталоге root даёт прямой вход с правами root.
Уязвимость раскрыли 5 ноября вместе с выпуском OpenSSH 10.6p2, который её исправляет. В тот же день исследователь опубликовал разбор с точным условием срабатывания, а меньше чем через час на GitHub появился первый публичный эксплойт. Номер CVE-2026-123158 ей присвоили позже в тот же день, в базе NVD её оценили в 8,1 балла по шкале CVSS. Первую успешную атаку GreyNoise зафиксировала 7 ноября в 03:46 МСК.
Ошибка проявляется в Linux-системах с библиотекой musl, где OpenSSH собран без PAM. Для учётной записи без пароля sshd берёт соль у другой учётной записи с хешем пароля. Если пароль длиннее 256 байт, функция crypt() в musl возвращает символ * как признак ошибки. Тот же символ стоит в поле пароля у учётных записей без пароля, поэтому sshd считает пароль верным.
Разработчики Alpine Linux перечислили четыре условия, при которых система уязвима:
- установлен пакет
openssh-server, собранный без PAM, илиopenssh-server-pamсUsePAM no,
- вход по паролю включён:
PasswordAuthentication yes, это значение OpenSSH по умолчанию,
- есть учётная запись с
*в поле пароля: root в базовом образе, пользователи только с ключами, пользователь alpine в облачных образах tiny-cloud,
- хотя бы у одной локальной учётной записи есть хеш пароля
$5$или$6$.
Даже если вход под root закрыт, права root можно получить из другой учётной записи через doas. Уязвимы Alpine с 3.16 по 3.24 и edge. Контейнеры без sshd, системы с PasswordAuthentication no и образы, настроенные через cloud-init, не затронуты.
Исправленные пакеты вошли в Alpine 3.21.10, 3.22.8, 3.23.8 и 3.24.4, для старых веток с 3.16 их тоже выпустили. После обновления sshd нужно перезапустить. Если обновиться пока нельзя, разработчики советуют отключить вход по паролю через PasswordAuthentication no. Для проверки Alpine рекомендует искать в системном журнале строки Accepted password for у учётных записей без пароля. Ещё стоит проверить использование doas, недавно созданных пользователей и файлы, а также authorized_keys. Если вход исключить нельзя, считать машину взломанной.
Все атаки GreyNoise наблюдала на своих исследовательских ловушках с уязвимой конфигурацией. На 15:40 МСК 8 ноября компания насчитала 15 подтверждённых цепочек выполнения команд. Цепочка — это серия сессий на одной ловушке с перерывами не больше 30 минут, в которых SSH-сервер запускал команды системы. Сколько реальных серверов взломано, эта цифра не показывает.
7 ноября один из атакующих получил права root и установил на ловушку Python-агента удалённого управления TAC Agent, но тот не смог связаться со своим сервером. 8 ноября в 15:26–15:36 МСК на другую ловушку зашли атакующие ещё с двух IP-адресов.