Naar aanleiding van de kwetsbaarheid die eind januari werd ontdekt, waardoor verbinding kon worden gemaakt als root-gebruiker zonder wachtwoordverificatie, zijn er in de telnetd-server van de GNU InetUtils verschillende methoden voor privilege-escalatie ontdekt, die het gevolg zijn van de onvolledige oplossing van de kwetsbaarheid in 1999 (CVE-1999-0073).
De kwetsbaarheden zijn ontstaan door de mogelijkheid binnen telnetd om omgevingsvariabelen van de client naar de server te verzenden via de ENVIRON-optie. Dergelijke omgevingsvariabelen worden ingesteld en verwerkt in de context van het telnetd-proces en worden doorgegeven aan de door het proces opgestarte kindprocessen, waaronder het met root-rechten uitgeroepen proces /bin/login. De kwetsbaarheid CVE-1999-0073 stelde de telnet-client in staat om de omgevingsvariabele LD_LIBRARY_PATH door te geven, waarvan de instelling leidt tot het laden van de door de gebruiker opgegeven gedeelde bibliotheek bij het starten van het login-proces. Wanneer bestanden naar een systeem kunnen worden geladen dat telnet-verbindingen ondersteunt, kan een aanvaller een speciaal opgemaakte bibliotheek laden en deze met root-rechten laten laden.
In telnetd van de GNU InetUtils is de kwetsbaarheid opgelost door gevaarlijke omgevingsvariabelen te blokkeren via filtering op de maskers 'LD_', 'LIBPATH', 'ENV', 'IFS' en '_RLD_'. Hierbij bleek de omgevingsvariabele 'CREDENTIALS_DIRECTORY', die wordt verwerkt bij het starten van /usr/bin/login, niet geblokkeerd. Met deze omgevingsvariabele kon de gebruiker de directory voor de inloggegevens wijzigen en in de nieuwe directory een bestand login.noauth plaatsen met de waarde 'yes', waardoor inloggen zonder wachtwoord mogelijk werd (vergelijkbaar met het doorgeven van de flag '-f' aan het login-proces). Deze instelling geldt voor alle gebruikers, inclusief root.
De aanval bestaat uit het creƫren van een subdirectory door een niet-privileged gebruiker in zijn of haar home-directory, het uploaden van een bestand login.noauth en het proberen in te loggen door de omgevingsvariabele 'CREDENTIALS_DIRECTORY=gecreƫerde_directory' in te stellen en de omgevingsvariabele 'USER=root' door te geven (in telnet is er een automatische verbindingsmodus, waarin de gebruikersnaam niet uit de opdrachtregel komt, maar via de omgevingsvariabele USER wordt doorgegeven). Voorbeeld van een exploit.
Daarna is er een andere manier ontdekt om root-toegang te verkrijgen via telnetd, gerelateerd aan de manipulatie van de omgevingsvariabelen OUTPUT_CHARSET en LANGUAGE, die worden verwerkt door de GNU gettext-bibliotheek, en de omgevingsvariabele GCONV_PATH, die wordt gebruikt in glibc. Door de omgevingsvariabelen OUTPUT_CHARSET en LANGUAGE in te stellen, kan een aanvaller de functionaliteit voor het converteren van tekenencoderingen in gettext activeren, wat de functie iconv_open() oproept. Bij de uitvoering van de functie iconv_open() bij het laden van het configuratiebestand gconv-modules, wordt het pad berekend rekening houdend met de omgevingsvariabele GCONV_PATH. Door het invoegen van het bestand gconv-modules kan laadbare aangepaste gedeelde bibliotheek tijdens het afgeven van een gelokaliseerde reeks door het login-proces worden georganiseerd.
CVE-id's zijn nog niet toegewezen aan de aangemelde kwetsbaarheden. Als beschermingsmethode wordt overwogen om een whitelist van toegestane waarden ('TERM', 'DISPLAY', 'USER', 'LOGNAME' en 'POSIXLY_CORRECT') te gebruiken, waarmee alle andere omgevingsvariabelen worden geblokkeerd, vergelijkbaar met hoe omgevingsvariabelen in OpenSSH worden behandeld. De kwetsbaarheden zijn bevestigd in het GNU InetUtils-pakket, de implementatie de server telnetd die wordt geleverd in Debian, Ubuntu en afgeleide distributies. Er zijn momenteel geen correcties voor GNU InetUtils beschikbaar. Rocky Linux 9 biedt een gemodificeerd telnetd dat niet kwetsbaar is, waarin in plaats van filtering van gevaarlijke omgevingsvariabelen een whitelist-controle is opgenomen. De whitelist-filters zijn ook geĆÆmplementeerd in telnetd van FreeBSD. In OpenBSD is telnetd in 2005 uit het systeem verwijderd.
Bron: opennet.ru
