
Proof-of-Concept-Exploit für CVE-2026-24061, eine telnetd-Authentifizierungsumgehung über Argument-Injection in der USER-Umgebungsvariable, die nicht authentifizierten Root-Shell-Zugriff ermöglicht.
Argument Injection in telnetd aus GNU InetUtils. Versionen 1.9.3 bis 2.7. CVSS 9.8. In der CISA KEV seit dem 26.01.2026, also aktiv in freier Wildbahn ausgenutzt.
Der ganze Trick besteht darin, dass telnetd den Wert der Umgebungsvariable USER vom Client über NEW-ENVIRON (RFC 1572) entgegennimmt und ihn ohne jegliche Validierung direkt in den Aufruf von login(1) einfügt. Wenn der Client USER="-f root" sendet, führt telnetd Folgendes aus:
/usr/bin/login -p -h <host> -f root
Das Flag -f bei login bedeutet „diesen Benutzer ohne Passwort anmelden". Root-Shell, null Authentifizierung.
In telnetd/telnetd.c gibt es eine Vorlage für den login-Aufruf:
char *login_invocation = PATH_LOGIN " -p -h %h %?u{-f %u}{%U}";
%u ist der Benutzer aus der Telnet-Authentifizierung (vertrauenswürdig). %U ist der rohe Wert der env-Variable USER vom Client (nicht vertrauenswürdig). Wenn die Authentifizierung nicht aktiv ist, wird %U verwendet.
Die Variablenexpansion sitzt in telnetd/utility.c, Funktion _var_short_name:
case 'U':
return getenv("USER") ? xstrdup(getenv("USER")) : xstrdup("");
Null Filterung. Was auch immer der Client in USER sendet, fliegt direkt in die Kommandozeile von login. Nicht nur -f root funktioniert, theoretisch kann jedes Argument, das login akzeptiert, injiziert werden.
Der Bug wurde in einem Upstream-Safe-Guard-Commit vom 19.03.2015 (fa3245ac) eingeführt. Ironischerweise sollte dieser Commit die Handhabung der Variable USER verbessern. Debian hatte dafür 2019 einen Patch (0028-telnetd-Scrub-USER-from-environment.patch), aber beim Fix von CVE-2020-10188 in Debian 10 ging der Patch verloren und der Bug kam zurück. Daher sind auch Debian 10+, Ubuntu und Derivate verwundbar.
main.py ist ein minimaler Telnet-Client, der:
IAC SB NEW_ENVIRON IS VAR "USER" VALUE "-f root" IAC SE antwortetlogin -f root, du bekommst eine Shellklient serwer
|--- tcp connect ------------------->|
|<-- IAC DO NEW_ENVIRON -------------|
|--- IAC WILL NEW_ENVIRON ---------->|
|<-- IAC SB NEW_ENVIRON SEND --------|
|--- SB NEW_ENVIRON IS |
| VAR "USER" VALUE "-f root" |
| IAC SE ------------------------>|
| [telnetd: login -p -h x -f root]|
|<-- root@host:~# ------------------|
python3 main.py <host>
python3 main.py <host> -p <port>
Strg+C beendet die Sitzung.
Versuche das nicht an Systemen, die kein inetutils-telnetd haben. Das Paket telnetd von netkit ist anderer Code und nicht anfällig für genau diesen Bug. Wenn du dich verbindest und einen normalen Login-Prompt statt einer Shell bekommst, hat der Server entweder bereits den Patch oder es ist kein inetutils-telnetd.
Ändere das Payload nicht auf -f <anderer_benutzer> in der Erwartung, dass es auf jedem System funktioniert. login(1) aus manchen Distributionen hat zusätzliche Einschränkungen bei -f. Auf Standard-Debian/Ubuntu funktioniert -f root problemlos.
| Software | Versionen |
|---|---|
| GNU InetUtils | 1.9.3 - 2.7 |
| Debian 10+ | inetutils-telnetd (bis zum Patch) |
| Debian 11 | behoben in 2:2.0-1+deb11u3 |
| Ubuntu | inetutils-telnetd (bis zum Patch) |
Der offizielle Fix fügt eine Funktion sanitize() hinzu, die Werte ablehnt, die mit - beginnen oder Shell-Metazeichen enthalten. Angewendet auf alle Variablen in der Expansion, nicht nur USER.
static char *
sanitize (const char *u)
{
if (u && *u != '-' && !u[strcspn(u, "\t\n !\"#$&'()*;<=>?[\\^`{|}~")])
return u;
else
return "";
}
fd702c0 - Patch für USERccba9f7 - Sanitisierung aller Variablen