Nach der Ende Januar entdeckten Schwachstelle, die es ermöglichte, sich als Benutzer root ohne Passwortüberprüfung anzumelden, wurden im Telnet-Server telnetd aus dem GNU InetUtils-Paket mehrere Möglichkeiten zur Erhöhung der Privilegien festgestellt, die sich aus der unvollständigen Behebung der Schwachstelle im Jahr 1999 (CVE-1999-0073) ergeben haben.
Die Schwachstellen entstehen durch die Möglichkeit, dass telnetd Umgebungsvariablen durch den Client mithilfe der Option ENVIRON an den Server überträgt. Solche Umgebungsvariablen werden im Kontext des telnetd-Prozesses gesetzt und bearbeitet und an die von ihm gestarteten Kindprozesse, einschließlich des mit root-Rechten gestarteten Prozesses /bin/login, weitergeleitet. Die Schwachstelle CVE-1999-0073 ermöglichte es dem Telnet-Client, die Umgebungsvariable LD_LIBRARY_PATH zu übergeben, deren Festlegung dazu führt, dass die vom Benutzer angegebene Shared Library beim Start des login-Prozesses geladen wird. Bei der Möglichkeit, Dateien in ein System, das die Telnet-Protokollverbindung unterstützt, hochzuladen, kann der Angreifer eine speziell gestaltete Bibliothek hochladen und deren Laden mit root-Rechten organisieren.
Im telnetd des GNU InetUtils-Pakets wurde die Schwachstelle durch das Verbot gefährlicher Umgebungsvariablen durch Filterung nach den Masken „LD_“, „LIBPATH“, „ENV“, „IFS“ und „_RLD_“ behoben. Dabei blieb die Umgebungsvariable „CREDENTIALS_DIRECTORY“, die beim Start von /usr/bin/login verarbeitet wird, jedoch unblockiert. Mit dieser Umgebungsvariable konnte der Benutzer das Verzeichnis für die Anmeldeinformationen ändern und eine Datei login.noauth mit dem Wert „yes“ im neuen Verzeichnis ablegen, die eine Anmeldung ohne Passwort aktiviert (ähnlich wie das Übergeben des Flags „-f“ an den login-Prozess). Diese Einstellung gilt für alle Benutzer, einschließlich root.
Der Angriff besteht darin, dass ein unprivilegierter Benutzer ein Unterverzeichnis in seinem Home-Verzeichnis erstellt, eine Datei login.noauth in dieses hochlädt und versucht, sich mit der festgelegten Umgebungsvariable „CREDENTIALS_DIRECTORY=erstellt Verzeichnis“ und der Übermittlung der Umgebungsvariable „USER=root“ anzumelden (in Telnet gibt es einen automatischen Verbindungsmodus, in dem der Benutzername nicht aus der Befehlszeile, sondern über die Umgebungsvariable USER übergeben wird). Beispiel für einen Exploit.
Im Folgenden wurde eine weitere Methode entdeckt, um root-Zugriff über telnetd zu erhalten, 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 zur Konvertierung von Zeichencodierungen in gettext aktivieren, die die Funktion iconv_open() aufruft. Bei der Ausführung der Funktion iconv_open() während des Ladens der Konfigurationsdatei gconv-modules wird der Pfad unter Berücksichtigung der Umgebungsvariable GCONV_PATH berechnet. Durch das Einfügen der gconv-modules-Datei kann das Laden einer eigenen gemeinsam genutzten Bibliothek während der Ausgabe einer lokalisierten Zeichenfolge durch den Prozess login organisiert werden.
CVE-Identifikatoren für die identifizierten Schwachstellen wurden bisher nicht zugewiesen. Als Schutzmaßnahme wird die Implementierung einer Whitelist von erlaubten Werten („TERM“, „DISPLAY“, „USER“, „LOGNAME“ und „POSIXLY_CORRECT“) in Betracht gezogen, wobei alle anderen Umgebungsvariablen blockiert werden, ähnlich wie es mit Umgebungsvariablen in OpenSSH gehandhabt wird. Die Schwachstellen wurden im GNU InetUtils-Paket bestätigt, das die Server telnetd-Implementierung enthält, die in Debian, Ubuntu und verwandten Distributionen geliefert wird. Korrekturen für GNU InetUtils stehen derzeit nicht zur Verfügung. In Rocky Linux 9 wird eine modifizierte telnetd-Version geliefert, die nicht anfällig für diese Schwachstellen ist und anstelle der Filterung gefährlicher Umgebungsvariablen eine Whitelist-Prüfung implementiert. Eine Whitelist-Filterung wurde auch in der telnetd-Version von FreeBSD implementiert. In OpenBSD wurde telnetd im Jahr 2005 aus dem System entfernt.
Quelle: opennet.ru
