Le bit SetUID ne fonctionne pas dans Ubuntu?

8

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 nosuidni noexecdéfini.
Quelqu'un peut-il expliquer pourquoi il ne fonctionne pas sur Ubuntu 16.04 LTS?

iBug
la source
3
Copie
3
@Kusalananda ce n'est pas un script.
enzotib
4
Le script est un peu déroutant, mais ce n'est qu'un hareng rouge. Je suppose que c'est là pour sauver deux utilisations de sudo? Il y a cependant un bogue ou une faute de frappe, il chmodmanque un nom de fichier.
ilkkachu

Réponses:

15

Pour l'exécutable compilé, à partir de man 2 chown:

When the owner or group  of  an  executable  file  are  changed  by  an
unprivileged user the S_ISUID and S_ISGID mode bits are cleared.  POSIX
does not specify whether this also should happen  when  root  does  the
chown();  the Linux behavior depends on the kernel version.

Inverser le chownet l' chmodordre fonctionne pour moi:

$ sudo chmod 4770 foo
$ sudo chown root:root foo
$ stat foo
  File: 'foo'
  Size: 8712        Blocks: 24         IO Block: 4096   regular file
Device: 801h/2049d  Inode: 967977      Links: 1
Access: (0770/-rwxrwx---)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-04-18 15:15:15.074425000 +0900
Modify: 2017-04-18 15:15:15.074425000 +0900
Change: 2017-04-18 15:15:33.683725000 +0900
 Birth: -
$ sudo chmod 4777 foo
$ ./foo
1000,0
muru
la source
15

Dans votre premier cas, c'est Bash qui n'aime pas être exécuté en tant que setuid.

Si Bash est démarré avec l'ID utilisateur (groupe) effectif différent de l'ID utilisateur réel (groupe), ..., et que l'ID utilisateur effectif est défini sur l'ID utilisateur réel.

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 chmodet chownqui compte, comme Muru l'a déjà répondu . Le changement de propriétaire réinitialise le bit setuid.

ilkkachu
la source
Oh, je n'ai pas remarqué que l'OP utilisait la configuration du script comme bash setuid.
muru
5

Il se peut également que le système de fichiers contenant l'exécutable de test ait été monté avec l' nosuidoption ; 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. nosuidoblige 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.)

zwol
la source