Wprowadzenie
1 lipca 2024 r. Qualys Threat Research Unit (TRU) ujawnił informacje o luce wykrytej w OpenSSH [1] – jednej z najpopularniejszych i najbezpieczniejszych usług zdalnego dostępu do serwerów, wykorzystywanej głównie w systemach Linux.
Luce przypisano identyfikator CVE CVE-2024-6387, a w bazie danych NVD scharakteryzowano ją w następujący sposób:
Odkryto błąd bezpieczeństwa (CVE-2006-5051) w serwerze OpenSSH (sshd). Istnieje warunek wyścigu, który może prowadzić sshd do obsługi niektórych sygnałów w niebezpieczny sposób. Nieuwierzytelniony, zdalny atakujący może być w stanie wywołać ten stan, nie uwierzytelniając się w określonym czasie. [2]
National Vulnerability Database (NVD) to kompleksowe repozytorium informacji o znanych lukach w cyberbezpieczeństwie, w tym szczegóły dotyczące ich wagi, wpływu i poprawek. Common Vulnerabilities and Exposures (CVE) to system, który zapewnia unikalne identyfikatory publicznie znanych luk i zagrożeń.
Jednym z najbardziej intrygujących aspektów tej luki jest to, że była ona obecna w OpenSSH i została nawet przypisana CVE-2006-5051 dawno temu. Jednak z powodu błędu programistycznego, gdy kod OpenSSH został zmodyfikowany, podatność pojawiła się ponownie od października 2020 r.
Podatność można podsumować jako warunek wyścigu obsługi sygnału, który umożliwia nieuwierzytelnione zdalne wykonanie kodu z uprawnieniami roota. Aby lepiej zrozumieć, co to oznacza, podzielimy ten opis na podstawowe elementy i wyjaśnimy każdy termin w przystępny sposób.
Czym jest OpenSSH?
OpenSSH (Open Secure Shell) to szeroko stosowany pakiet narzędzi open-source zaprojektowany w celu zapewnienia bezpiecznego zdalnego dostępu i przesyłania danych przez niezabezpieczone sieci. Opracowany w ramach projektu OpenBSD, OpenSSH oferuje solidny, szyfrowany protokół do bezpiecznej komunikacji między systemami. Głównym narzędziem do bezpiecznego zdalnego dostępu do powłoki jest sshktóry umożliwia użytkownikom bezpieczne logowanie i wykonywanie poleceń na zdalnych maszynach. OpenSSH wykorzystuje silne mechanizmy szyfrowania i uwierzytelniania w celu ochrony danych przed podsłuchem i manipulacją. Obsługuje różne metody uwierzytelniania, w tym uwierzytelnianie oparte na hasłach i kluczach oraz zaawansowane funkcje, takie jak przekierowanie portów i bezpieczne tunelowanie. W praktyce serwer OpenSSH jest najczęściej używaną opcją do nawiązywania połączeń z systemami Linux.
Kim jest root?
Root jest najbardziej uprzywilejowanym użytkownikiem w systemie Linux. Ma on pełny i nieograniczony dostęp do całego systemu.
Czym jest RCE?
Remote Code Execution (RCE) to luka, która stanowi krytyczną lukę w zabezpieczeniach, która pozwala atakującemu na wykonanie dowolnego kodu w zdalnym systemie za pośrednictwem sieci. Można powiedzieć, że jest to rodzaj luki, o której marzy każdy haker. Wykonanie zdalnego kodu może prowadzić do wielu poważnych konsekwencji. Na przykład hakerzy mogą uzyskać dostęp do wrażliwych zasobów na komputerze, zainstalować złośliwe oprogramowanie i backdoory (które umożliwią im uzyskanie trwałości i ponowne połączenie się z zaatakowanym systemem) oraz zakłócić lub wpłynąć na usługi działające w systemie. W skrajnych przypadkach zdalne wykonanie kodu pozwala hakerom przejąć całkowitą kontrolę nad zaatakowanym systemem.
Jaka jest idea warunku wyścigu obsługi sygnału w OpenSSH?
Programy obsługi sygnałów to funkcje w programie, które reagują na sygnały, które są powiadomieniami wysyłanymi do procesu. Warunek wyścigu ma miejsce, gdy czas zdarzeń prowadzi do nieoczekiwanego lub nieprawidłowego zachowania. W przypadku funkcji obsługi sygnałów często wiąże się to z problemami wynikającymi z działań asynchronicznych (rzeczy dzieją się poza kolejnością). Jeśli zarówno program obsługi sygnału, jak i zwykły kod uzyskują dostęp do tych samych zmiennych globalnych lub danych statycznych, a program obsługi sygnału modyfikuje je, podczas gdy zwykły kod ich używa, może to powodować problemy, takie jak uszkodzenie danych lub awarie. Atakujący mogą wykorzystać te warunki wyścigu do uszkodzenia stanu programu, potencjalnie powodując jego awarię lub umożliwiając nieautoryzowane wykonanie kodu.
W OpenSSH błąd warunku wyścigu obsługi sygnału pojawia się, gdy klient nie uwierzytelni się w ciągu LoginGraceTime . Parametr LoginGraceTime określa czas dozwolony na pomyślne uwierzytelnienie na serwerze SSH. Im dłuższy okres karencji, tym dłużej mogą trwać nieuwierzytelnione połączenia. [Domyślna wartość tego parametru wynosi 120 sekund. Jeśli ten limit czasu zostanie osiągnięty, program obsługi SIGALRM jest uruchamiany asynchronicznie i wywołuje funkcje, które nie są bezpieczne dla programów obsługi sygnału, takie jak syslog(). W wersjach wcześniejszych niż 4.4p1 atakujący mógł wykorzystać funkcję free() używaną w funkcji syslog() podczas obsługi sygnału. W wersjach od 8.5p1 do 9.7p1 zarówno funkcje free(), jak i malloc() są podatne na exploity. Dowód koncepcji z Qualys Threat Research Unit opiera się na wykorzystaniu segmentu danych klucza publicznego do wysłania ładunku exploita. Jeśli exploit się powiedzie, atakujący wymusza wykonanie kodu, który pozwala mu uzyskać powłokę roota. Ponieważ exploit wymaga idealnego wyczucia czasu, statystycznie potrzeba wielu prób, aby odnieść sukces. Na przykład, w przypadku OpenSSH w systemie 32-bitowym do pomyślnego wykonania kodu potrzeba było średnio 10 000 prób.Qualys Threat Research Unit jest w trakcie tworzenia i testowania exploitów na systemy 64-bitowe[5]. [5]
SIGALRM jest sygnałem używanym w uniksowych systemach operacyjnych do powiadamiania procesu o wygaśnięciu timera. Proces może przechwycić ten sygnał i obsłużyć go za pomocą funkcji obsługi sygnału. Funkcja ta jest wykonywana po odebraniu sygnału. Funkcje wymienione w powyższym tekście są częścią języka C: syslog( ) – ta funkcja służy do zapisywania komunikatów dziennika do dziennika systemowego. malloc() – ta funkcja alokuje (rezerwuje) blok pamięci do użycia.free() – ta funkcja służy do zwalniania pamięci, która została wcześniej przydzielona przez funkcję malloc().
Wersje, których to dotyczy
Aby podsumować informacje o podatnym oprogramowaniu [5]:
- OpenSSH < 4.4p1 jest podatny na ataki,
- 4.4p1 < = OpenSSH < 8.5p1 nie jest podatny,
- 8.5p1 < = OpenSSH < 9.8p1 jest ponownie podatny na ataki.
Pamiętaj jednak, że teoretycznie podatna wersja może zostać załatana. Na przykład, łatka została wprowadzona dla różnych wersji OpenSSH dla systemu operacyjnego Ubuntu. [6, 3] Tak więc wersja OpenSSH nie jest jednoznacznym wskaźnikiem obecności luk.
Aby sprawdzić wersję OpenSSH w systemie, wykonaj następujące polecenie w terminalu:
ssh -V
Zauważ, że nie dotyczy to systemów Windows. Co więcej, Alpine Linux i OpenBSD prawdopodobnie nie są podatne na ten atak. Red Hat Enterprise Linux 9 może być potencjalnie podatny, ale inne mechanizmy kontrolne zatrzymały ścieżkę do wykorzystania. [4]
Środki zaradcze
Aby bezpośrednio złagodzić podatność CVE-2024-6387, możesz wykonać następujące czynności:
- Zaktualizuj OpenSSH do najnowszej dostępnej wersji lub zainstaluj poprawioną wersję.
- Jako niedoskonałe obejście (jeśli nie możesz zainstalować zaktualizowanej wersji OpenSSH), ustaw parametr LoginGraceTime na 0 w /etc/ssh/sshd_config. To całkowicie łagodzi CVE-2024-6387. Sprawia to jednak, że serwer OpenSSH jest podatny na odmowę usługi. [4]
Możesz również zastosować następujące dodatkowe kroki w celu ogólnego ograniczenia ryzyka związanego z możliwością nadużycia usługi OpenSSH:
- Reguły zapory – użyj zapory, aby ograniczyć dostęp do usługi SSH tylko do zaufanych adresów IP.
- Segmentacja sieci – izoluj serwery SSH w oddzielnych segmentach sieci lub sieciach VLAN, aby zmniejszyć ryzyko bocznego przemieszczania się w sieci, jeśli serwer zostanie naruszony.
- Wzmocnij konfigurację SSH – wyłącz logowanie roota przez SSH i używaj uwierzytelniania kluczem prywatnym zamiast uwierzytelniania hasłem.
- Monitorowanie i rejestrowanie aktywności – włącz i monitoruj dzienniki SSH w celu wykrycia podejrzanej aktywności lub prób nieautoryzowanego dostępu. Regularnie przeglądaj dzienniki pod kątem oznak potencjalnego naruszenia bezpieczeństwa.
Podkreślmy to jeszcze raz – powyższe dodatkowe kroki są dobrymi praktykami pozwalającymi na ogólne wzmocnienie serwera OpenSSH, ale nie zmniejszają bezpośrednio zagrożenia związanego z opisaną luką regreSSHion.
Kluczowe wnioski
- RegreSSHion to luka typu race condition w serwerze OpenSSH, która może pozwolić na nieuwierzytelnione zdalne wykonanie polecenia jako root.
- Luka dotyczy niektórych systemów Linux. Nie dotyczy ona systemów Windows.
- Na razie zaprezentowano dowód koncepcji dla 32-bitowych systemów Linux. Wykorzystanie 64-bitowych systemów Linux jest teoretycznie możliwe, a badania są w toku.
- Ponieważ wykorzystanie podatności jest bardzo skomplikowane, jest mało prawdopodobne, aby wystąpiło na wolności w najbliższej przyszłości. Jednak potencjalny wpływ jest wystarczająco poważny, aby poważnie potraktować proponowane środki zaradcze.
- Aby zaradzić tej sytuacji, zaktualizuj OpenSSH do najnowszej wersji.
Bibliografia
[1] B. Jogi, “regreSSHion: Remote Unauthenticated Code Execution Vulnerability in OpenSSH server”, [Online]. Dostępne: https://blog.qualys.com/vulnerabilities-threat-research/2024/07/01/regresshion-remote-unauthenticated-code-execution-vulnerability-in-openssh-server#affected-openssh-versions.
[2] “NVD NIST,” [Online]. Dostępne: https://nvd.nist.gov/vuln/detail/CVE-2024-6387.
[3] “Ensure SSH LoginGraceTime is set to one minute or less,” SecScan, [Online]. Dostępne: https://secscan.acron.pl/centos7/5/2/14.
[4] “RegreSSHion exploit, CVE-2024-6387: A Write-Up,” Offsec Team, [Online]. Dostępne: https://www.offsec.com/blog/regresshion-exploit-cve-2024-6387/.
[5] “regreSSHion: RCE w serwerze OpenSSH, w systemach Linux opartych na glibc (CVE-2024-6387)”, Qualys Security Advisory, [Online]. Dostępne: https://www.qualys.com/2024/07/01/cve-2024-6387/regresshion.txt.
[6] “CVE-2024-6387,” Ubuntu Security, [Online]. Dostępne: https://ubuntu.com/security/CVE-2024-6387.