Mengapa pengguna biasa tidak dapat `chown` file?

75

Mengapa hanya chownperintah root? Mengapa pengguna non-root menggunakan chown untuk memberikan file yang mereka miliki?

dahak
sumber
tidak dapat memahami perintah chown pertanyaan Anda dapat digunakan oleh pengguna non root juga
harish.venkat
Mungkin saya salah paham. Nah pertanyaan yang tepat dari profesor saya adalah: "Mengapa pemindahan hak dari pengguna normal tidak diizinkan dalam sistem UNIX?" ...
phleg
19
Saya pikir pertanyaan sebenarnya adalah: mengapa pengguna non-root dapat menggunakan chownuntuk memberikan file yang mereka miliki. (Saya telah melihat sistem di mana, tergantung pada konfigurasi sistem file, Anda bisa.)
Keith Thompson
terkait: askubuntu.com/questions/95985/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

96

Sebagian besar sistem unix mencegah pengguna dari "memberikan" file, yaitu, pengguna hanya dapat berjalan chownjika mereka memiliki hak pengguna dan kelompok sasaran. Karena menggunakan chownmengharuskan memiliki file atau menjadi root (pengguna tidak pernah dapat menyesuaikan file pengguna lain), hanya root yang dapat berjalan chownuntuk mengubah pemilik file menjadi pengguna lain.

Alasan pembatasan ini adalah bahwa memberikan file ke pengguna lain dapat memungkinkan hal-hal buruk terjadi secara tidak umum, tetapi masih dalam situasi yang penting. Sebagai contoh:

  • Jika suatu sistem memiliki kuota disk yang diaktifkan, Alice dapat membuat file yang dapat ditulis oleh dunia di bawah direktori yang hanya dapat diakses olehnya (jadi tidak ada orang lain yang dapat mengakses file yang dapat ditulis itu), dan kemudian jalankan chownuntuk membuat file itu dimiliki oleh pengguna lain Bill. File kemudian akan dihitung di bawah kuota disk Bill meskipun hanya Alice yang dapat menggunakan file tersebut.
  • Jika Alice memberikan file ke Bill, tidak ada jejak bahwa Bill tidak membuat file itu. Ini bisa menjadi masalah jika file berisi data ilegal atau kompromi
  • Beberapa program mengharuskan file inputnya milik pengguna tertentu untuk mengotentikasi permintaan (misalnya, file tersebut berisi beberapa instruksi yang akan dilakukan program atas nama pengguna itu). Ini biasanya bukan desain yang aman, karena bahkan jika Bill membuat file yang mengandung instruksi yang benar secara sintaksis, ia mungkin tidak bermaksud untuk mengeksekusinya pada waktu tertentu ini. Meskipun demikian, mengizinkan Alice untuk membuat file dengan konten sewenang-wenang dan menjadikannya sebagai masukan dari Bill hanya dapat memperburuk keadaan.
Gilles
sumber
3
Di pekerjaan sebelumnya, saya membangun sistem perangkat lunak yang bergantung pada ketidakmampuan untuk memberikan file. Itu menggunakan kepemilikan file untuk memverifikasi bahwa permintaan telah diajukan oleh pengguna tertentu. Itu diperiksa, selama instalasi, apakah memberikan file diizinkan, dan jika demikian menolak untuk melanjutkan.
Keith Thompson
2
Masalah lain yang lebih penting adalah bahwa pengguna dapat menyalin /bin/bash, mengaturnya, dan kemudian chownke siapa pun yang mereka inginkan. Sekarang mereka memiliki akses shell sebagai orang itu.
Patrick
18
@ Patrick chownselalu membersihkan bit setuid dan setgid.
Gilles
1
@Gilles dan untuk alasan yang baik ... jika Anda bisa menyalin shell binary di suatu tempat Anda dapat mengaksesnya, mengatur bit setuid / gid di atasnya, dan mengunyahnya ke root (atau perintah apa pun yang membuat Anda mendapatkan 6755/0: 0 perms / kepemilikan) Anda dapat memperoleh root pada sistem itu. Oh, merindukan komentar Patrick, tepatnya.
hanetzer
Ok, tetapi jika saya memiliki dir ( drwxr-xr-x ring0 ring0 .) di mana root memiliki file biasa ( -rw-r--r-- root root file), mengapa saya tidak bisa melakukannya chown ring0 filekarena memang diperbolehkan untuk melakukan, seperti ring0, cp file x ; rm file ; mv x file(dan beberapa opsional touch sometime file...)?
Dering Ø
15

Di Linux, Anda perlu kapabilitas CAP_CHOWN untuk dikunyah. root diberikan seperti itu. Rujuk ke: http://vouters.dyndns.org/tima/Linux-OpenVMS-C-Implementing_chown.html untuk penjelasan. Jika Anda bermaksud memberikan kapabilitas CAP_CHOWN, buat kode Anda dengan libcap-ng atau libcap seperti yang ditunjukkan oleh: http://vouters.dyndns.org/tima/Linux-PAM-C-Pluggable_Authentication_Modules_programming_example.html di mana Anda harus mengganti CAP_AUDIT_WRITE sederhana dengan CAP_CHOWN.

pengguna1910461
sumber
1
+1 untuk Anda tidak harus menjadi root. Karena Anda tidak perlu menjadi root lagi.
ctrl-alt-delor
1
Kadang-kadang, Anda bahkan tidak perlu CAP_CHOWN: unix.stackexchange.com/questions/399975/... Dari baca saya tentang sumber kernel, setiap implementasi sistem file bertugas memeriksa izin untuk chown. Dan tampaknya dengan NFS, izin diperiksa di sisi server. Dan jika servernya ... aneh ... maka itu mungkin.
Mike S
0

Anda dapat meluncurkan perintah tetapi itu tidak akan berhasil jika Anda tidak root. Sangat mudah: bayangkan seorang pengguna yang dapat mengubah perangkat lunak menjadi pengguna root. Itu dapat menambahkan bit setuid dan, voa, pria itu root! Jadi, penggunaannya dapat menambahkan bit dengan chmod, tetapi tidak ada kesempatan untuk mengubah pemilik file.

Dom
sumber
12
Anda tidak dapat menambahkan bit setuid pada file yang tidak Anda miliki, dan implementasi yang memungkinkan pemberian file menghapus bit setuid.
Gilles
Saya pikir inti dari jawaban Dom adalah ini: Bayangkan jika Anda bisa. Maka akan ada masalah. Maksud Anda, bahwa Anda tidak bisa, benar. Tetapi OP bertanya "mengapa?" Menghapus bit setuid adalah fitur keamanan lain yang lagi-lagi menimbulkan pertanyaan "mengapa?" Yang kemudian akan saya rujuk pada jawaban Dom: JIKA pengguna bisa chown, dan JIKA pengguna bisa setuid, maka kombo itu akan menjadi bencana. Saya pikir dia membuat poin yang baik, bahkan jika dia kehilangan sedikit.
Mike S