Opublikowano wydanie OpenSSH 9.2, otwartej implementacji klienta i serwera do pracy z protokołami SSH 2.0 i SFTP. W nowej wersji naprawiono lukę, prowadzącą do podwójnego zwolnienia pamięci na etapie przed uwierzytelnieniem. Luka dotyczy tylko wersji OpenSSH 9.1, w wcześniejszych wersjach problem nie występuje.
Aby stworzyć warunki do pojawienia się luki, wystarczy zmienić baner klienta SSH na „SSH-2.0-FuTTYSH_9.1p1”, aby uzyskać ustawienie flag „SSH_BUG_CURVE25519PAD” i „SSH_OLD_DHGEX”, które zależą od wersji klienta SSH. Po ustawieniu tych flag pamięć dla bufora „options.kex_algorithms” jest zwalniana dwa razy — podczas wykonywania funkcji do_ssh2_kex(), wywołującej compat_kex_proposal(), oraz podczas wykonywania funkcji do_authentication2(), wywołującej po kolei input_userauth_request(), mm_getpwnamallow(), copy_set_server_options(), assemble_algorithms() i kex_assemble_names().
Stworzenie działającego eksploitu luki uznawane jest za mało prawdopodobne, ponieważ proces eksploatacji jest zbyt skomplikowany — nowoczesne biblioteki zarządzania pamięcią oferują zabezpieczenia przed podwójnym zwolnieniem pamięci, a proces pre-auth, w którym występuje błąd, wykonywany jest z obniżonymi uprawnieniami w izolowanym środowisku sandbox.
Oprócz wymienionej luki w nowym wydaniu usunięto również dwa inne problemy z bezpieczeństwem:
- Błąd w obsłudze ustawienia „PermitRemoteOpen”, prowadzący do ignorowania pierwszego argumentu, jeśli różni się od wartości „any” i „none”. Problem występuje w wersjach nowszych niż OpenSSH 8.7 i prowadzi do pominięcia weryfikacji przy wskazywaniu tylko jednego uprawnienia.
- Atakujący, kontrolujący serwer DNS używany do rozwiązywania nazw, może osiągnąć wstawienie znaków specjalnych (np. „*”) do plików known_hosts, jeśli w konfiguracji włączone są opcje CanonicalizeHostname i CanonicalizePermittedCNAMEs, a systemowy resolver nie sprawdza poprawności odpowiedzi od serwera DNS. Przeprowadzenie ataku uznawane jest za mało prawdopodobne, ponieważ zwracane nazwy muszą spełniać warunki określone przez CanonicalizePermittedCNAMEs.
Inne zmiany:
- W ssh_config dla ssh dodano ustawienie EnableEscapeCommandline, które kontroluje włączanie obsługi po stronie klienta sekwencji ucieczki „~C”, zapewniającej wiersz poleceń. Domyślnie obsługa „~C” jest obecnie wyłączona w celu zastosowania bardziej rygorystycznej izolacji sandbox, co potencjalnie może prowadzić do zakłócenia działania systemów, w których „~C” jest używane do przekierowywania portów podczas pracy.
- W sshd_config dla sshd dodano dyrektywę ChannelTimeout, aby ustalić timeout nieaktywności kanału (kanały, w których przez określony w dyrektywie czas nie rejestrowano ruchu, będą automatycznie zamykane). Dla sesji, X11, agenta i przekierowywania ruchu można ustalić różne timery.
- W sshd_config dla sshd dodano dyrektywę UnusedConnectionTimeout, która pozwala ustalić timeout dla zakończenia połączeń klientów, które pozostają przez określony czas bez aktywnych kanałów.
- W sshd dodano opcję „-V” do wyświetlania wersji, analogicznie do podobnej opcji w kliencie ssh.
- Do wyjścia „ssh -G” dodano wiersz „Host”, odzwierciedlający wartość argumentu o nazwie host.
- W scp i sftp dodano opcję „-X” do zarządzania takimi parametrami protokołu SFTP, jak rozmiar bufora kopiowania oraz liczba oczekujących na zakończenie zapytań.
- W ssh-keyscan umożliwiono skanowanie pełnych zakresów adresów CIDR, na przykład „ssh-keyscan 192.168.0.0/24”.
Źródło: opennet.ru
