Qs yang lebih mirip dengan lebih banyak jawaban yang patut diperhatikan:
CATATAN: Beberapa jawaban di sana menunjukkan solusi spesifik yang belum disebutkan di sini.
Sebenarnya, ada beberapa alat pemenjaraan dengan implementasi yang berbeda, tetapi banyak dari mereka yang tidak aman oleh desain (seperti fakeroot
, LD_PRELOAD
berbasis), atau tidak lengkap (seperti fakeroot-ng
, ptrace
berbasis), atau akan membutuhkan root ( chroot
, atau plash
disebutkan di fakechroot label peringatan ).
Ini hanya contoh; Saya berpikir untuk mendaftarkan mereka semua berdampingan, dengan indikasi 2 fitur ini ("dapat dipercaya?", "Memerlukan root untuk mengatur?"), Mungkin di Implementasi virtualisasi tingkat sistem Operasi .
Secara umum, jawaban di sana mencakup berbagai kemungkinan yang dijelaskan dan bahkan lebih banyak lagi:
mesin virtual / OS
ekstensi kernel (seperti SELinux)
- (disebutkan dalam komentar di sini),
chroot
Pembantu berbasis chroot (yang bagaimanapun harus setUID root, karena chroot
memerlukan root; atau mungkin chroot
bisa bekerja di namespace yang terisolasi - lihat di bawah):
[untuk memberi tahu lebih banyak tentang mereka!]
Alat isolasi berbasis chroot yang dikenal:
- hasher dengan
hsh-run
dan hsh-shell
perintahnya. ( Hasher dirancang untuk membuat perangkat lunak dengan cara yang aman dan berulang.)
- schroot disebutkan dalam jawaban lain
- ...
ptrace
Solusi isolasi lain yang dapat dipercaya (selain yang seccomp
berbasis ) adalah syscall-interception menyeluruh ptrace
, seperti yang dijelaskan dalam halaman manual untuk fakeroot-ng
:
Tidak seperti implementasi sebelumnya, fakeroot-ng menggunakan teknologi yang membuat proses yang dilacak tidak ada pilihan mengenai apakah ia akan menggunakan "layanan" fakeroot-ng atau tidak. Mengkompilasi program secara statis, memanggil kernel secara langsung dan memanipulasi ruang alamat sendiri adalah semua teknik yang dapat digunakan secara sepele untuk mem-bypass kontrol berbasis LD_PRELOAD atas suatu proses, dan tidak berlaku untuk fakeroot-ng. Secara teori, dimungkinkan untuk membentuk fakeroot-ng sedemikian rupa sehingga memiliki kontrol penuh atas proses yang dilacak.
Meskipun secara teori dimungkinkan, namun belum dilakukan. Fakeroot-ng memang berasumsi asumsi "berperilaku baik" tertentu tentang proses yang dilacak, dan proses yang melanggar asumsi tersebut mungkin dapat, jika tidak sepenuhnya melarikan diri maka setidaknya menghindari beberapa "palsu" lingkungan yang dikenakan padanya oleh fakeroot- ng. Karena itu, Anda sangat diperingatkan untuk tidak menggunakan fakeroot-ng sebagai alat keamanan. Laporan bug yang mengklaim bahwa suatu proses dapat dengan sengaja (berlawanan dengan tidak sengaja) lolos dari kontrol palsu-root akan ditutup sebagai "bukan bug" atau ditandai sebagai prioritas rendah.
Mungkin saja kebijakan ini dipikirkan kembali di masa depan. Namun, untuk saat ini, Anda telah diperingatkan.
Namun, seperti yang dapat Anda baca, fakeroot-ng
itu sendiri tidak dirancang untuk tujuan ini.
(BTW, saya bertanya-tanya mengapa mereka memilih untuk menggunakan seccomp
pendekatan berbasis untuk Chromium daripada ptrace
berbasis ...)
Dari alat-alat yang tidak disebutkan di atas, saya telah mencatat Geordi untuk diri saya sendiri, karena saya suka bahwa program pengendalian ditulis dalam Haskell.
Alat isolasi berbasis ptrace yang dikenal:
seccomp
Salah satu cara yang diketahui untuk mencapai isolasi adalah melalui pendekatan kotak pasir seccomp yang digunakan di Google Chromium . Tetapi pendekatan ini mengandaikan bahwa Anda menulis pembantu yang akan memproses beberapa (yang diizinkan) dari akses file "dicegat" dan syscall lainnya; dan juga, tentu saja, berusaha untuk "mencegat" syscalls dan mengarahkannya ke helper (mungkin, itu bahkan akan berarti menggantikan syscalls yang disadap dalam kode proses yang dikendalikan; jadi, itu tidak terdengar untuk menjadi cukup sederhana; jika Anda tertarik, Anda sebaiknya membaca detail daripada hanya jawaban saya).
Info terkait lainnya (dari Wikipedia):
(Item terakhir tampaknya menarik jika seseorang mencari seccomp
solusi berbasis umum di luar Chromium. Ada juga posting blog yang layak dibaca dari penulis "seccomp-nurse": SECCOMP sebagai solusi Sandboxing?. )
Ilustrasi pendekatan ini dari proyek "perawat perawat" :
Seccomp "fleksibel" mungkin di masa depan Linux?
Dulu muncul pada tahun 2009 juga saran untuk menambal kernel Linux sehingga ada lebih banyak fleksibilitas ke seccomp
mode - sehingga "banyak akrobat yang saat ini kita butuhkan dapat dihindari". ("Akrobat" mengacu pada komplikasi penulisan pembantu yang harus mengeksekusi banyak syscall yang mungkin tidak bersalah atas nama proses yang dipenjara dan menggantikan syscall yang mungkin tidak bersalah dalam proses dipenjara.) Sebuah artikel LWN menulis tentang hal ini:
Satu saran yang keluar adalah menambahkan "mode" baru ke seccomp. API dirancang dengan gagasan bahwa aplikasi yang berbeda mungkin memiliki persyaratan keamanan yang berbeda; itu termasuk nilai "mode" yang menentukan batasan yang harus diberlakukan. Hanya mode asli yang pernah diterapkan, tetapi yang lain pasti bisa ditambahkan. Membuat mode baru yang memungkinkan proses memulai untuk menentukan panggilan sistem mana yang diizinkan akan membuat fasilitas lebih berguna untuk situasi seperti kotak pasir Chrome.
Adam Langley (juga dari Google) telah memposting tambalan yang melakukan hal itu. Implementasi "mode 2" yang baru menerima bitmask yang menggambarkan panggilan sistem mana yang dapat diakses. Jika salah satunya adalah prctl (), maka kode sandboxed selanjutnya dapat membatasi panggilan sistemnya sendiri (tetapi tidak dapat mengembalikan akses ke panggilan sistem yang telah ditolak). Semua mengatakan, sepertinya solusi yang masuk akal yang bisa membuat hidup lebih mudah bagi pengembang sandbox.
Karena itu, kode ini mungkin tidak pernah digabungkan karena diskusi telah beralih ke kemungkinan lain.
"Seccomp fleksibel" ini akan membawa kemungkinan Linux lebih dekat untuk menyediakan fitur yang diinginkan dalam OS, tanpa perlu menulis pembantu yang rumit.
(Posting blog dengan konten yang pada dasarnya sama dengan jawaban ini: http://geofft.mit.edu/blog/sipb/33 .)
ruang nama ( unshare
)
Mengisolasi melalui namespaces ( unshare
solusi berbasis ) - tidak disebutkan di sini - misalnya, mount-point unsharing (dikombinasikan dengan FUSE?) Mungkin bisa menjadi bagian dari solusi yang berfungsi untuk Anda yang ingin membatasi akses sistem file dari proses yang tidak dipercaya.
Lebih banyak tentang ruang nama, sekarang, karena implementasinya telah selesai (teknik isolasi ini juga dikenal di bawah nme "Linux Containers", atau "LXC" , bukan? ..):
"Salah satu tujuan keseluruhan ruang nama adalah untuk mendukung implementasi wadah, alat untuk virtualisasi ringan (serta tujuan lain)" .
Bahkan mungkin untuk membuat namespace pengguna baru, sehingga "suatu proses dapat memiliki ID pengguna tidakrivil normal di luar namespace pengguna sementara pada saat yang sama memiliki ID pengguna 0 di dalam namespace. Ini berarti bahwa proses tersebut memiliki hak root root penuh untuk operasi di dalam namespace pengguna, tetapi tidak terjangkau untuk operasi di luar namespace ".
Untuk perintah kerja nyata untuk melakukan ini, lihat jawabannya di:
dan pemrograman / kompilasi ruang pengguna khusus
Namun, tentu saja, jaminan "jail" yang diinginkan dapat diimplementasikan dengan pemrograman dalam ruang pengguna ( tanpa dukungan tambahan untuk fitur ini dari OS ; mungkin itu sebabnya fitur ini belum dimasukkan di tempat pertama dalam desain OS) ); dengan sedikit banyak komplikasi.
Kotak pasir yang disebutkan ptrace
- atau seccomp
berbasis dapat dilihat sebagai beberapa varian penerapan jaminan dengan menulis pembantu kotak pasir yang akan mengendalikan proses Anda yang lain, yang akan diperlakukan sebagai "kotak hitam", program Unix yang berubah-ubah.
Pendekatan lain bisa menggunakan teknik pemrograman yang dapat peduli tentang efek yang harus dilarang. (Pasti Anda yang menulis program itu; mereka bukan kotak hitam lagi.) Untuk menyebutkan satu, menggunakan bahasa pemrograman murni (yang akan memaksa Anda untuk memprogram tanpa efek samping) seperti Haskell hanya akan membuat semua efek dari program eksplisit, sehingga programmer dapat dengan mudah memastikan tidak akan ada efek yang dilarang.
Saya kira, ada fasilitas sandboxing yang tersedia untuk pemrograman dalam bahasa lain, misalnya, Java.
Beberapa halaman yang mengumpulkan info tentang topik ini juga ditunjukkan dalam jawaban di sana: