Proses yang menghilangkan hak istimewa melalui setuid()
dan setgid()
tampaknya tidak mewarisi keanggotaan grup dari uid / gid yang mereka tetapkan.
Saya memiliki proses server yang harus dijalankan sebagai root untuk membuka port istimewa; setelah itu de-meningkat ke uid / gid non-privilleged tertentu, 1 - misalnya, bahwa pengguna foo
(UID 73). Pengguna foo
adalah anggota grup bar
:
> cat /etc/group | grep bar
bar:x:54:foo
Karenanya jika saya login sebagai foo
, saya dapat membaca file /test.txt
dengan karakteristik ini:
> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt
Namun, program C berikut (kompilasi std=gnu99
), saat menjalankan root:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main (void) {
setgid(73);
setuid(73);
int fd = open("/test.txt", O_RDONLY);
fprintf(stderr,"%d\n", fd);
return 0;
}
Selalu melaporkan, Izin ditolak . Saya membayangkan ini ada hubungannya dengan itu menjadi proses non-login, tapi itu semacam hamstrings cara izin seharusnya bekerja.
1. Yang sering menjadi SOP untuk server, dan saya pikir pasti ada jalan keluarnya ketika saya menemukan laporan seseorang yang melakukannya dengan apache - apache telah ditambahkan ke grup audio dan ternyata kemudian dapat menggunakan sistem suara. Tentu saja, ini kemungkinan terjadi dalam percabangan dan bukan proses asli, tetapi kenyataannya kasusnya sama dalam konteks saya (ini adalah proses anak yang bercabang setelah panggilan setuid).
setgid(54)
alih-alih setgid(73)
(seperti pada /etc/groups
, grup bar
memiliki gid 54), apakah itu berfungsi?
setuid()
lagi setelah melakukannya ... tapi, hmmm ... Saya pikir Anda bisa dengan seteuid()
...
setuid()
/setgid()
panggil.