Luka w łatce GSSAPI do OpenSSH, zdalnie wykorzystywana na etapie przed uwierzytelnieniem

W zastosowanym w wielu dystrybucjach Linux łatce gssapi.patch, która dodaje do OpenSSH wsparcie dla wymiany kluczy opartej na GSSAPI, zidentyfikowano lukę (CVE-2026-3497), prowadzącą do dereferencji wskaźnika, uszkodzenia pamięci oraz obejścia mechanizmu separacji uprawnień (Privsep). Luka może być wykorzystywana zdalnie na etapie przed uwierzytelnieniem. Badacz, który wykrył problem, zademonstrował inicjowanie awaryjnego zakończenia procesu poprzez wysłanie do serwera SSH jednego zmodyfikowanego pakietu sieciowego. Nie można wykluczyć, że poza odmową usług, istnieją bardziej niebezpieczne warianty wykorzystania luki.

Warto zauważyć, że w swoim czasie deweloperzy OpenSSH odmówili przyjęcia do głównego składu zmiany wspierającej GSSAPI z powodu wątpliwości co do jej bezpieczeństwa. Niemniej jednak wiele dystrybucji Linux włączyło tę łatkę do swoich pakietów OpenSSH. W obiegu istnieje kilka wersji łatki GSSAPI, ale w większości z nich występuje błąd prowadzący do luki. Poprawka jest dostępna tylko w formie łatki, której zmiany polegają na zastąpieniu wywołania funkcji sshpkt_disconnect() przez ssh_packet_disconnect() w pliku kexgsss.c.

Obecnie istnienie luki jest potwierdzone w Debianie i Ubuntu. W pozostałych dystrybucjach zastosowanie problematycznej łatki i jej podatność na lukę są weryfikowane (SUSE/openSUSE, RHEL, Gentoo, Arch, Fedora). Luka manifestuje się tylko w przypadku włączenia w ustawieniach opcji „GSSAPIKeyExchange yes”. Na możliwość wykorzystania wpływają także opcje kompilatora, z którymi w dystrybucjach zbudowano pakiet.

Przyczyną powstania luki jest błąd w funkcji sshpkt_disconnect(), przez który proces nie kończył się po otrzymaniu wiadomości disconnect, co umożliwiało atakującemu w trakcie uzgadniania kluczy wysłanie nieprzewidzianego przez logikę działania serwera typu wiadomości GSSAPI. Po otrzymaniu nieplanowanej wiadomości GSSAPI, serwer Umieszcza go w kolejce i nie przerywa wykonywania programu, ale nie inicjalizuje zmiennych określających parametry połączenia. Następnie w pętli obsługi zdarzeń wykonywany jest kod, który odczytuje nieinicjalizowaną strukturę recv_tok ze stosu (odczytywane są dane pozostałe na stosie z poprzedniego wywołania funkcji), wysyła ją do uprzywilejowanego procesu za pośrednictwem IPC, a następnie przekazuje do funkcji gss_release_buffer(), która może wywołać funkcję free() i zwolnić pamięć dla nieprawidłowego wskaźnika odnoszącego się do losowego obszaru pamięci.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster