În patch-ul gssapi.patch, folosit în multe distribuții Linux, care adaugă suport pentru schimbul de chei bazat pe GSSAPI în OpenSSH, a fost identificată o vulnerabilitate (CVE-2026-3497) care duce la dereferirea unui pointer, coruperea memoriei și ocolirea mecanismului de separare a privilegiilor (Privsep). Vulnerabilitatea poate fi exploatată de la distanță înainte de autentificare. Cercetătorul care a identificat problema a demonstrat că este posibilă inițierea unei opriri accidentale a procesului prin trimiterea unui pachet de rețea modificat către serverul SSH. Nu se exclude că, pe lângă refuzul de serviciu, există și variante mai periculoase de exploatare a vulnerabilității.
Este demn de remarcat că, la vremea respectivă, dezvoltatorii OpenSSH au refuzat să includă în versiunea principală modificarea pentru suportul GSSAPI din cauza îndoielilor legate de siguranța sa. Cu toate acestea, multe distribuții Linux au inclus acest patch în pachetele lor OpenSSH. Există mai multe versiuni ale patch-ului GSSAPI, dar în majoritatea lor există o eroare care conduce la vulnerabilitate. Corecția este disponibilă momentan doar sub formă de patch, modificarea constând în înlocuirea apelului la funcția sshpkt_disconnect() cu ssh_packet_disconnect() în fișierul kexgsss.c.
În prezent, existența vulnerabilității este confirmată în Debian și Ubuntu. În celelalte distribuții, aplicarea patch-ului problematic și susceptibilitatea lui la vulnerabilitate sunt încă în clarificare (SUSE/openSUSE, RHEL, Gentoo, Arch, Fedora). Vulnerabilitatea se manifestă doar când opțiunea „GSSAPIKeyExchange yes” este activată în setări. De asemenea, opțiunile compilatorului cu care pachetul a fost compilat în distribuții influențează posibilitatea exploatării.
Cauza apariției vulnerabilității este o eroare în funcția sshpkt_disconnect(), care determina procesul să nu se oprească după primirea unui mesaj de deconectare, permitând atacatorului, în etapa de negociere a cheilor, să trimită un mesaj GSSAPI neprevăzut de logica de funcționare. server tip de mesaj GSSAPI. După primirea unui mesaj GSSAPI neașteptat, serverul îl plasează în coadă și nu întrerupe executarea programului, dar nu inițializează variabilele care definesc parametrii de conexiune. Ulterior, în bucla de procesare a evenimentelor, este executat un cod care citește structura neinițializată recv_tok din stivă (se citesc datele rămase în stivă de la apelul anterior al funcției), o trimite unui proces privilegiat prin IPC și apoi o pasează funcției gss_release_buffer(), care poate apela funcția free() și elibera memoria pentru un pointer incorect, referindu-se la o zonă aleatorie de memorie.
Sursa: opennet.ro
