Bit setuid sur les scripts

Le
Olivier Croquette
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!

--
Pour contacter l'équipe de modération : moderateurs-fcolm@efrei.fr
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Julien Salgado
Le #7247041
Olivier Croquette a écrit :
Salut,



Bonsoir,

il me semble que le bit setuid n'est pas honoré sur les scripts sous
Linux, ce qu'une recherche sur Internet semble confirmer.



En effet, cela est fait pour une raison de sécurité, ci ce n'était pas
le cas il serait possible d'obtenir « assez facilement » des droits
root avec des scripts qui utilisent des variables dans certaines
conditions. On trouve cela sur les autre UNIX aussi.

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.



L'implémentation est directement dans le noyau, relativement au
répertoire source du noyau les sources à regarder sont :
fs/exec.c
et
fs/binfmt_script.c

Dans binfmt_script la fonction load_script se termine par le
remplacement du fichier script par l'interpréteur de commande :
/*
* OK, now restart the process with the interpreter's dentry.
*/
file = open_exec(interp);
if (IS_ERR(file))
return PTR_ERR(file);

bprm->file = file;
retval = prepare_binprm(bprm);
if (retval < 0)
return retval;


Tout se joue avec prepare_binprm(bprm) qui est défini dans exec.c et est
appelé avec le script comme argument. Malgré la définition de
prepare_binprm :
struct inode * inode = bprm->file->f_dentry->d_inode;
...
mode = inode->i_mode
...

if(!(bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)) {
/* Set-uid? */
if (mode & S_ISUID) {
current->personality &= ~PER_CLEAR_ON_SETID;
bprm->e_uid = inode->i_uid;
}

L'exécution se fait avec les droits de l'utilisateur, car ce sont les
modes de l'interpréteur qui sont lus dans prepare_binprm.

Bien sûr, si l'interpréteur est lui setuid, par exemple avec perl, alors
l'exécution peut profiter du changement de droit.


Merci pour votre aide!





--
Julien

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Olivier Croquette
Le #7247031
Julien Salgado wrote, On 11/01/08 16:33:
L'implémentation est directement dans le noyau, relativement au
répertoire source du noyau les sources à regarder sont :
fs/exec.c
et
fs/binfmt_script.c



Merci!
Entretemps j'étais arrivé aux mêmes conclusions :)
http://linuxfr.org/forums/10/23583.html

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Publicité
Poster une réponse
Anonyme