Bagaimana fakeroot bukan pelanggaran keamanan di Linux?

18

Setelah membaca beberapa jawaban yang cukup bagus dari pertanyaan ini , saya masih bingung mengapa Anda ingin berpura-pura bahwa Anda root tanpa mendapatkan manfaat sebenarnya dari menjadi root.

Sejauh ini, yang bisa saya kumpulkan adalah bahwa fakeroot digunakan untuk memberikan kepemilikan pada file yang perlu di-root ketika itu di-unzip / tar'ed. Pertanyaan saya, mengapa Anda tidak bisa melakukan itu dengan chown?

Diskusi Google Groups di sini menunjukkan bahwa Anda perlu fakeroot untuk mengkompilasi kernel Debian (jika Anda ingin melakukannya dari pengguna yang tidak berkepentingan). Komentar saya adalah, alasan Anda perlu root untuk mengkompilasi mungkin karena izin baca tidak ditetapkan untuk pengguna lain. Jika demikian, bukankah itu pelanggaran keamanan yang memungkinkan fakeroot untuk dikompilasi (yang berarti gcc sekarang dapat membaca file yang digunakan untuk root)?

Jawaban ini di sini menjelaskan bahwa panggilan sistem sebenarnya dibuat dengan uid / gid pengguna yang sebenarnya , jadi sekali lagi di mana fakeroot membantu?

Bagaimana fakeroot menghentikan eskalasi hak istimewa yang tidak diinginkan di Linux? Jika fakeroot dapat mengelabui tar untuk membuat file yang dimiliki oleh root, mengapa tidak melakukan sesuatu yang mirip dengan SUID?

Dari apa yang telah saya kumpulkan, fakeroot hanya berguna ketika Anda ingin mengubah pemilik file paket apa pun yang Anda buat menjadi root. Tapi Anda bisa melakukannya dengan chown, jadi di mana saya kurang dalam pemahaman saya tentang bagaimana komponen ini seharusnya digunakan?

ng.newbie
sumber
1
Anda tidak perlu fakeroot untuk mengkompilasi kernel. Sistem kernel build tidak gila. Diskusi terkait adalah tentang membuat paket kernel Debian , di mana pembuatan kernel sebenarnya hanya satu langkah.
@ WumpusQ. Wumbley saya akan memperbaikinya, dan bisakah Anda memberi tahu saya mengapa itu terjadi?
ng.newbie
Karena fakeroot adalah sesuatu yang Debian, dan Linux lebih dari Debian?
@ WumpusQ. Wumbley itu harus berjalan pada distribusi apa pun.
user253751

Jawaban:

33

Sejauh ini, yang bisa saya kumpulkan adalah bahwa fakeroot digunakan untuk memberikan kepemilikan pada file yang perlu di-root ketika itu di-unzip / tar'ed. Pertanyaan saya, mengapa Anda tidak bisa melakukan itu dengan chown?

Karena Anda tidak bisa begitu saja melakukannya dengan chown, paling tidak sebagai pengguna non-root. (Dan jika Anda menjalankan sebagai root, Anda tidak perlu fakeroot.) Itulah inti dari fakeroot: untuk memungkinkan program yang dijalankan sebagai root untuk dijalankan sebagai pengguna normal, sambil berpura-pura bahwa operasi yang membutuhkan root berhasil.

Ini digunakan biasanya ketika membangun sebuah paket, sehingga proses instalasi paket yang sedang diinstal dapat dilanjutkan tanpa kesalahan (bahkan jika itu berjalan chown root:root, atau install -o root, dll.). fakerootingat kepemilikan palsu yang pura-pura memberikan file, sehingga operasi selanjutnya melihat kepemilikan melihat ini bukan yang asli; ini memungkinkan tarmenjalankan selanjutnya misalnya untuk menyimpan file yang dimiliki oleh root.

Bagaimana fakeroot menghentikan eskalasi hak istimewa yang tidak diinginkan di Linux? Jika fakeroot dapat mengelabui tar untuk membuat file yang dimiliki oleh root, mengapa tidak melakukan sesuatu yang mirip dengan SUID?

fakeroottidak menipu taruntuk melakukan apa pun, ia mempertahankan perubahan yang ingin dibuat tanpa membiarkan perubahan itu berlaku pada sistem hosting yang membangun. Anda tidak perlu fakerootmembuat tarball yang berisi file yang dimiliki oleh root dan suid; jika Anda memiliki biner evilbinary, menjalankan tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary, sebagai pengguna biasa, akan membuat tarball berisi evilbinary, dimiliki oleh root, dan suid. Namun, Anda tidak akan dapat mengekstrak tarball itu dan mempertahankan izin itu kecuali Anda melakukannya sebagai root: tidak ada eskalasi hak istimewa di sini. fakerootadalah hak istimewa de-penghapusan alat: ini memungkinkan Anda untuk menjalankan build sebagai pengguna biasa, sambil mempertahankan efek yang akan dimiliki build jika telah dijalankan sebagai root, yang memungkinkan efek-efek tersebut diulang kembali nanti. Menerapkan efek "nyata" selalu membutuhkan hak akses root; fakeroottidak menyediakan metode untuk memperolehnya.

