Imbarazzante bug in telnetd di Solaris

E’ stato scoperto un grave bug all’interno di telnetd in Solaris 10 e 11 (SunOS 5.10 e 5.11), le versione 9 o inferiori non sembrano essere affette dal problema.
Il demone telnet, al momento di un login remoto, passa degli switch direttamente al processo per il login per permettere all’utente root il login con altri account senza bisogno di password. Il bug permette, se telnetd è avviato con privilegi di root, di effettuare login senza bisogno di autenticazione.

Di seguito è riportata la parte di codice (preso dal progetto OpenSolaris) responsabile del problema:

/usr/src/cmd/cmd-inet/usr.sbin/in.telnetd.c
3199 } else /* default, no auth. info available, login does it all */ {
3200 (void) execl(LOGIN_PROGRAM, “login”,
3201 “-p”, “-h”, host, “-d”, slavename,
3202 getenv(“USER”), 0);
3203 }

/usr/src/cmd/login/login.c
1399 case ‘f’:
1400 /*
1401 * Must be root to bypass authentication
1402 * otherwise we exit() as punishment for trying.
1403 */
1404 if (getuid() != 0 || geteuid() != 0) {
1405 audit_error = ADT_FAIL_VALUE_AUTH_BYPASS;
1406
1407 login_exit(1); /* sigh */
1408 /*NOTREACHED*/
1409 }
1410 /* save fflag user name for future use */
1411 SCPYL(user_name, optarg);
1412 fflag = B_TRUE;

Telnetd è disabilitato di default solo sull’update 3 di Solaris. Su update 1 e 2 telnetd è attivo di default con privilegi ristretti.
Siamo nel 2007 e demoni come telnet dovrebbero essere in disuso da anni ormai, ma non sempre è così. ISC suggerisce, a chi proprio non riesce a farne a meno, alcuni modi per ridurre l’impatto del bug.

Nel 1994 la stessa vulnerabilità fu scoperta in IBM AIX.