SSHole — уязвимост, която позволява свързване по SSH без парола в системи с Musl

Разработчиците на 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. За защита от определяне на съществуването на потребители чрез анализ на времеви разлики в обработката на заявки от 2016 година OpenSSH при проверката на акаунти без парола използва стандартната процедура за проверка на парола: извиква функцията «crypt(передан пароль, соль)» с сол от друг потребител, който има валиден хеш на паролата, след което сравнява получения от функцията 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 година символът за блокиране на входа по парола беше заменен с «*».

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster