(Courriels de diversion: <bohemiennes@recriminiez-transcription.com> <scolariserait@cuti-reaction-aspergeons.com> <radiodiffuses@degrossissaient-refugies.com> <sous-estimions@particularises-embrayons.com> <ravives@galvaniserez-tuerez.com> <erres@trituraient-prejugeons.com> <fragilise@assaisonnee-baladeurs.com> <terminiez@frequentons-crucifiement.com> <figurerait@desodoriserent-retournerez.com> <interrompit@sucera-etatiseront.com> )
Le 6 Avr, jdd écrit : > je m'explique : exemple, démarrage de la liaison ppp. Plusieurs scripts > s'enchainent. J'ai écrit "up" qui appelle "suseppp", qui lui-même > appelle je ne sais pas trop quoi. > > en root, tout se passe bien. > en user, non, même avec les appartenance aux groupes correctes (à > première vue!), mais ce n'est pas l'objet de cette question. > > j'ai voulu mettre "up" en suid. Je l'ai mis en root:user et donc suid. > up se lance bien en utilisateur, mais pas suseppp. Il semble donc que > les droits suid ne se transmettent pas. (suseppp n'est pas exécuté avec > les droits root). > deux questions, donc. > *est-ce bien vrai que les droits root ne se transmettent pas, ou ais-je > oublié quelque chose. Ils sont transmis, une fois qu'ils ont été donnés. Ton problème vient sans doute de là : je suppose que « up » est un script. Le noyau Linux (au moins en 2.0, je ne sais pas ce qu'il en est des versions plus récentes) n'honorent pas les changements d'identité sur les scripts (ni sur les fichiers trouvés dans un système de fichiers montés avec l'option nosuid). Pourquoi ? Parce qu'à l'inverse de Solaris, il ne sait pas le faire sans ouvrir un trou de sécurité (je ne détaille pas). Tu as alors deux solutions : - tu crées un fichier wrapper.c qui contient : #include <unistd.h> #include <stdio.h> int main(void) { execl("/bin/bash", "sh", "-p", "up", NULL); /* remplace up par le chemin de ton script */ perror("wrapper failed to exec up"); exit(1); } Tu le compiles, tu le mets suid, et ça roule. (pas testé cette instance particulière ; mais j'ai déjà fait). - ou tu vérifies que le logiciel libre, c'est pas du vent, et que la disponibilité des sources est un plus. Dans les sources du noyau, tu vas dans le répertoire fs. Ce qui t'intéresse, ce sont les fichiers binfmt_elf.c et binfmt_script.c. Dans le premier, tu cherches « euid » dans la fonction do_load_elf_binary. Cela doit t'amener sur des lignes qui ressemblent à ça : current->suid = current->euid = current->fsuid = bprm->e_uid; current->sgid = current->egid = current->fsgid = bprm->e_gid; Tu les copies au début de la fonction do_load_script du second fichier. Tu recompiles le noyau et tu boutes dessus. Voilà ! Ton noyau sait exécuter des scripts suid. (pas testé ; je ne suis pas absolument certain que cette manip suffise). Evidemment, les deux méthodes introduisent des trous de sécurité (surtout la deuxième). A toi de voir. > *si il faut traiter tous les fichiers, y a-t-il moyen de savoir quelle > est la liste des fichiers exécutés sans plonger dans le source (un sorte > de traceroute)? Le plus tout terrain est de tenter un « strace -f -o /tmp/trace » sur ta commande, puis de chercher les appels à open et execve dedans. Tu devrais tout attraper (tu ne peux pas le faire si tes commandes sont suid ; tu dois le faire en root). -- Marc Thirion | Toulouse, France Un Travail pour Chacun : http://www.multimania.com/untravailchacun/ _______________________________________________________________________ Le CULTe sur le ouebe: http://savage.iut-blagnac.fr/