Untuk memahami penggunaan fakerootsecara lebih rinci, pertimbangkan bahwa bangunan distribusi tipikal melibatkan operasi berikut (di antara banyak lainnya):

  • instal file, yang dimiliki oleh root
  • ...
  • arsipkan file-file itu, masih dimiliki oleh root, sehingga ketika mereka diekstrak, mereka akan dimiliki oleh root

Bagian pertama jelas gagal jika Anda tidak root. Namun, saat berjalan di bawah fakeroot, sebagai pengguna normal, proses menjadi

  • instal file, yang dimiliki oleh root - ini gagal, tetapi fakerootberpura-puralah berhasil, dan ingat kepemilikan yang berubah
  • ...
  • arsipkan file-file itu, masih dimiliki oleh root - ketika tar(atau pengarsip apa pun yang digunakan) bertanya kepada sistem apa kepemilikan file tersebut, fakerootubah jawaban agar sesuai dengan kepemilikan yang dicatat sebelumnya.

Dengan demikian Anda dapat menjalankan paket build tanpa menjadi root, sambil mendapatkan hasil yang sama dengan yang Anda dapatkan jika Anda benar-benar menjalankannya sebagai root. Penggunaannya fakerootlebih aman: sistem masih tidak dapat melakukan apa pun yang tidak dapat dilakukan oleh pengguna Anda, sehingga proses pemasangan yang jahat tidak dapat merusak sistem Anda (selain menyentuh file Anda).

Di Debian, alat pembuatan telah diperbaiki sehingga tidak memerlukan ini lagi, dan Anda dapat membuat paket tanpafakeroot . Ini didukung oleh dpkglangsung dengan Rules-Requires-Rootarahan (lihat rootless-builds.txt).

Untuk memahami tujuan dari fakeroot, dan aspek keamanan berjalan sebagai root atau tidak, mungkin membantu untuk mempertimbangkan tujuan pengemasan. Ketika Anda menginstal perangkat lunak dari sumber, untuk digunakan di seluruh sistem, Anda melanjutkan sebagai berikut:

  1. membangun perangkat lunak (yang dapat dilakukan tanpa hak istimewa)
  2. instal perangkat lunak (yang perlu dilakukan sebagai root, atau setidaknya sebagai pengguna diizinkan untuk menulis ke lokasi sistem yang sesuai)

Saat Anda mengemas perangkat lunak, Anda menunda bagian kedua; tetapi untuk melakukannya dengan sukses, Anda masih perlu "menginstal" perangkat lunak, ke dalam paket daripada ke sistem. Jadi saat Anda mengemas perangkat lunak, prosesnya menjadi:

  1. membangun perangkat lunak (tanpa hak istimewa)
  2. berpura-pura menginstal perangkat lunak (lagi tanpa hak istimewa)
  3. tangkap penginstalan perangkat lunak sebagai paket (ditto)
  4. membuat paket tersedia (ditto)

Sekarang pengguna menyelesaikan proses dengan menginstal paket, yang perlu dilakukan sebagai root (atau lagi, pengguna dengan hak istimewa yang sesuai untuk menulis ke lokasi yang sesuai). Di sinilah proses privilege tertunda direalisasikan, dan merupakan satu-satunya bagian dari proses yang membutuhkan privilege khusus.

fakeroot membantu dengan langkah 2 dan 3 di atas dengan memungkinkan kami menjalankan proses instalasi perangkat lunak, dan menangkap perilaku mereka, tanpa berjalan sebagai root.

Stephen Kitt
sumber
1
@ ng.newbie Jika Anda menginginkan penjelasan alternatif: sepenuhnya mungkin bagi saya untuk menggunakan hex editor untuk secara manual membangun file tar yang berisi file-file yang dimiliki oleh root atau dengan segala kemungkinan izin lainnya. Ini hanya beberapa informasi yang dibundel, setelah semua, itu tidak memiliki kekuatan apa pun sampai file tersebut benar-benar ada pada sistem.
mbrig
@ ng.newbie Apakah Anda membukanya dengan fakeroot atau tanpa fakeroot?
user253751
2
@ ng.newbie, sebagai tambahan, jika Anda ingin membuat tarball dengan suid-root binary untuk tujuan jahat, Anda bisa melakukannya di beberapa mesin lain sebagai root asli, lalu salin ke target. Tidak perlu fakeroot di sana. fakeroot hanyalah alat untuk membantu dalam membuat file tar, ini menghilangkan kebutuhan untuk menggunakan tar --mode --ownersetiap file yang ditambahkan ke arsip (dan bekerja dengan program lain juga). Masalah potensial muncul jika / ketika Anda membongkar file tar atau arsip yang tidak dipercaya sebagai root, bukan saat membuatnya.
ilkkachu
7

