Mengapa privasi diperlukan untuk setgid () ke grup tambahan

8

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/ sgmisalnya 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?

William Hay
sumber
1
Juga tidak yakin. Perhatikan bahwa Anda dapat chgrp file ke salah satu grup tambahan Anda, jadi jika Anda memiliki akses tulis ke area tanpa noexec, nosuid, Anda dapat mengatasi batasan itu (dengan membuat salinan /usr/bin/envdengan izin setgid).
Stéphane Chazelas
Perintah newgrp sudah melakukan ini untuk saya AFAICT tetapi menelurkan program eksternal tidak selalu apa yang ingin dilakukan.
William Hay
Catatan yang newgrp/sgmerujuk pada basis data akun, bukan daftar proses kelompok pelengkap.
Stéphane Chazelas
Jika gid Anda tidak juga ada dalam daftar id tambahan Anda, maka mengizinkan 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).
Stéphane Chazelas

Jawaban:

3

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.

mtk
sumber
Catatan: @mtk adalah penulis The Linux Programming Interface .
Stéphane Chazelas
Gid efektif menentukan kepemilikan grup atas file baru. Tetapi kemudian Anda dapat mengubah grup itu menjadi salah satu dari gids tambahan Anda sesudahnya (dan juga memberikan bit setgid yang memungkinkan proses Anda untuk secara efektif melakukan setgid ()). Jadi sepertinya alasannya agak lemah.
Stéphane Chazelas
@ StéphaneChazelas: setuju, agak lemah. Di OTOH, itu sekarang proses dua langkah, yang (dan saya sampai di sini) memiliki potensi untuk balapan aneh. Tapi, selain dari kasus itu, ada yang lain yang saya sebutkan di atas. Saya tidak tahu alasan pasti apa yang ada untuk keputusan desain ini. Mungkin itu akses (2), karena itu adalah bagian kuno dari API. Banyak yang lain baru tiba kemudian (atau khusus Linux) atau (saya kira) tidak hadir di BSD ketika GID tambahan ditambahkan. Atau, mungkin, itu hanya tentang menjaga perilaku sejarah; Saya melihat Anda menambahkan poin itu sebagai jawaban.
mtk
3

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 dengan sg/ newgrpsemua 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/ newgrpyang hanya dengan / hanya memungkinkan untuk mengubah ke grup yang didefinisikan dalam basis data pengguna, yang tidak harus sama dengan daftar isi tambahan dari proses).

cp /usr/bin/env .
chgrp any-sup-group env
chmod g+s ./env

Dan setelah dieksekusi env, egid Anda beralih ke any-sup-group.

Stéphane Chazelas
sumber