Je suppose qu'un fichier exécutable avec l'ensemble de bits SetUID devrait fonctionner en tant que propriétaire, mais je ne peux pas vraiment le reproduire. J'ai essayé ce qui suit.
$ cat prepare.sh cp / bin / bash. chown root.root bash chmod 4770 bash # Vérifié $ sudo sh prepare.sh $ ./bash $ id -u 1000 $ exit $
$ cat test.c #include <stdio.h> #include <unistd.h> int main(){ printf ("% d,% d \ n", getuid (), geteuid ()); retourner 0; } $ gcc -o test test.c $ chmod 4770 test # Vérifié $ sudo chown root.root test $ ./test 1000,1000 $ # Pourquoi ???
toutefois
$ su # ./bash # id -u 0 # ./test 0,0 # sortie # sortie $
Remarque: Le point de montage n'a ni nosuid
ni noexec
défini.
Quelqu'un peut-il expliquer pourquoi il ne fonctionne pas sur Ubuntu 16.04 LTS?
sudo
? Il y a cependant un bogue ou une faute de frappe, ilchmod
manque un nom de fichier.Réponses:
Pour l'exécutable compilé, à partir de
man 2 chown
:Inverser le
chown
et l'chmod
ordre fonctionne pour moi:la source
Dans votre premier cas, c'est Bash qui n'aime pas être exécuté en tant que setuid.
Voir: le manuel de Bash sur les fichiers de démarrage , le bit Setuid semble également n'avoir aucun effet sur bash .
Dans le second cas, c'est l'ordre du
chmod
etchown
qui compte, comme Muru l'a déjà répondu . Le changement de propriétaire réinitialise le bit setuid.la source
Il se peut également que le système de fichiers contenant l'exécutable de test ait été monté avec l'
nosuid
option ; J'ai entendu dire que les nouvelles distributions le feraient par défaut pour/tmp
, et il y a de bons arguments pour l'appliquer/home
également.nosuid
oblige le noyau à ignorer les bits setuid et setgid sur tous les exécutables du système de fichiers. (La chose indépendante qui se produit lorsque vous créez un répertoire setgid n'est pas affectée.)la source