Mengapa saya tidak bisa menjalankan shutdown ketika izinnya rwxr-xr-x?

34

Saya masuk /sbindan saya melihat bahwa shutdownada izin rwxr-xr-x. Bukankah ini berarti bahwa siapa pun dapat menjalankannya?

Korgan Rivera
sumber
1
apa perintah yang Anda jalankan dan kesalahan apa yang Anda dapatkan?
slayedbylucifer
Saya pikir dia berbicara tentang shutdownperintah.
Vinz
Saya berlari ./shutdown +30. Saya mendapatkan "shutdown: harus root". Namun, jika izin mengatakan bahwa ada yang bisa mengeksekusi, mengapa saya harus root?
Korgan Rivera
Saya menduga, bahwa siapa pun dapat mematikan mesin. Sama seperti pada GUI, siapa pun dapat mematikannya juga. Tetapi jika Anda mengatakan bahwa Anda harus menjadi root, maka saya tidak tahu. Pertanyaan yang bagus.
Kevdog777
4
@ Kevdog777: Pada GUI PolicyKit mengelola ini. Ini adalah daemon dengan hak akses root yang akan memeriksa apakah Anda diizinkan untuk menggunakannya shutdown.
Vinz

Jawaban:

76

Siapa pun dapat mengeksekusi shutdown, tetapi memicu shutdown sistem memerlukan hak akses root. Tetapi shutdownbukan setuid, dan hanya root yang bisa menjalankannya dengan sukses . The shutdownProgram ini cukup bagus untuk memeriksa hak Anda dan membiarkan Anda tahu jika ada masalah, tetapi bahkan jika itu naif mencoba sistem shutdown, tidak akan terjadi.

GLENDOWER: Saya bisa memanggil roh dari dalam yang jahat.
HOTSPUR: Kenapa, saya juga bisa, atau bisa juga siapa saja; Tetapi apakah mereka akan datang ketika Anda memanggil mereka?
(dari Henry IV)

shutdowntidak berbeda dari /bin/rm. Semua orang dapat menjalankannya, tetapi pengguna biasa tidak dapat menghapus /etc, atau direktori home pengguna lain.

Khususnya: Hanya proses yang berjalan dengan hak akses root (UID 0 efektif) yang dapat mengarahkan sistem init untuk menghentikan layanan sistem, menghentikan semua proses pengguna, dan mengeluarkan panggilan sistem yang benar-benar menghentikan mesin. (Jika shutdownitu setuid, itu akan berjalan sebagai root tidak peduli siapa yang memanggilnya, tetapi tidak.)

Bagaimana dengan menelepon shutdowndari GUI, mis. Dengan control-alt-del? Sangat penting untuk menyadari bahwa dalam hal ini, shutdowndimulai langsung oleh initdan berjalan dengan hak akses root. Jadi setiap orang yang berjalan ke konsol berpotensi mematikannya. Jika ini tidak diinginkan, control-alt-delete akan benar-benar berjalan shutdown -a. (Lihat dokumentasi yang dikutip @ some1 dalam jawaban mereka). Itu memberi tahu shutdownuntuk memeriksa apakah pengguna yang saat ini login diizinkan untuk menjalankannya. Tetapi ini hanya relevan karena shutdowndijalankan sebagai root dalam skenario ini.

alexis
sumber
2
Klarifikasi: Siapa pun dapat menjalankan program shutdown, tetapi program itu tidak dapat memicu shutdown sistem kecuali jika pengguna saat ini memiliki hak akses root. Kanan?
LarsH
1
Cukup banyak. Program dijalankan dengan hak istimewa dari pengguna yang memohon, kecuali mereka setuid. Mematikan sistem membutuhkan hak akses root, jadi Anda tidak dapat menulis program sendiri untuk melakukannya, (kecuali dengan mengeksploitasi celah keamanan, dll.).
alexis
Apa yang dimaksud dengan "shutdown bukan setuid"?
Iain Samuel McLean Penatua
1
@ Sebelumnya, program biasanya dijalankan dengan izin dari pengguna yang memanggil mereka. Ini juga terjadi dengan shutdown. Program setuid dijalankan dengan izin dari pengguna yang memiliki executable. Misalnya, /etc/passwdberjalan dengan izin root untuk memungkinkan Anda memodifikasi file kata sandi. Lihat halaman manual untuk chmod.
alexis
Itu seharusnya " /usr/bin/passwdberjalan dengan izin root"! /etc/passwdtidak dapat dieksekusi (ini adalah "file kata sandi" yang sedang dimodifikasi).
alexis
15

Biner shutdownitu sendiri memeriksa apakah UID Anda adalah 0.

Lihat output strace dari:

strace /sbin/shutdown -r -h now
...
...
geteuid()                               = 10001
setuid(10001)                           = 0
getuid()                                = 10001
write(2, "shutdown: Need to be root\n", 26shutdown: Need to be root
) = 26
exit_group(1)                           = ?
kekacauan
sumber
4
+1 untuk menunjukkan penggunaan strace ... ini berguna. Namun saya tidak melihat bagaimana jejak ini menunjukkan bahwa shutdownmemeriksa bahwa UID Anda adalah 0.
LarsH
1
Anda tidak akan melihat itu di output strace karena hanya melaporkan panggilan sistem. Anda dapat menyimpulkan bahwa ketika getuid diikuti dengan menulis pesan kesalahan yang mirip dengan kode if(getuid() != 0) printf("Need to be root");. Yang sebenarnya kode sumber menunjukkannya.
msw
5

Iya nih ! Semua orang dapat menjalankan perintah itu. Seperti yang Anda katakan, Anda dapat menjalankannya tetapi Anda dihadapkan dengan pesan "Need to be root", bukan a permission denied. The shutdownperintah cek Anda UIDuntuk melihat apakah Anda akar sedang, atau tidak.

Vinz
sumber
-1

Tampaknya shutdown akan memeriksa daftar akses jika Anda menandainya dengan -a:

ACCESS CONTROL
       shutdown can be called from init(8) when the magic keys CTRL-ALT-DEL are pressed, by creating an appropriate entry in /etc/inittab. This means that every‐
       one who has physical access to the console keyboard can shut the system down. To prevent this, shutdown can check to see if an authorized user  is  logged
       in  on  one of the virtual consoles. If shutdown is called with the -a argument (add this to the invocation of shutdown in /etc/inittab), it checks to see
       if the file /etc/shutdown.allow is present.  It then compares the login names in that file with the list of people that are logged in on a virtual console
       (from /var/run/utmp). Only if one of those authorized users or root is logged in, it will proceed. Otherwise it will write the message

       shutdown: no authorized users logged in

       to  the  (physical)  system  console.  The  format  of  /etc/shutdown.allow is one user name per line. Empty lines and comment lines (prefixed by a #) are
       allowed. Currently there is a limit of 32 users in this file.

Karena Anda saat ini memanggilnya tanpa tanda -a, itu default untuk mengizinkan root shutdown saja.

Jika Anda ingin pengguna tambahan dapat menjalankan perintah, konfigurasikan file itu dan gunakan bendera.

Why can't I execute shutdown when the permission is rwxr-xr-x?

Bit izin tidak harus mengecualikan kontrol akses berdasarkan pada pengguna atau grup.

seseorang1
sumber
Memanggilnya dengan -adari commandline tidak akan membuat perbedaan: shutdown -amasih harus dieksekusi dengan izin root (yang initmemasok pada control-alt-del).
alexis