Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Bit setuid sur les scripts

1 view
Skip to first unread message

Olivier Croquette

unread,
Dec 20, 2007, 3:37:39 PM12/20/07
to
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 : moderate...@efrei.fr
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.

Julien Salgado

unread,
Jan 11, 2008, 10:33:37 AM1/11/08
to
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

Olivier Croquette

unread,
Jan 12, 2008, 3:28:05 PM1/12/08
to
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

0 new messages