TIDAK. Root palsu memungkinkan Anda untuk menjalankan manipulasi izin dan alat pelaporan, itu akan melaporkan secara konsisten. Namun sebenarnya tidak akan memberikan izin ini. Itu hanya akan terlihat seperti Anda memilikinya (palsu). Itu tidak akan mengubah apa pun di luar lingkungan.

Berguna, jika Anda ingin membuat struktur direktori, yang berisi kepemilikan dan izin, yang tidak dapat ditetapkan oleh pengguna Anda, maka Anda akan tar, zip, atau paket lainnya.

Itu tidak benar - benar meningkatkan izin, itu palsu. Itu tidak membiarkan Anda melakukan apa pun (hapus, tulis, baca) yang tidak bisa Anda lakukan. Anda dapat menghasilkan paket (secara teori) tanpa itu. Anda bisa mendapatkan laporan palsu ( ls) tanpa itu.

Ini bukan kelemahan keamanan, karena tidak memungkinkan akses, atau apa pun yang tidak dapat Anda lakukan tanpanya. Ini berjalan tanpa hak istimewa. Semua itu dosis adalah mencegat panggilan untuk chown, chmod, dll membuat mereka tidak-operasi, kecuali bahwa ia mencatat apa yang akan terjadi. Itu juga memotong panggilan ke statdll sehingga melaporkan izin dan kepemilikan, dari database internal sendiri, seolah-olah perintah lain telah dilakukan. Ini berguna, karena jika Anda kemudian zip direktori, itu akan memiliki izin palsu. Jika Anda kemudian unzip, sebagai root, maka izin akan menjadi nyata.

File apa pun yang tidak dapat dibaca / ditulis sebelumnya, akan tetap tidak dapat dibaca / ditulis. File khusus apa pun (mis. Perangkat) yang dibuat, tidak akan memiliki kekuatan khusus. Set-uid apa pun (untuk pengguna lain), file tidak akan ditetapkan-uid. Eskalasi hak istimewa lainnya tidak akan berfungsi.

Ini adalah jenis mesin virtual: Mesin virtual, secara umum, dapat mensimulasikan lingkungan / OS, tetapi tidak dapat melakukan apa pun pada host, yang tidak dapat dilakukan oleh aplikasi lain. Di dalam mesin Virtual, Anda dapat melakukan apa saja. Anda dapat mengubah sistem keamanan menjadi sama atau berbeda, Namun ini semua akan ada di host, sebagai sumber daya yang dimiliki oleh pengguna / grup dari proses yang menjalankan lingkungan virtual.

ctrl-alt-delor
sumber
@ ctrl-alt-decor Seperti yang saya tanyakan dalam komentar di atas, di * nix tidak mungkin untuk mengatur pemilik untuk melakukan root dari pengguna lain yang tidak berhak, benar? Jadi harus ada alasan yang bagus untuk itu jika suatu program mengizinkannya, bagaimana itu bukan kelemahan keamanan?
ng.newbie
@ ctrl-alt-decor Fakeroot tidak memungkinkan saya untuk membaca / menulis / menghapus, tetapi jika saya menulis pembungkus untuk syscalls apakah itu masuk akal bahwa saya dapat melakukan operasi itu juga.
ng.newbie
@ ctrl-alt-decor Jadi satu-satunya alasan fakeroot ada adalah untuk mengatur izin ke file untuk di-root tanpa menjadi root. Jika itu bukan cacat keamanan, mengapa Linux melarang itu?
ng.newbie
1
Tidak, itu memungkinkan Anda untuk memalsukan pengguna pengaturan ke pengguna mana pun, dan memalsukan beberapa hal lainnya. Cobalah: jalankan fakeroot dan lihat file dari luar, coba akses file, yang seharusnya tidak Anda lakukan.
ctrl-alt-delor
4

Sudah ada dua yang baik, dan jawaban yang sangat rinci di sini, tapi aku hanya akan menunjukkan bahwa paragraf pengantar dari aslinya fakeroot halaman manual 1 benar-benar menjelaskan dengan cukup jelas dan ringkas:

