Bagaimana cara kerja internal sudo?

74

Bagaimana cara sudokerjanya secara internal? Bagaimana mungkin bisa menjadi root tanpa kata sandi root, tidak seperti itu su? Syscalls apa, dll. Yang terlibat dalam proses? Apakah ini bukan celah keamanan yang menganga di Linux (mis. Mengapa saya tidak bisa mengkompilasi banyak-patched sudoyang hanya melakukan apa pun yang biasa sudodilakukan, tetapi tidak meminta kata sandi pengguna yang tidak berhak)?

Saya telah membaca login dan su internal . Saya juga telah membaca Bagaimana sudo dimaksudkan untuk digunakan? tetapi meskipun judulnya, mereka terutama berurusan dengan perbedaan antara sudan sudo.

strugee
sumber

Jawaban:

80

Jika Anda melihat pada executable sudo:

$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun  3  2011 /usr/bin/sudo

Anda akan melihat bahwa itu membawa bit izin ---s--x--x. Ini dapat dirinci sebagai berikut:

-|--s|--x|--x
-      - first dash denotes if a directory or a file ("d" = dir, "-" = file)  
--s    - only the setuid bit is enabled for user who owns file
--x    - only the group execute bit is enabled
--x    - only the other execute bit is enabled

Jadi ketika suatu program mengaktifkan bit setuid-nya (juga disebut SUID) itu berarti bahwa ketika seseorang menjalankan program ini, ia akan berjalan dengan kredensial pengguna yang memiliki file tersebut, alias. root dalam hal ini.

Contoh

Jika saya menjalankan perintah berikut sebagai user saml:

$ whoami
saml

$ sudo su -
[sudo] password for saml: 

Anda akan melihat bahwa eksekusi sudosebenarnya berjalan sebagai root:

$ ps -eaf|grep sudo
root     20399  2353  0 05:07 pts/13   00:00:00 sudo su -

mekanisme setuid

Jika Anda penasaran bagaimana SUID bekerja lihatlah man setuid. Berikut adalah kutipan dari halaman manual yang menjelaskan lebih baik daripada yang saya bisa:

setuid () mengatur ID pengguna yang efektif dari proses panggilan. Jika UID efektif dari pemanggil adalah root, UID asli dan set-user-ID yang disimpan juga disetel. Di Linux, setuid () diimplementasikan seperti versi POSIX dengan fitur _POSIX_SAVED_IDS. Hal ini memungkinkan program set-user-ID (selain root) untuk menghapus semua hak pengguna, melakukan pekerjaan yang tidak diistimewakan, dan kemudian menggunakan kembali ID pengguna efektif asli dengan cara yang aman.

Jika pengguna root atau programnya adalah set-user-ID-root, perhatian khusus harus diambil. Fungsi setuid () memeriksa ID pengguna yang efektif dari penelepon dan jika itu adalah pengguna super, semua ID pengguna yang terkait dengan proses diatur ke uid. Setelah ini terjadi, tidak mungkin bagi program untuk mendapatkan kembali hak root.

Konsep kunci di sini adalah bahwa program memiliki userid nyata (UID) dan yang efektif (EUID). Setuid sedang mengatur userid efektif (EUID) ketika bit ini diaktifkan.

Jadi dari perspektif kernel diketahui bahwa dalam contoh kita, samlmasih merupakan pemilik asli (UID), tetapi EUID telah ditetapkan dengan siapa pun adalah pemilik dari executable.

setgid

Saya juga harus menyebutkan bahwa ketika kita merombak izin pada perintah sudo, kelompok bit kedua adalah untuk izin grup. Bit grup juga memiliki sesuatu yang mirip dengan setuid yang disebut set group id (alias. Setgid, SGID). Ini melakukan hal yang sama seperti SUID kecuali menjalankan proses dengan kredensial grup alih-alih kredensial pemilik.

Referensi

slm
sumber
4
Anda harus menggunakan sudo -sbukan sudo sukarena itu penggunaan yang tidak berguna su. :)
Totor
4

sudoBiner yang sebenarnya adalah root setuid , dan Anda tidak bisa hanya akan file menjadi ada yang ditetapkan dengan cara ini.

setuid dan setgid (kependekan dari "set ID pengguna setelah eksekusi" dan "set ID grup setelah eksekusi", masing-masing) [1] adalah tanda bendera hak akses Unix yang memungkinkan pengguna untuk menjalankan file yang dapat dieksekusi dengan izin masing-masing pemilik atau grup yang dapat dieksekusi dan untuk mengubah perilaku dalam direktori.

Ignacio Vazquez-Abrams
sumber
oke, itu menjawab sebagian dari pertanyaan saya. Jika Anda ingin menguraikan bagaimana sudo menggunakan bit ini, dan sedikit lebih banyak tentang apa yang dilakukan bit ini, saya akan senang menerima jawaban ini
strugee
2

Untuk menjawab bagian tentang syscalls yang tampaknya tidak disentuh oleh siapa pun, salah satu syscalls penting adalah setresuid () atau setresgid (). Saya yakin ada yang lain, tetapi 2 ini sepertinya cukup spesifik untuk setuid / sudo.

Gregg Leventhal
sumber