Solaris, système en bois

Je dois ce fabuleux titre à maître Nicolas es Ruff, qui a su agrémenter la journée par un mail matinal sur la liste de l'OSSIR. Quel pouvait bien être le contenu ? Tout simplement l'annonce qui devrait faire pas mal de bruit dans les semaines à venir, dans le petit monde de la sécurité informatique, faire la joie des script kiddies et trembler les RSSI. Ah oui, j'oubliai, il y a un mec (ou une nana, ne soyons pas sexiste), chez sun, qui a dû perdre son travail, aujourd'hui. Accordons-lui une minute de [nuisance|http://www.youtube.com/watch?v=wHWHHGZnt_o&mode=related&search=]. __Que se passe-t-il ?__ Un développement foireux dans deux outils extrêmement utilisés : le démon telnetd et l'utilitaire login. Le premier est un serveur énormément usité autrefois et qui a encore des adeptes (si, si, j'ai des preuves) qui permet la connexion à distance. Le deuxième permet de démarrer une session sur le système. Le tout mis ensemble n'est rien d'autre qu'un splendide accès à distance, sans mot de passe, en tant que root. __Comment cela est-il possible ?__ Voici le code source des deux logiciels incriminés : ''/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'' @@ 1397 break;@@%%% @@ 1398@@%%% @@ 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 */@@%%% @@ 1411SCPYL(user_name, optarg);@@%%% @@ 1412 fflag = B_TRUE;@@%%% Dans le code de login, on voit une option __-f__ qui permet de ne pas réaliser l'authentification. Dans le code de telnetd, on note que l'implémentation de la variable user ne reçoit aucune vérification. De ce fait, si on emploie la combinaison de l'un et l'autre, on en déduit une connexion aisée. __La faute à qui ?__ La faute à l'implémentation de kerberos, dans telnetd, la faute à la non vérification de la variable passée, la faute à l'autorisation de connexion sans vérification. __Et la suite ?__ Tout d'abord, Open Solaris devrait rapidement fournir un code correctif et se mordre les doigts, puisque cette faille avait déjà fait ses preuve sur AIX ... en 1994. C'est un sacré coup pour l'image de marque. Quoi qu'il en soit, c'est aussi parce que le code source est disponible que cette faille a pu être trouvée, donc encore une fois, merci le logiciel libre. Maintenant, il y a deux choses qui peuvent arriver. La première, c'est que tous les jeunes informaticiens, en mal de sensation, vont essayer cette faille et devenir root sur des systèmes distants. Cela pose évidemment un problème aux structures qui ont 1) de l'OpenSolaris, 2) du telnet. On notera cependant, que 1) n'est pas encore une évidence et que 2) ne devrait plus l'être. Mais la sécurité, c'est comme l'histoire de Don Quichotte et des moulins... Il devrait y avoir une suite de deface et de perte d'accès. L'autre chose qu'il pourrait arriver, c'est que des admins consciencieux installent des systèmes dit "pot de miel" avec un service telnetd et analysent le comportement des pirates. Mais voyons, qui pourrait être aussi tordu ? ... Merci, en tous les cas, du moins pour g0re, voilà au moins un exploit\[able\] :p