Mengapa executable di eg / usr / sbin dapat ditulis oleh root?

31

Bisakah Anda jelaskan mengapa file kompilasi biner (misalnya, /usr/sbin) memiliki izin menulis untuk rootpengguna?

Bagi saya, ini dikompilasi. Berarti penulisan langsung tidak ada gunanya dan dapat memaparkan file ke beberapa masalah keamanan.

Sebuah skrip (misalnya bashfile) dapat ditulisi karena pada dasarnya adalah file teks, tetapi mengapa itu sama untuk file yang dikompilasi di mana tidak ada tulisan yang sebenarnya diperlukan sejauh yang saya tahu?

Terima kasih sebelumnya atas tanggapan Anda.

t1m0th33
sumber
6
Hanya untuk memperjelas, Anda bertanya-tanya mengapa pengguna rootmemiliki izin menulis ke file biner? Jika tidak ada yang lain itu akan membantu ketika meningkatkan paket itu.
Eric Renouf
5
Perhatikan bahwa ironisnya file biner adalah satu-satunya file yang biasanya kita tulis / edit langsung pada disk. Kami tidak dapat melakukannya dengan file teks seperti skrip karena modifikasi teks melibatkan tidak menulis ke file tetapi menambahkan byte tambahan di tengah file atau menghapus byte di tengah file. Ini tidak mungkin dilakukan dengan fseek fwrite. Jadi untuk file teks biasanya kita membaca ke RAM kemudian menghapus file lama dan menulis isi RAM ke disk (mis. Kita menimpa). Juga, ketika Anda menginstal, memindahkan atau mengganti file executable, Anda menulis ke disk sehingga Anda perlu izin menulis.
Slebetman
1
@slebetman: Anda dapat langsung mengedit file teks. Misalnya, buka file, perluas, memori peta, gunakan memmove()untuk memindahkan bagian terakhir ke ujung dan membuka lubang, kemudian masukkan teks baru ke dalam lubang. Atau Anda dapat menggunakan serangkaian pread()/ pwrite()untuk melakukan hal yang sama.
Zan Lynx
6
@EricRenouf Sebenarnya, izin menulis pada file biner tidak diperlukan untuk memutakhirkan paket yang berisi itu. Pada peningkatan paket, biner lama tidak ditulis untuk; sebenarnya ini tidak mungkin jika biner sedang berjalan (cari ETXTBSY). Sebagai gantinya, biner lama dihapus , dan biner baru ditulis ke file baru dengan nama yang sama. Menghapus file tidak memerlukan izin tulis padanya, hanya pada direktori yang berisi (yaitu, /usr/sbin/).
marcelm
1
@marcelm: Sebenarnya Anda tidak hanya menggunakan fseek dan menulis, Anda sedang buffering sisanya ke RAM. Anda juga dapat buffer sisanya untuk file lain. Atau Anda dapat menulis konten baru ke file baru. Tidak ada yang memungkinkan Anda untuk memperpanjang file teks tanpa semacam buffer besar.
slebetman

Jawaban:

50

Tidak masalah jika file di /bin(atau direktori standar lainnya di mana file executable disimpan) dapat ditulis oleh root atau tidak. Pada server Linux yang saya gunakan, mereka dapat ditulis oleh root, tetapi pada mesin OpenBSD saya, mereka tidak.

Selama mereka tidak dapat ditulis oleh grup atau oleh "lainnya"!

Tidak ada masalah keamanan, misalnya

-rwxr-xr-x 1 root root 126584 Feb 18  2016 /bin/ls

Jika seseorang ingin menimpanya, mereka harus menjadi root, dan jika mereka rootmenimpanya, maka mereka juga

  1. menginstal versi baru, atau
  2. kikuk, atau
  3. seorang penyerang dengan izin root sudah .

Hal lain yang perlu dipertimbangkan adalah bahwa root dapat menulis ke file tidak peduli apakah itu dilindungi atau tidak, karena ... root.

Perhatikan juga bahwa "skrip" adalah file biner yang dapat dieksekusi. Sebuah skrip tidak perlu ditulis "karena ini adalah file teks". Jika ada, itu mungkin harus hanya memiliki izin yang sama dengan executable lainnya di direktori yang sama.

Jangan mengubah izin untuk semuanya sekarang! Itu dapat mendatangkan segala macam malapetaka dan berpotensi membingungkan manajer paket yang mungkin memverifikasi bahwa izin diatur dengan benar. Ini juga dapat membuat sistem rentan jika Anda secara tidak sengaja mengubah izin dengan cara yang salah pada aplikasi yang kritis terhadap keamanan.

