Salut,
il me semble que le bit setuid n'est pas honoré sur les scripts sous Linux, ce qu'une recherche sur Internet semble confirmer.
Question: où la limitation est-elle implémentée? Dans le shell? Dans la glib? dans le noyau?
Un lien direct ou un extrait du code concerné serait le bienvenue.
Merci pour votre aide!
# Ce lien ...
Posté par Cheneson Cyril . Évalué à 4.
http://xgarreau.org/aide/admin/suscript/
@++
# Noyau
Posté par Obsidian . Évalué à 2.
Dans le noyau.
$ man execve :
Officiellement, les setuid/setgid bits sont gérés par la primitive evec et ses dérivées. Maintenant, bon nombre d'appels système sont, en pratique, secondés par la glibc elle-même.
Cependant, il n'y a pas de "limitation" posée à proprement parler. Un script n'est pas un programme exécutable au sens UNIX du terme, c'est-à-dire en langage machine et dont l'image remplace celle du processus appelant. Un script est un fichier de données interprété par le programme qui est spécifié en première ligne par #!. Ce sont donc les bits de ce programme qu'il faudrait modifier.
Ca se tient parce qu'un fichier interprété de la sorte n'est pas forcément un programme en lui-même, mais également parce qu'il y aurait conflit dans les cas où le script et l'interpréteur auraient tous deux des bits set[ug]id modifiés.
Maintenant, je ne sais pas si cette facilité a été quand même implémentée sous d'autres UNIX. Mais ce ne doit pas être un comportement par défaut.
[^] # Re: Noyau
Posté par ocroquette . Évalué à 2.
La page de man ne précise pas où c'est implementé. Techniquement parlant, quand tu appelles execve dans un programme en C, c'est celui de la glibc, pas celui du noyau, donc ça ne dit pas qui est responsable du non-setuid sur les scripts.
Mais la suite de ton message m'a permis de comprendre: un script n'est pas vu comme un programme par le noyau, mais comme un fichier qui doit être démarré par l'interpréteur defini par le #!
Effectivement, maintenant je vois ça dans le noyau.
C'est prepare_binprm qui s'occupe du bit setuid:
http://lxr.linux.no/linux/fs/exec.c
/* Set-uid? */
if (mode & S_ISUID) {
current->personality &= ~PER_CLEAR_ON_SETID;
bprm->e_uid = inode->i_uid;
}
Et dans le chargeur de scripts http://lxr.linux.no/linux/fs/binfmt_script.c, prepare_binprm est appelé avec l'interpréteur, pas avec le script.
Bilan, le setuid du script n'a pas d'importance.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.