SSHole — luka, która pozwala na połączenie się przez SSH bez hasła w systemach z Musl

Deweloperzy OpenSSH opublikowali pilną aktualizację OpenSSH 10.6p2, w której dodano zabezpieczenie przed krytyczną luką w zabezpieczeniach (CVE nie przypisano), znaną pod nazwą „SSHole”, umożliwiającej ominięcie uwierzytelniania. W systemach z biblioteką Musl luka pozwala na połączenie się z użytkownikiem, dla którego nie ustawiono hasła, wprowadzając jakiekolwiek hasło składające się z ponad 256 znaków. Problem dotyczy dystrybucji Linuxa, które wykorzystują standardową bibliotekę musl, ale nie korzystają z PAM (Pluggable Authentication Modules), takich jak OpenWRT, Alpine, Buildroot i Yocto. Szczególne zagrożenie stanowi to, że często dostęp do konta root jest zablokowany, co daje możliwość każdemu zdalnemu połączeniu się z uprawnieniami administratora.

Błąd prowadzący do luki nie znajduje się w kodzie OpenSSH, lecz jest eksploatowany przez sshd. W związku ze powagą problemu w wersji OpenSSH 10.6p2 zaproponowano tymczasowe obejście blokujące lukę. Właściciele podatnych systemów są zachęcani do nieczekania na aktualizacje, a natychmiastowego wyłączenia uwierzytelniania za pomocą hasła przez ustawienie parametru „PasswordAuthentication no” w /etc/ssh/sshd_config lub całkowitego wyłączenia SSH.

Problem nie występuje w systemach innych niż Linux oraz w środowiskach Linux opartych na glibc, a także w systemach wykorzystujących PAM do uwierzytelniania za pomocą hasła. Poprawka jest już dostępna w Alpine i OpenWRT.

Luka jest związana z nieprawidłowym współdziałaniem OpenSSH z funkcją crypt() z musl. W celu ochrony przed ustaleniem istnienia użytkowników poprzez analizę różnic w czasie przetwarzania żądań od 2016 roku OpenSSH podczas sprawdzania kont bez hasła używa standardowej procedury weryfikacji hasła: wywołuje funkcję „crypt(wprowadzone hasło, sól)” z solą innego użytkownika, który ma ważny hash hasła, a następnie porównuje zwrócony przez funkcję crypt hash z wartością z pola z hashem hasła.

Jednak w musl funkcja crypt() dla hashy SHA-512 zwraca znak „*”, jeśli długość wprowadzonego hasła przekracza 256 bajtów (ograniczenie wprowadzone w 2012 roku w celu ochrony przed atakami DoS, ponieważ przy przesyłaniu dużych wartości występuje duże obciążenie CPU). Taki sam znak jest używany w polu z hashem hasła w „/etc/shadow” do oznaczenia kont, dla których uwierzytelnianie za pomocą hasła jest zablokowane.

W wyniku ataku osoba mająca dostęp do serwera SSH może połączyć się z dowolnym kontem, dla którego w polu hasła w "/etc/shadow" znajduje się symbol "*", przesyłając ciąg o długości od 257 do 1024 bajtów. Problem dotyczy wielu istniejących obrazów Docker, zbudowanych przy użyciu Alpine Linux, a także standardowych obrazów Alpine dla systemów chmurowych AWS i Azure, w których dla użytkownika root zamiast hasza hasła ustawiony jest znak "*".

Warto zauważyć, że początkowo w oficjalnych obrazach Docker, które używały Alpine, od 2015 roku ustawiane było puste hasło dla roota, a po ujawnieniu tego faktu, zamiast hasza hasła ustawiano znak "!". Jednak jego obecność blokowała logowanie za pomocą kluczy SSH, dlatego od 2022 roku znak blokujący logowanie hasłem został zastąpiony znakiem "*".

Źródło: opennet.ru

Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS - ProHoster