Retourner aux forums || Retourner au forum Linux.general

Linux.general : Bit setuid sur les scripts

Posté par taz008 () le 30 novembre 2007
0
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!

> Lire le message (3 commentaires, moyenne: 2,7).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Ce lien ...

Posté par Cheneson Cyril () le 30/11/2007 à 23:20. (lien). Évalué à 4.

... devrait t' interesser:
http://xgarreau.org/aide/admin/suscript/

@++

Noyau

Posté par Obsidian () le 01/12/2007 à 10:44. (lien). Évalué à 2.

Question: où la limitation est-elle implémentée? Dans le shell? Dans la glib? dans le noyau?


Dans le noyau.
$ man execve :

NOTES
SUID and SGID processes can not be ptrace()d.

Linux ignores the SUID and SGID bits on scripts.


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 taz008 () le 01/12/2007 à 11:46. (lien). Évalué à 2.

    Merci de ta réponse.

    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.

Revenir en haut de page || Retourner aux forums || Retourner au forum Linux.general