SetUID-Bit funktioniert nicht in Ubuntu?

8

Ich nehme an, dass eine ausführbare Datei mit gesetztem SetUID-Bit als Eigentümer ausgeführt werden sollte, aber ich kann sie nicht wirklich reproduzieren. Ich habe folgendes versucht.

$ cat prepare.sh
cp / bin / bash.
chown root.root bash
chmod 4770 bash # Verifiziert
$ 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 ());
    return 0;
}}
$ gcc -o test test.c
$ chmod 4770 test # Verifiziert
$ sudo chown root.root test
$ ./test
1000,1000
$ # Warum ???

jedoch

$ su
# ./bash
# id -u
0
# ./Prüfung
0,0
# Ausfahrt
# Ausfahrt
$

Hinweis: Der Einhängepunkt ist weder festgelegt nosuidnoch noexecfestgelegt.
Kann jemand erklären, warum es unter Ubuntu 16.04 LTS nicht funktioniert?

iBug
quelle
3
Mögliches Duplikat von Allow setuid auf Shell-Skripten
Kusalananda
3
@Kusalananda es ist kein Skript.
Enzotib
4
Das Drehbuch ist etwas verwirrend, aber es ist nur ein roter Hering. Ich nehme an, es ist da, um zwei Verwendungen von sudo? Es gibt einen Fehler oder einen Tippfehler, dem chmodjedoch ein Dateiname fehlt.
Ilkkachu

Antworten:

15

Für die kompilierte ausführbare Datei von 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.

Das Umkehren der chownund chmodReihenfolge funktioniert für mich:

$ 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
quelle
15

In Ihrem ersten Fall ist es Bash, der nicht gerne als Setuid ausgeführt wird.

Wenn Bash mit einer effektiven Benutzer- (Gruppen-) ID gestartet wird, die nicht der tatsächlichen Benutzer- (Gruppen-) ID entspricht, ... und die effektive Benutzer-ID auf die reale Benutzer-ID gesetzt wird.

Siehe: Bashs Handbuch zu Startdateien , auch das Setuid-Bit scheint keine Auswirkung auf Bash zu haben .

Im zweiten Fall ist es die Reihenfolge von chmodund chowndas ist wichtig, wie Muru bereits geantwortet hat . Durch Ändern des Besitzers wird das Setuid-Bit zurückgesetzt.

ilkkachu
quelle
Oh, ich habe nicht bemerkt, dass das OP das Skript-Setup als Setuid-Bash verwendet.
Muru
5

Es kann auch sein, dass das Dateisystem, das die ausführbare Testdatei enthält, mit der nosuidOption bereitgestellt wurde. Ich habe gehört, dass neuere Distributionen dies standardmäßig für tun /tmp, und es gibt gute Argumente, um es auch anzuwenden /home. nosuidDer Kernel ignoriert die Bits setuid und setgid für alle ausführbaren Dateien im Dateisystem. (Die nicht verwandte Sache, die passiert, wenn Sie eine Verzeichnis- Setgid erstellen, bleibt davon unberührt.)

zwol
quelle