Ich nehme an, dass eine ausführbare Datei mit gesetztem SetUID-Bit als ihr Besitzer ausgeführt werden sollte, aber ich kann das nicht wirklich reproduzieren. Ich habe Folgendes versucht.
$ Katze vorbereiten.sh cp /bin/bash . chown root.root bash chmod 4770 bash # Verifiziert $ sudo sh vorbereiten.sh $ ./bash $ Ich würde -u 1000 $ beenden $
$ Katze test.c #include<stdio.h> #include<unistd.h> int main(){ printf("%d,%d\n", getuid(), geteuid()); gebe 0 zurück; } $ gcc -o test test.c $ chmod 4770 test # Verifiziert $ sudo chown root.root-Test $ ./Prüfung 1000,1000 $ # Warum???
Jedoch
$ su # ./bash # Ich würde -u 0 # ./prüfen 0,0 # Ausfahrt # Ausfahrt $
Hinweis: Für den Einhängepunkt ist kein nosuid
„NOR“ noexec
festgelegt.
Kann jemand erklären, warum es unter Ubuntu 16.04 LTS nicht funktioniert?
Antwort1
Für die kompilierte ausführbare Datei vonman 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.
Bei mir funktioniert es, wenn ich die Reihenfolge chown
und umkehre:chmod
$ 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
Antwort2
In Ihrem ersten Fall ist es Bash, das nicht gerne als Setuid ausgeführt wird.
Wenn Bash mit einer effektiven Benutzer- (Gruppen-)ID gestartet wird, die ungleich der tatsächlichen Benutzer- (Gruppen-)ID ist, ..., und die effektive Benutzer-ID auf die tatsächliche Benutzer-ID gesetzt wird.
Sehen:Bash-Handbuch zu Startdateien, AuchDas Setuid-Bit scheint keine Auswirkung auf Bash zu haben.
Im zweiten Fall ist es die Reihenfolge chmod
, chown
die zählt, wie Muru bereitsantwortete. Durch das Ändern des Besitzers wird das Setuid-Bit zurückgesetzt.
Antwort3
Es könnte auch sein, dass das Dateisystem, das die Test-Programmdatei enthält, mit demnosuid
Möglichkeit; Ich habe gehört, dass neuere Distributionen dies standardmäßig für tun /tmp
, und es gibt gute Argumente dafür, es /home
auch auf anzuwenden. nosuid
bewirkt, dass der Kernel die Setuid- und Setgid-Bits auf ignoriertalleausführbare Dateien im Dateisystem. (Das andere, was passiert, wenn Sie eineVerzeichnissetgid ist davon nicht betroffen.)