Nachdem Ende Januar eine Schwachstelle entdeckt wurde, die es erlaubte, sich als Root-Benutzer ohne Passwortüberprüfung anzumelden, wurden im telnetd-Server aus dem GNU InetUtils-Paket mehrere Möglichkeiten zur Privilegienerhöhung identifiziert. Diese sind die Folge einer unvollständigen Behebung der Schwachstelle aus dem Jahr 1999 (CVE-1999-0073).
Die Schwachstellen resultieren aus der Möglichkeit in telnetd, Umgebungsvariablen vom Client über die OPTION ENVIRON an den Server zu übermitteln. Solche Umgebungsvariablen werden im Kontext des telnetd-Prozesses gesetzt und verarbeitet und an die von ihm gestarteten Kindprozesse weitergereicht, einschließlich des mit Root-Rechten gestarteten Prozesses /bin/login. Die Schwachstelle CVE-1999-0073 erlaubte es dem telnet-Client, die Umgebungsvariable LD_LIBRARY_PATH zu übergeben, deren Einstellung dazu führt, dass beim Start des Login-Prozesses die angegebene Shared Library geladen wird. Bei der Möglichkeit, Dateien in ein System hochzuladen, das Verbindungen über das telnet-Protokoll unterstützt, kann ein Angreifer eine speziell gestaltete Bibliothek hochladen und deren Ausführung mit Root-Rechten herbeiführen.
In telnetd aus dem GNU InetUtils-Paket wurde eine Sicherheitsanfälligkeit behoben, indem gefährliche Umgebungsvariablen durch Filtering von den Masken „LD_“, „LIBPATH“, „ENV“, „IFS“ und „_RLD_“ gesperrt wurden. Allerdings blieb die Umgebungsvariable „CREDENTIALS_DIRECTORY“ unblockiert, die bei der Ausführung von /usr/bin/login verarbeitet wird. Mit dieser Umgebungsvariable konnte der Benutzer das Verzeichnis für die Anmeldeeinstellungen ändern und eine Datei login.noauth mit dem Wert „yes“ im neuen Verzeichnis ablegen, die einen passwortfreien Zugang aktiviert (ähnlich wie das Übergeben des Flags „-f“ an den login-Prozess). Diese Konfiguration gilt für alle Benutzer, einschließlich root.
Der Angriff besteht darin, dass ein nicht privilegierter Benutzer ein Unterverzeichnis in seinem Heimatverzeichnis erstellt, eine Datei login.noauth darin hochlädt und versucht, sich anzumelden, indem er die Umgebungsvariable „CREDENTIALS_DIRECTORY=erstellt Verzeichnis“ setzt und die Umgebungsvariable „USER=root“ übergibt (telnet hat einen automatischen Verbindungsmodus, in dem der Benutzername nicht über die Kommandozeile, sondern über die Umgebungsvariable USER übergeben wird). Beispiel für einen Exploit.
Es wurde eine weitere Methode zur Erlangung von Root-Zugriff über telnetd festgestellt, die mit der Manipulation der Umgebungsvariablen OUTPUT_CHARSET und LANGUAGE zusammenhängt, die von der GNU gettext-Bibliothek verarbeitet werden, sowie der Umgebungsvariablen GCONV_PATH, die in glibc verwendet wird. Durch das Setzen der Umgebungsvariablen OUTPUT_CHARSET und LANGUAGE kann der Angreifer die Funktionalität von gettext zur Zeichencodierung aktivieren, welche die Funktion iconv_open() aufruft. Bei der Ausführung der Funktion iconv_open() wird beim Laden der Konfigurationsdatei gconv-modules der Pfad unter Berücksichtigung der Umgebungsvariablen GCONV_PATH berechnet. Durch das Einfügen der Datei gconv-modules kann der Angreifer das Laden einer eigenen Shared Library während der Ausgabe des lokalisierten Strings durch den Login-Prozess organisieren.
CVE-Identifikatoren wurden für die markierten Schwachstellen bisher nicht zugewiesen. Als Schutzmaßnahme wird die Verwendung einer Whitelist zulässiger Werte („TERM“, „DISPLAY“, „USER“, „LOGNAME“ und „POSIXLY_CORRECT“) in Betracht gezogen, die alle anderen Umgebungsvariablen blockiert, ähnlich der Handhabung von Umgebungsvariablen in OpenSSH. Die Schwachstellen wurden im Paket GNU InetUtils bestätigt. сервера telnetd, das in Debian, Ubuntu und abgeleiteten Distributionen geliefert wird. Patches für GNU InetUtils sind bisher nicht verfügbar. In Rocky Linux 9 wird eine angepasste Version von telnetd ausgeliefert, die nicht anfällig für Sicherheitsanfälligkeiten ist; hier wurde eine Whitelist-Überprüfung anstelle der Filterung gefährlicher Umgebungsvariablen implementiert. Eine Whitelist-Filterung ist auch in telnetd von FreeBSD integriert. In OpenBSD wurde telnetd im Jahr 2005 aus dem System entfernt.
Quelle: opennet.ru