fakeroot menjalankan perintah di lingkungan di mana ia tampaknya memiliki hak akses root untuk manipulasi file. Ini berguna untuk memungkinkan pengguna membuat arsip (tar, ar, .deb, dll.) Dengan file di dalamnya dengan izin / kepemilikan root. Tanpa fakeroot, seseorang perlu memiliki hak akses root untuk membuat file konstituen dari arsip dengan izin dan kepemilikan yang benar, dan kemudian mengemasnya, atau seseorang harus membangun arsip secara langsung, tanpa menggunakan pengarsipan.

Fakeroot memungkinkan pengguna non-root untuk membuat arsip yang berisi file yang dimiliki root, yang merupakan bagian penting dalam menghasilkan dan mendistribusikan paket perangkat lunak biner di Linux. Tanpa fakeroot, arsip paket harus dihasilkan saat berjalan sebagai root aktual, sehingga mengandung hak kepemilikan dan file yang benar. Itu akan menjadi risiko keamanan. Membangun dan mengemas perangkat lunak yang berpotensi tidak tepercaya adalah paparan besar jika dilakukan dengan root privs. Berkat fakeroot, pengguna yang tidak terprivasi dengan file yang tidak terprivasi masih dapat menghasilkan arsip yang berisi file dengan kepemilikan root. 2

Tapi itu bukan risiko keamanan, karena tidak ada dalam arsip yang benar - benar dimiliki oleh root hingga file-file tersebut DIEKSTRAKSI . Dan bahkan kemudian, file-file hanya akan diekstraksi dengan izin root mereka utuh jika dilakukan oleh pengguna yang memiliki hak istimewa. Langkah itu - di mana fakerootarsip yang dibantu oleh yang berisi file "root" diekstraksi oleh pengguna istimewa - adalah tempat root "palsu" akhirnya menjadi nyata. Sampai saat itu, tidak ada hak akses root aktual yang pernah diperoleh atau dilewati.

Catatan

  1. Fakeroot telah menelurkan beberapa pesaing / peniru yang akan menyamar seolah fakerootdiinstal, termasuk fakeroot-ngdan pseudo. Tapi IMHO tidak juga halaman manual "peniru" hampir sejelas tentang langsung ke titik pada pertanyaan ini. Tetap dengan yang asli, satu-satunya fakerootOG
  2. Distro / sistem pengemasan lain mengatasi hal ini dengan tidak menggunakan kepemilikan root dalam arsip paket mereka. Di Fedora, misalnya, perangkat lunak dapat dikompilasi, diinstal, dan dikemas oleh pengguna yang tidak memiliki hak tanpa diwajibkan fakeroot. Itu semua dilakukan dalam ruang pengguna $HOME/rpmbuild/, dan langkah-langkah yang biasanya istimewa seperti make installdialihkan (melalui mekanisme suka --prefixdan DESTDIR) ke $HOME/rpmbuild/BUILDROOT/hierarki yang dapat dianggap semacam ruang "fakechroot" (tanpa benar-benar menggunakan fakechroot).

    Tetapi bahkan selama make install, semuanya dijalankan sebagai dan dimiliki oleh pengguna yang tidak memiliki hak. Kepemilikan dan izin file yang diekstraksi akan diatur ke root,rootdan 0644(atau 0755untuk yang dapat dieksekusi) secara default, kecuali ditimpa dalam definisi paket ( .spec) file dalam hal ini mereka disimpan sebagai metadata dalam paket akhir. Karena tidak ada izin atau kepemilikan yang benar-benar diterapkan hingga proses pemasangan paket rpm (istimewa), tidak fakerootdiperlukan root atau pun selama pengemasan. Tetapi fakerootsebenarnya hanya jalan yang berbeda untuk hasil yang sama.

FeRD
sumber
1
Mengenai catatan pertama Anda, fakeroot-ng klaim untuk menggantikan fakeroot, tetapi dalam praktiknya itu belum menggantinya, dan AFAIK fakerootmasih merupakan alat yang digunakan dalam Debian secara default (bila perlu).
Stephen Kitt
@StephenKitt Aha! Terima kasih. Saya bertanya-tanya tentang itu. Awalnya saya bingung karena saya pergi mencari halaman fakerootmanual, dan Google mencampakkan saya di fakeroot-ng(menyamar sebagai fakeroot(1)), dan saya kira saya terlalu banyak mengambil keputusan. Tapi saya melihat sekarang bahwa fakeroot-ng belum diperbarui sejak 2014 , sedangkan fakeroot masih aktif . Rupanya ada juga pseudo yang berhasil melakukannya beberapa tahun yang lalu, tetapi sekarang macet. Saya akan menyesuaikan jawaban saya.
FeRD
1
Ya saya juga bingung pada awalnya, karena halaman fakerootmanual di situs Debian mengarah ke fakeroot-ngversi secara default. Lihat paragraf terakhir dari fakeroot-ngtwist yang lucu ;-).
Stephen Kitt