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).
sumber
setuid()
/setgid()
panggil.setgid(54)
alih-alihsetgid(73)
(seperti pada/etc/groups
, grupbar
memiliki gid 54), apakah itu berfungsi?setuid()
lagi setelah melakukannya ... tapi, hmmm ... Saya pikir Anda bisa denganseteuid()
...Jawaban:
Masalahnya adalah itu
setuid
dansetgid
tidak cukup untuk memberikan semua kredensial yang dibutuhkan proses Anda. Otorisasi suatu proses bergantung padaLihat
man 7 credentials
untuk mendapatkan gambaran yang lebih rinci. Jadi, dalam kasus Anda, masalahnya adalah Anda mengatur UID dan GID dengan benar, tetapi Anda tidak mengatur kelompok pelengkap proses. Dan grupbar
memiliki GID 54, no 73 sehingga tidak dikenali sebagai grup proses Anda.Kamu seharusnya melakukan
sumber
dialout
grup dan itu bekerja pertama kali.OK, sedikit di jaring sedikit. Awalnya saya berpikir bahwa APUE akan memegang semua jawaban, tetapi salah. Dan salinan saya (edisi lama) sedang bekerja, jadi ... Bab 5 Unix dan Linux Administration Handbook terlihat menjanjikan, tetapi saya belum mendapatkannya (hanya salinan dari dua edisi pertama, juga sedang bekerja).
Sumber daya kecil yang saya temukan (google untuk "daemon writing unix") semua berbicara tentang langkah-langkah penting, seperti cara memisahkan dari tty, dll. Tapi tidak ada yang tentang UID / GID. Anehnya, bahkan koleksi HOWTO yang luas di http://tldp.org tampaknya tidak memiliki perincian. Hanya excetion adalah Jason Short Mari Tulis Linux Daemon - bagian I . Detail lengkap tentang bagaimana SUID / SGID dan semua kekacauan itu bekerja adalah Chen, Wagner dan Dean , IDID yang didemistifikasi (sebuah makalah dalam USENIX 2002). Tapi hati-hati, Linux memiliki UID tambahan, FSUID (lihat Catatan Ketidakcocokan Unix Wolter : Fungsi Pengaturan UID untuk diskusi).
Mendemonstrasikan suatu proses jelas bukan untuk menjadi lemah hati. Pertimbangan keamanan umum diberikan dalam D. Pemrograman Aman Wheeler untuk Linux dan Unix HOWTO - Membuat Perangkat Lunak Aman . Systemd berjanji untuk menyederhanakan sebagian besar dari itu (dan dengan demikian mengurangi ruang untuk kesalahan yang mengarah pada masalah keamanan), lihat manual daemon .
sumber
setuid()
, yang memungkinkan proses untuk mengubah UID-nya secara sewenang-wenang. SUID biasanya dimaksudkan untuk memungkinkan peningkatan izin (non-privilleged -> privilleged), sedangkansetuid()
hanya bisa melakukan sebaliknya.