SetUID bit tidak berfungsi di Ubuntu?

8

Saya kira file yang dapat dieksekusi dengan set bit SetUID harus berjalan sebagai pemiliknya tetapi saya tidak dapat mereproduksinya. Saya mencoba yang berikut ini.

$ cat prep.sh
cp / bin / bash.
chown root.root bash
chmod 4770 bash # Terverifikasi
$ sudo sh prep.sh
$ ./bash
$ id -u
1000
$ keluar
$
$ cat test.c
#termasuk <stdio.h>
#termasuk <unistd.h>
int main () {
    printf ("% d,% d \ n", getuid (), geteuid ());
    return 0;
}
$ gcc -o test test.c
$ chmod 4770 test # Terverifikasi
$ sudo chown root.root test
$ ./test
1000.1000
$ # Kenapa ???

Namun

$ su
# ./bash
# id -u
0
# ./uji
0,0
# keluar
# keluar
$

Catatan: Titik pemasangan tidak memiliki nosuidatau noexecmengatur.
Adakah yang bisa menjelaskan mengapa itu gagal bekerja di Ubuntu 16.04 LTS?

iBug
sumber
3
Kemungkinan duplikat Izinkan setuid pada skrip shell
Kusalananda
3
@ Kusalananda itu bukan skrip.
enzotib
4
Naskahnya agak membingungkan, tapi itu hanya herring merah. Saya kira itu ada di sana untuk menghemat dua penggunaan sudo? Ada bug atau salah ketik di dalamnya, meskipun, chmodtidak ada nama file.
ilkkachu

Jawaban:

15

Untuk executable yang dikompilasi, dari 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.

Membalikkan chowndan chmodpesanan berfungsi untuk saya:

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

Dalam kasus pertama Anda, Bash yang tidak suka dijalankan sebagai setuid.

Jika Bash dimulai dengan id pengguna (grup) yang efektif tidak sama dengan id pengguna (grup) asli, ..., dan id pengguna efektif diatur ke id pengguna sebenarnya.

Lihat: manual Bash pada file startup , juga bit Setuid tampaknya tidak berpengaruh pada bash .

Dalam kasus kedua, itu urutan chmoddan chownyang penting, karena muru sudah menjawab . Mengubah pemilik akan mereset bit setuid.

ilkkachu
sumber
Oh, saya tidak melihat OP menggunakan skrip setup setash bash.
muru
5

Bisa juga bahwa sistem file yang berisi tes yang dapat dieksekusi dipasang dengan nosuidopsi ; Saya telah mendengar bahwa distribusi yang lebih baru akan melakukan ini secara default /tmp, dan ada argumen yang bagus untuk menerapkannya /homejuga. nosuidmenyebabkan kernel mengabaikan bit setuid dan setgid pada semua file executable dalam sistem file. (Hal yang tidak terkait yang terjadi ketika Anda membuat direktori setgid tidak terpengaruh.)

zwol
sumber