2009-06-26 5 views
11

J'ai dû faire un bidouillage Linux pour quelqu'un afin de pouvoir démarrer une imprimante avec la commande shell cupsenable printername tout en étant un utilisateur non-root. Je ne voulais pas qu'ils puissent utiliser l'intégralité de la syntaxe cupsenable en tant que root, donc j'ai juste écrit un wrapper C qui nettoie l'entrée en argv[1] et appelle system("cupsenable sanitizedprintername").Pourquoi ai-je besoin de setuid (0) dans un programme C setuid-root qui appelle un programme administratif avec system()?

J'ai fait le programme setuid root, mais même ainsi, cupsenable a échoué avec "permission denied". Ensuite, j'ai inséré un appel setuid(0) avant system() et, voilà, cela a fonctionné. Ne tenez pas compte du fait qu'il existe une meilleure façon de donner aux utilisateurs le contrôle de l'imprimante. Il y a probablement un meilleur moyen. Ce qui m'intéresse sont les subtilités de chmod u+s par rapport à setuid(0) par rapport à system(). Pourquoi s'est-il comporté de cette façon?

Répondre

17

De man system:

Ne pas utiliser system() d'un programme avec l'ensemble de l'utilisateur-ID ou privilèges set-group-ID, parce que les valeurs étranges pour certaines variables d'environnement peuvent être utilisés pour subvertir l'intégrité du système. Utilisez plutôt la famille de fonctions exec(3), mais pas execlp(3) ou execvp(3). En fait, system() ne fonctionnera pas correctement à partir de programmes avec des privilèges set-user-ID ou set-group-ID sur les systèmes sur lesquels /bin/sh est bash version 2, car bash 2 supprime les privilèges au démarrage.

Et de man bash:

Si le shell est démarré avec l'ID utilisateur effectif (groupe) ne correspond pas à l'utilisateur réel (GID), et l'option -p n'est pas fourni, pas de démarrage les fichiers sont lus, les fonctions shell ne sont pas héritées de l'environnement, la variable SHELLOPTS, si elle apparaît dans l'environnement, est ignorée et l'ID utilisateur effectif est défini sur l'ID utilisateur réel.

Votre appel setuid(0) semble avoir contourné cette protection.

+2

Whoa. Eh bien, j'ai dit que c'était sale. Il semble que ce que j'ai fait était de convaincre le processus bash engendré par le système() que j'ai vraiment, vraiment, honnêtement été racine, jure à Dieu. Il semble que le refactoring soit en ordre. – JCCyC

Questions connexes