Dopo la vulnerabilità scoperta alla fine di gennaio che permetteva di connettersi come utente root senza verifica della password, nel server telnetd del pacchetto GNU InetUtils sono state individuate diverse modalità di elevazione dei privilegi, derivanti da una mitigazione incompleta della vulnerabilità del 1999 (CVE-1999-0073).
Le vulnerabilità sono causate dalla possibilità di telnetd di trasmettere variabili d'ambiente dal client al server tramite l'opzione ENVIRON. Tali variabili d'ambiente vengono impostate e gestite nel contesto del processo telnetd e trasmesse ai suoi processi figlio in esecuzione, incluso il processo /bin/login avviato con i privilegi di root. La vulnerabilità CVE-1999-0073 consentiva al client telnet di trasferire la variabile d'ambiente LD_LIBRARY_PATH, la cui impostazione causa il caricamento della libreria condivisa specificata dall'utente durante l'esecuzione del processo di accesso. Con la possibilità di caricare file su un sistema che supporta la connessione tramite protocollo telnet, un attaccante può caricare una libreria appositamente creata e forzarne il caricamento con privilegi di root.
In telnetd from the GNU InetUtils set, a vulnerability was fixed by banning dangerous environment variables through filtering masks `LD_`, `LIBPATH`, `ENV`, `IFS`, and `_RLD_`. However, the environment variable `CREDENTIALS_DIRECTORY` remained unblocked and is processed when starting /usr/bin/login. Using this environment variable, a user could change the directory for credential settings and place a file named login.noauth in the new directory with the value `yes`, which activates passwordless login (similar to passing the `-f` flag to the login process). This setting applies to all users, including root.
The attack involves a non-privileged user creating a subdirectory in their home directory, uploading a login.noauth file to it, and attempting to log in by setting the environment variable `CREDENTIALS_DIRECTORY=created directory` and passing the environment variable `USER=root` (telnet has an auto-login mode where the username is taken not from the command line but passed through the environment variable USER). Example of an exploit.
È stato identificato un ulteriore metodo per ottenere l'accesso root tramite telnetd, legato alla manipolazione delle variabili d'ambiente OUTPUT_CHARSET e LANGUAGE, elaborate dalla libreria GNU gettext, e alla variabile d'ambiente GCONV_PATH, utilizzata in glibc. Impostando le variabili d'ambiente OUTPUT_CHARSET e LANGUAGE, un attaccante può attivare in gettext la funzionalità di conversione della codifica dei caratteri, che chiama la funzione iconv_open(). A sua volta, durante l'esecuzione della funzione iconv_open() al caricamento del file di configurazione gconv-modules, il percorso viene calcolato tenendo conto della variabile d'ambiente GCONV_PATH. Sostituendo il file gconv-modules, è possibile organizzare il caricamento di una propria libreria condivisa durante l'output di una stringa localizzata dal processo di login.
I CVE identificatori per le vulnerabilità segnalate non sono ancora stati assegnati. Come metodo di protezione, si considera l'uso di un elenco bianco di valori accettabili («TERM», «DISPLAY», «USER», «LOGNAME» e «POSIXLY_CORRECT») bloccando tutte le altre variabili d'ambiente, analogamente a come viene gestito il lavoro con le variabili d'ambiente in OpenSSH. Le vulnerabilità sono confermate nel pacchetto GNU InetUtils, implementazione server telnetd fornito su Debian, Ubuntu e distribuzioni derivate. Le patch per GNU InetUtils sono ancora assenti. In Rocky Linux 9 è presente una versione modificata di telnetd non vulnerabile, che implementa un controllo basato su whitelist invece della filtrazione delle variabili d'ambiente pericolose. Anche telnetd in FreeBSD ha attuato la filtrazione per whitelist. In OpenBSD telnetd è stato rimosso dal sistema nel 2005.
Fonte: opennet.ru