Asumsikan saja bahwa izin pada executable diatur dengan benar, kecuali Anda menemukan sesuatu yang terlihat sangat aneh, dalam hal ini Anda mungkin harus menghubungi pengelola paket yang relevan untuk memverifikasi daripada mulai mengubah barang.


Dari komentar dan obrolan , ada panggilan untuk beberapa riwayat.

Sejarah izin pada binari di Linux bukanlah sesuatu yang saya ketahui. Mungkin berspekulasi bahwa mereka hanya mewarisi izin dari direktori, atau hanya dari default umaskLinux, tetapi saya benar-benar tidak tahu.

Yang saya tahu adalah OpenBSD menginstal binari di sistem dasar 1 dengan mode izin 555 secara default ( -r-xr-xr-x). Ini ditentukan dalam fragmen Makefile /usr/share/mk/bsd.own.mkyang menetapkan BINMODEke 555 (kecuali jika sudah ditetapkan). Ini kemudian digunakan ketika menginstal executable selama make builddi /usr/src.

Saya telah melihat log CVS beranotasi untuk file ini , dan menemukan bahwa baris dalam file ini tidak berubah karena diimpor dari NetBSD pada tahun 1995.

Di NetBSD, file pertama kali dimasukkan ke dalam CVS pada tahun 1993, dengan BINMODEset ke 555.

Proyek FreeBSD tampaknya telah menggunakan file yang sama persis dengan NetBSD sejak setidaknya tahun 1994 , dan dengan komit kemudian menambahkan petunjuk dalam pesan komit bahwa file lama berasal dari rilis 4.4BSD dari Berkeley Software Distribution.

Di luar itu, CSRG di Berkeley menyimpan sumber-sumbernya di SCCS tetapi repositori mereka tersedia dalam bentuk Git di GitHub 2 . File yang kami berikan perawatan forencic di sini tampaknya telah dilakukan oleh Keith Bostic (atau seseorang yang dekat dengannya) pada tahun 1990.

Jadi itu cerita itu. Jika Anda ingin mengapa , maka saya kira kita harus bertanya kepada Keith. Saya agak berharap melihat pesan komit untuk perubahan yang mengatakan " ini harus 555 karena ... ", tapi tidak.

1 sistem BSD memiliki divisi yang lebih ketat menjadi "sistem dasar" dan "paket pihak ketiga" (port / paket) daripada Linux. Sistem dasar adalah unit yang koheren yang menyediakan lengkap seperangkat fasilitas untuk menjalankan sistem operasi, sedangkan port atau paket dipandang sebagai "software lokal" dan dipasang di bawah /usr/local.

2 Sebuah repositori GitHub yang lebih komprehensif dari rilis Unix dari tahun 70an dan seterusnya juga tersedia .

Kusalananda
sumber
1
Terima kasih atas jawabannya. Izin menulis adalah normal karena tidak terlalu penting sebagai pengguna root (ia dapat melakukan apa saja). Tetapi, karena itu tidak terlalu penting, mengapa kita tidak memberikan izin tertulis jika sama sejak awal? Apakah ini keputusan yang sewenang-wenang?
t1m0th33
1
@ t1m0th33 Saya yakin ini mungkin keputusan sewenang-wenang yang diambil seseorang, ya. Seperti yang saya katakan, pada sistem OpenBSD saya, file di lokasi tersebut tidak dapat ditulisi oleh root.
Kusalananda
1
Saya tidak berpikir itu keputusan sadar oleh siapa pun. Manajer paket secara default menginstal file dengan bit izin yang berakhir dengan mereka selama proses membangun; saat membangun linker membuat file dengan izin 755 karena itulah yang Anda dapatkan ketika Anda mengurangi umask dari 777, dan root umask (pada mesin pembuat vendor OS) memiliki saat membangun adalah 022 karena 022 adalah umask default untuk semua orang dan membuat jadi 222 untuk root akan menjadi pekerjaan tambahan yang tidak ada gunanya.
Henning Makholm
8
+1 untuk "Jangan mengubah izin sekarang!" Saya melihat begitu banyak pertanyaan seperti itu pada Ask Ubuntu di mana pengguna melakukan chmod -R pada /usratau /var, dan kejutan - mereka sudotidak bekerja atau sesuatu yang lain tidak bekerja.
Sergiy Kolodyazhnyy
4
Secara historis tidak adanya izin menulis untuk root tidak akan berpengaruh (root dapat chmod apa pun, dan bahkan tidak perlu, karena root tidak pernah mendapatkan EPERM secara terbuka atau menulis pula). Saya bertanya-tanya apakah 555 hal ini dimulai karena sebenarnya menjadi mungkin untuk root dibatasi (kapan securelevel pertama kali muncul? Sekitar waktu yang sama dengan 4.4BSD atau awal 386BSD / NetBSD?)