După identificarea vulnerabilității de la sfârșitul lunii ianuarie, care permitea conectarea ca utilizator root fără verificarea parolei, au fost descoperite mai multe metode de creștere a privilegiilor în serverul telnetd din pachetul GNU InetUtils, ca urmare a remedierii incomplete a vulnerabilității din 1999 (CVE-1999-0073).
Vulnerabilitățile sunt cauzate de existența în telnetd a posibilității de a transmite variabile de mediu de către client către server prin opțiunea ENVIRON. Astfel de variabile de mediu sunt setate și procesate în contextul procesului telnetd și sunt transmise proceselor fiice lansate de acesta, inclusiv procesului /bin/login, care rulează cu drepturi de root. Vulnerabilitatea CVE-1999-0073 permitea clientului telnet să transmită variabila de mediu LD_LIBRARY_PATH, setarea căreia duce la încărcarea bibliotecii partajate specificate de utilizator la lansarea procesului login. În cazul în care sunt posibile încărcări de fișiere în sistemul care suportă conexiuni prin protocolul telnet, un atacator poate încărca o bibliotecă special concepută și poate organiza încărcarea acesteia cu drepturi de root.
În telnetd din pachetul GNU InetUtils, vulnerabilitatea a fost remediată prin interzicerea variabilelor de mediu periculoase prin filtrarea după măștile „LD_”, „LIBPATH”, „ENV”, „IFS” și „_RLD_”. Cu toate acestea, variabila de mediu „CREDENTIALS_DIRECTORY”, care este procesată la lansarea /usr/bin/login, a rămas neblocată. Cu ajutorul acestei variabile de mediu, un utilizator putea modifica directorul cu setările de autentificare și plasa într-un nou director un fișier login.noauth cu valoarea „yes”, activând autentificarea fără parolă (similar cu transmiterea flagului „-f” procesului login). Setarea se aplică tuturor utilizatorilor, inclusiv root.
Atacul constă în crearea de către un utilizator fără privilegii a unui subdirector în directorul său personal, încărcarea unui fișier login.noauth în acesta și încercarea de autentificare setând variabila de mediu „CREDENTIALS_DIRECTORY=directorul creat” și transmitând variabila de mediu „USER=root” (în telnet există un mod de conectare automată, în care numele utilizatorului nu este preluat din linia de comandă, ci transmis prin variabila de mediu USER). Exemplu de exploit.
A fost descoperită o altă modalitate de a obține acces root prin telnetd, legată de manipularea variabilelor de mediu OUTPUT_CHARSET și LANGUAGE, procesate de biblioteca GNU gettext, și a variabilei de mediu GCONV_PATH, utilizată în glibc. Prin setarea variabilelor de mediu OUTPUT_CHARSET și LANGUAGE, un atacator poate activa în gettext funcționalitatea de conversie a codificării caracterelor, apelând funcția iconv_open(). La rândul său, în timpul executării funcției iconv_open() la încărcarea fișierului de configurare gconv-modules, calea este calculată având în vedere variabila de mediu GCONV_PATH. Prin substituirea fișierului gconv-modules se poate organiza încărcarea unei biblioteci partajate personalizate în timpul afișării unei string localizate de către procesul login.
CVE-uri pentru vulnerabilitățile marcate nu au fost încă atribuite. Ca metodă de protecție se ia în considerare utilizarea unei liste albe de valori admise ("TERM", "DISPLAY", "USER", "LOGNAME" și "POSIXLY_CORRECT") cu blocarea tuturor celorlalte variabile de mediu, similar cu modul în care sunt gestionate variabilele de mediu în OpenSSH. Vulnerabilitățile au fost confirmate în pachetul GNU InetUtils, implementare server telnetd care este livrat în Debian, Ubuntu și distribuții derivate. Corecțiile pentru GNU InetUtils nu sunt disponibile încă. În Rocky Linux 9 este livrat un telnetd modificat, care nu este vulnerabil, în care, în locul filtrării variabilelor de mediu periculoase, este inclusă o verificare bazată pe lista albă. Filtrarea pe baza listei albe este implementată și în telnetd din FreeBSD. În OpenBSD telnetd a fost exclus din sistem în 2005.
Sursa: opennet.ro
