Berbagai set*gid()
panggilan sistem memerlukan hak istimewa untuk mengubah grup kecuali dalam beberapa kasus. Mengubah grup utama ke salah satu grup tambahan proses tampaknya tidak menjadi salah satu dari mereka yang berarti perintah newgrp
/ sg
misalnya perlu meningkatkan hak istimewa untuk beralih grup utama.
Apakah ada alasan mengapa setgid()
/ setegid()
/ setregid()
/ setfsgid()
tidak mengizinkan beralih ke grup tambahan tanpa privasi? Jika demikian apa alasannya?
security
group
system-calls
William Hay
sumber
sumber
/usr/bin/env
dengan izin setgid).newgrp/sg
merujuk pada basis data akun, bukan daftar proses kelompok pelengkap.setgid()
akan memungkinkan Anda untuk meninggalkan keanggotaan grup (yang akan menjadi masalah keamanan), tetapi sekali lagi Anda juga bisa melakukannya dengan trik yang dapat dieksekusi setgid yang sama seperti di atas, dan gid Anda biasanya juga ada dalam daftar tambahan Anda (initgroups(3)
mengambil argumen gid hanya untuk itu).Jawaban:
Tentu saja, teka-teki mendasar di sini adalah bahwa pemeriksaan izin sistem file didasarkan pada kombinasi (UID efektif dan) GID efektif dan GID pelengkap. Jadi, dari sudut pandang pemeriksaan izin file, GID efektif setara dengan GID pelengkap, yang mengarah ke pertanyaan OP. (Secara sepintas: jika kita berbicara tentang Linux, sebenarnya filesystem UID / GID yang digunakan dalam pemeriksaan izin filesystem, daripada UID dan GID yang efektif, tetapi ID yang sebelumnya hampir selalu memiliki nilai yang sama dengan ID yang terakhir. )
Jadi, harus ada beberapa kasus di mana GID nyata / efektif / diselamatkan tidak setara dengan GID pelengkap. (Saya mengelompokkan GID yang nyata / efektif / tersimpan-bersama-sama, karena aturan izin * gid () yang normal mengatakan bahwa proses yang tidak terprivasi dapat mengubah salah satu GID tersebut dengan nilai yang sama dengan salah satu dari dua lainnya.)
Dan memang, ada beberapa kasus seperti itu. akses (2) melakukan pemeriksaan berdasarkan ID pengguna nyata dan ID grup. Jika pengguna yang tidak memiliki hak mampu mengubah ID grup sebenarnya menjadi sama dengan salah satu GID tambahan yang bukan GID set efektif atau disimpan, maka perilaku akses (2) dapat dimanipulasi.
Ada beberapa kasus lainnya. Lihat halaman manual Linux mkdir (2) , untuk contoh. Bergantung pada apakah bit mode set-GID diatur pada direktori induk, file baru yang dibuat dalam direktori mengambil kepemilikan grupnya dari GID efektif proses pembuatan. Sekali lagi, jika suatu proses yang tidak terjangkau dapat mengubah GID efektifnya menjadi sama dengan salah satu GID pelengkapnya, ia dapat memanipulasi kepemilikan grup atas file-file baru dengan cara yang tidak terduga. Komentar serupa berlaku untuk mknod (2) dan semget panggilan Sistem V IPC (2), shmget (2), dan msgget (2).
Ada juga beberapa kasus khusus Linux di mana GID yang sebenarnya / efektif / disimpan tidak setara dengan GID pelengkap. Lihat process_vm_readv (2) dan prlimit (2), misalnya.
sumber
Saya pikir alasannya terutama historis. Kelompok tambahan tidak ditambahkan sampai 4.2BSD (sekitar 1983). Sebelum itu, Anda hanya memiliki cairan dan cairan yang nyata dan efektif.
Perilaku untuk setuid / setgid sepenuhnya simetris dan tidak punya alasan untuk tidak. Anda akan mengganti pengguna dengan
su
, dan grup dengansg
/newgrp
semua executable setuid. Informasi tentang keanggotaan grup pengguna hanya berada di database pengguna, bukan dalam atribut proses.Dan antarmuka setuid / setgid tidak berubah ketika tambahan gids ditambahkan.
Secara teknis sekarang, jika Anda memiliki akses tulis ke sistem file (di mana eksekusi dan setuid / setgid tidak dinonaktifkan), Anda masih dapat mengatur ID pengguna yang efektif atau nyata ke salah satu dari gids tambahan Anda (tanpa harus menggunakan
sg
/newgrp
yang hanya dengan / hanya memungkinkan untuk mengubah ke grup yang didefinisikan dalam basis data pengguna, yang tidak harus sama dengan daftar isi tambahan dari proses).Dan setelah dieksekusi
env
, egid Anda beralih keany-sup-group
.sumber