Institut Teknologi Massachusetts. Kursus Kuliah # 6.858. "Keamanan sistem komputer." Nikolai Zeldovich, James Mickens. Tahun 2014
Keamanan Sistem Komputer adalah kursus tentang pengembangan dan implementasi sistem komputer yang aman. Ceramah mencakup model ancaman, serangan yang membahayakan keamanan, dan teknik keamanan berdasarkan pada karya ilmiah baru-baru ini. Topik meliputi keamanan sistem operasi (OS), fitur, manajemen aliran informasi, keamanan bahasa, protokol jaringan, keamanan perangkat keras, dan keamanan aplikasi web.
Kuliah 1: “Pendahuluan: model ancaman”
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 2: "Kontrol serangan hacker"
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 3: “Buffer Overflows: Exploits and Protection”
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 4: “Pemisahan Hak Istimewa”
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 5: "Dari mana sistem keamanan berasal?"
Bagian 1 /
Bagian 2Kuliah 6: “Peluang”
Bagian 1 /
Bagian 2 /
Bagian 3 Hadirin: dapatkah kita menyimpulkan bahwa setiap peluang memiliki satu proses?
Profesor: Saya ragu. Anda dapat memiliki sebanyak mungkin proses yang Anda inginkan, karena satu kemungkinan beberapa proses dapat ada. Sederhananya, Anda tidak perlu proses terpisah untuk setiap kesempatan. Karena ada proses
fort1 yang dapat membuka banyak file dan memberikan banyak kemampuan kepada komponen
fort yang istimewa.

Alasan Anda berpikir Anda membutuhkan proses terpisah untuk setiap kesempatan yang kami hadapi berkaitan dengan interaksi aneh antara kemampuan dan hak istimewa eksternal ini.
Karena
fort1 memiliki hak istimewa eksternal. Dan apa yang kami lakukan pada dasarnya adalah mengubah hak istimewa eksternal ini menjadi
Kemampuan dalam proses
fort1 ini. Jadi jika Anda memiliki beberapa jenis hak istimewa eksternal atau beberapa hak istimewa berbeda yang ingin Anda gunakan dengan hati-hati, maka Anda mungkin menginginkan proses terpisah yang memiliki hak istimewa ini. Dan setiap kali Anda ingin menggunakan seperangkat hak khusus, Anda akan meminta proses yang tepat untuk melakukan pemisahan, dan jika ini berhasil, maka Anda akan meminta proses untuk mengembalikan
Kemampuan kepada Anda.
Bahkan, ada semacam desain sistem operasi yang sepenuhnya didasarkan pada kemampuan dan tidak memiliki hak eksternal. Dan ini keren, tetapi tidak terlalu praktis untuk digunakan dalam sistem nyata. Ternyata pada kenyataannya Anda ingin tidak begitu banyak hak eksternal sebagai peluang untuk memberi nama objek dan memberi tahu seseorang tentang objek ini tanpa mentransfer hak atas objek ini tanpa gagal.
Mungkin saya tidak tahu hak istimewa apa yang mungkin Anda miliki sehubungan dengan beberapa dokumen umum, tetapi saya ingin memberi tahu Anda bahwa kami memiliki dokumen umum ini. Jika Anda bisa membacanya, bacalah. Jika Anda menuliskannya, baiklah, tulis. Tapi saya tidak ingin mentransfer hak apa pun untuk itu. Saya hanya ingin memberi tahu Anda: "Hei, ini, coba saja!" Jadi ini adalah ketidaknyamanan dalam dunia peluang, karena itu benar-benar memaksa Anda untuk tidak pernah membicarakan objek tanpa mengalihkan hak atas objek ini.
Oleh karena itu, penting untuk mengetahui hal ini dan menggunakan fitur ini di beberapa bagian sistem, tetapi tidak mengandalkan ini untuk menjadi solusi bagi keamanan sistem.
Audiens: anggaplah bahwa proses tersebut memiliki kemampuan yang diberikan kepadanya oleh beberapa proses lain, tetapi ternyata proses tersebut telah memiliki kemampuan yang hebat sehubungan dengan beberapa objek. Bisakah suatu proses membandingkan mereka untuk memastikan mereka menyentuh objek yang sama? Atau akankah dia menggunakan peluang besar?
Profesor: faktanya adalah proses tidak menggunakan kapabilitas secara implisit, jadi ini adalah properti kapabilitas yang sangat berguna. Anda harus menunjukkan opsi mana yang Anda gunakan. Jadi pikirkan tentang hal ini dalam deskriptor file. Misalkan saya memberi Anda deskriptor file terbuka untuk beberapa file, dan itu hanya baca. Kemudian orang lain memberi Anda kesempatan lain untuk file lain, yang mungkin termasuk file ini. Dan fitur baru memungkinkan Anda membaca dan menulis ke file.
Dalam hal ini, jika Anda mencoba menulis ke file pertama, Anda pasti akan berhasil, karena deskriptor file tambahan akan dibuka untuk itu, yang memungkinkan tidak hanya membaca tetapi juga menulis. Jadi ini adalah hal yang keren ketika Anda tidak membutuhkan hak istimewa eksternal tambahan. Anda hanya memiliki semua kemungkinan ini, karena orang-orang benar-benar membangun perpustakaan semacam itu dan, pada prinsipnya, mereka mengelola kemampuan Anda untuk Anda. Mereka mengumpulkannya. Dan ketika mereka mencoba melakukan operasi, mereka mencari peluang dan menemukan yang membuatnya berfungsi.
Ini mengembalikan Anda ke kontrol eksternal dari
otoritas sekitar yang Anda coba hindari. Fitur positif dari kemungkinan adalah bahwa itu adalah desain perangkat lunak yang menyederhanakan hidup Anda. Ini tidak biasa dalam solusi keamanan. Properti ini memudahkan Anda untuk menulis kode yang mengarah ke hak istimewa yang ingin Anda gunakan dari sudut pandang keamanan. Dan ini cukup mudah untuk menulis kode.
Namun,
kapabilitas dapat memecahkan masalah lain. Jadi, masalah manajemen privilege sering muncul ketika Anda perlu menjalankan beberapa kode yang tidak dipercaya. Karena Anda benar-benar ingin mengendalikan hak istimewa apa yang Anda berikan, karena jika tidak, ada risiko penyalahgunaan hak istimewa apa pun yang Anda berikan. Dan ini adalah sudut pandang yang sedikit berbeda dari yang penulis artikel tentang peluang
Capsicum pendekatan. Mereka, tentu saja, sadar akan masalah otoritas eksternal, tetapi ini adalah masalah yang sedikit berbeda yang bisa atau tidak bisa Anda pecahkan. Tetapi pada dasarnya mereka peduli bahwa mereka memiliki aplikasi istimewa yang sangat besar, dan mereka khawatir akan ada kesalahan di berbagai bagian kode sumber aplikasi ini. Karenanya, mereka ingin mengurangi keistimewaan dari berbagai komponen aplikasi ini.
Dalam hal ini, ceritanya sangat mirip dengan
OKWS . Jadi, Anda memiliki aplikasi besar, Anda memecahnya menjadi komponen dan membatasi hak istimewa untuk setiap komponen. Ini tentu masuk akal di
OKWS . Apakah ada situasi lain di mana Anda mungkin khawatir tentang berbagi hak istimewa? Saya pikir dalam artikel mereka mereka menggambarkan contoh yang harus saya coba jalankan, misalnya,
tcpdump dan aplikasi lain yang menganalisis data jaringan. Mengapa mereka begitu khawatir tentang aplikasi yang menganalisis input jaringan? Apa yang terjadi di
tcpdump ? Apa alasan paranoia mereka?
Audiens: seorang penyerang dapat mengontrol apa yang dikirim dan apa yang dipanggil untuk mengeksekusi, misalnya, paket.
Profesor: ya, mereka benar-benar peduli dengan serangan semacam ini dan tentang apakah penyerang benar-benar dapat mengendalikan data input? Karena itu cukup bermasalah jika Anda menulis kode
C yang seharusnya menangani struktur data. Jelas, Anda akan melakukan banyak manipulasi pointer dengan menyalin byte ke array yang mengalokasikan memori. Pada saat yang sama, mudah untuk membuat kesalahan dengan manajemen memori, yang akan menyebabkan konsekuensi yang lebih buruk.
Jadi ini adalah alasan mengapa mereka memutuskan untuk melihat karya protokol jaringan mereka dan hal-hal lain di kotak pasir.

Contoh lain dari dunia nyata di mana pembagian hak istimewa diperlukan adalah browser Anda. Anda mungkin ingin mengisolasi plugin Flash Anda, atau ekstensi
Java Anda, atau yang lainnya. Karena mereka mewakili medan yang luas untuk serangan yang digunakan cukup agresif.
Jadi ini sepertinya rencana yang cerdas. Misalnya, jika Anda menulis beberapa perangkat lunak, Anda ingin memeriksa perilaku komponennya di kotak pasir. Secara umum, ini merujuk pada apa yang Anda unduh dari Internet dan berniat untuk berjalan dengan lebih sedikit keistimewaan. Apakah gaya isolasi yang ditawarkan
Capsicum cocok dengan ini ? Saya dapat mengunduh screensaver acak atau game dari Internet. Dan saya ingin menjalankannya di komputer saya, tetapi pertama-tama pastikan bahwa mereka tidak merusak semua yang saya miliki. Apakah Anda menggunakan
Capsicum untuk ini?
Pemirsa: Anda dapat menulis program kotak pasir di mana Anda akan menggunakan
Capsicum .
Profesor: benar. Bagaimana Anda menggunakannya? Nah, Anda cukup memasukkan mode kotak pasir dengan
perintah cap_enter , dan kemudian jalankan program. Apakah Anda berharap ini berfungsi? Saya pikir akan ada masalah. Ini akan terhubung dengan fakta bahwa jika program tidak mengharapkannya diisolasi oleh
Capsicum , maka ia dapat mencoba untuk membuka perpustakaan bersama, tetapi tidak dapat melakukannya karena ia tidak dapat membuka sesuatu seperti
/ lib / ... , karena itu tidak diizinkan dalam mode
Kemampuan .
Oleh karena itu, metode kotak pasir ini harus digunakan untuk hal-hal yang telah diramalkan pengembang dapat dieksekusi dalam mode ini. Mungkin ada metode kotak pasir lain yang dapat digunakan untuk kode yang tidak dimodifikasi, tetapi persyaratannya mungkin sedikit berubah. Karena itu, pencipta
Capsicum tidak terlalu khawatir tentang kompatibilitas ke belakang. Jika kita harus membuka file secara berbeda, kita akan membukanya secara berbeda. Tetapi jika Anda ingin meninggalkan kode yang ada, Anda memerlukan sesuatu yang lebih, misalnya, mesin virtual lengkap sehingga Anda dapat menjalankan kode di dalamnya. Ini menimbulkan pertanyaan - haruskah kita menggunakan mesin virtual untuk kotak pasir
Capsicum ?
Hadirin: dalam hal ini, memori yang melebihi mungkin.
Profesor: ya, benar. Tetapi bagaimana jika kita tidak peduli dengan ingatan? Jadi mesin virtual mungkin sangat bagus, dan mereka tidak menggunakan banyak memori. Jadi untuk alasan apa lagi kita tidak menggunakan
VM di
Capsicum ?
Audiens: Sulit untuk mengontrol aktivitas jaringan.
Profesor: Benar! Sulit untuk mengontrol apa yang terjadi di jaringan karena Anda tidak memberikan akses mesin virtual ke jaringan, atau Anda terhubung ke jaringan melalui mode
NAT , atau menggunakan
Preview atau
VMWare . Tetapi kemudian kotak pasir Anda dapat mengakses seluruh Internet. Oleh karena itu, Anda harus mengelola jaringan lebih terinci, mungkin dengan menetapkan aturan firewall untuk mesin virtual, dan sebagainya. Ini tidak terlalu bagus.
Tetapi bagaimana jika Anda tidak peduli dengan jaringan? Misalkan Anda hanya memiliki beberapa jenis video. Bagaimana jika Anda memproses beberapa video sederhana atau menganalisis
tcpdump . Dalam hal ini, Anda cukup memulai mesin virtual, itu mulai mengurai paket
tcpdump Anda dan melemparkan Anda kembali setelah presentasi yang ingin dituliskan oleh
tcpdump kepada pengguna, karena tidak ada jaringan I / O nyata. Jadi, adakah alasan lain?
Hadirin: karena overhead inisialisasi masih tinggi.
Profesor: ya, ini mungkin overhead awal dari memulai mesin virtual, yang mengurangi kinerja. Jadi itu benar.
Audiens: Ya, Anda mungkin masih ingin memiliki hak atas database dan sejenisnya.
Profesor: ya. Tetapi secara umum, ini berarti Anda memiliki data nyata yang sedang Anda tangani, dan sangat sulit untuk memisahkannya. Dengan demikian, mesin virtual memang mekanisme berbagi yang jauh lebih besar, karena itu Anda tidak dapat dengan mudah berbagi sesuatu. Jadi ini bagus untuk situasi di mana Anda memiliki program yang sepenuhnya terisolasi yang ingin Anda jalankan, dan pada saat yang sama Anda tidak ingin berbagi file, direktori, proses dan biarkan mereka bekerja secara terpisah.
Jadi ini bagus. Ini mungkin, dalam beberapa hal, isolasi yang lebih kuat daripada yang disediakan
Capsicum , karena ada lebih sedikit pilihan untuk kesalahan. Namun, isolasi ini tidak berlaku dalam banyak situasi ketika Anda ingin menggunakan
Capsicum . Karena di
Capsicum Anda dapat bertukar file dengan akurasi tinggi, menggunakan kemampuan kotak pasir.
Jadi, mari kita ambil
tcpdump dan lihat mengapa sulit mengisolasinya menggunakan mekanisme
Unix . Jika Anda ingat, di
Capsicum cara
tcpdump bekerja adalah membuka beberapa soket khusus, dan kemudian menjalankan logika parsing pada paket jaringan, setelah itu dicetak pada terminal pengguna. Jadi apa yang dibutuhkan untuk kotak pasir
tcpdump berbasis
Unix ? Apakah hak istimewa Anda terbatas? Masalah dengan
Unix adalah bahwa satu-satunya cara untuk benar-benar mengubah hak istimewa adalah mengubah input dalam fungsi keputusan, yang memutuskan apakah Anda benar-benar dapat mengakses suatu objek atau tidak. Dan satu-satunya hal yang benar-benar dapat Anda ubah adalah hak istimewa dari proses tersebut. Ini berarti bahwa proses akan dapat mengirim
UID ke orang lain.
Atau Anda dapat mengubah izin untuk berbagai objek yang ada di sistem Anda. Bahkan, Anda bisa menggunakan kedua solusi ini.
Jika Anda ingin mengisolasi
tcpdump di kotak pasir, Anda mungkin harus memilih ID pengguna tambahan dan beralih ke sana saat Anda bekerja. Tapi ini bukan rencana yang ideal, karena Anda tidak akan menjalankan beberapa instance
tcpdump di bawah
ID pengguna yang sama. Oleh karena itu, jika saya berkompromi dengan satu instance
tcpdump , ini tidak berarti bahwa saya ingin mengizinkan penyerang menggunakan faktor ini untuk mengontrol instance
tcpdump lain yang berjalan pada mesin saya. Jadi ini berpotensi keputusan yang buruk untuk menggunakan
uid dalam kasus ini.
Masalah lain adalah bahwa di
Unix, Anda harus memiliki hak akses root untuk mengubah ID pengguna, hak istimewa, proses, atau sesuatu yang lain, atau beralih ke yang lain. Ini juga buruk.
Dan masalah lain adalah bahwa, apa pun
ID Anda, file akses terbuka mungkin ada. Jadi sistem Anda mungkin memiliki seluruh grup file yang dapat dibaca atau ditulis, misalnya, file kata sandi. Memang, apa pun
ID yang Anda miliki, prosesnya tetap dapat membaca kata sandi ini. Jadi ini juga tidak terlalu bagus.
Jadi, untuk mengatur kotak pasir di
Unix , Anda mungkin harus melakukan keduanya: mengubah
UID dan dengan hati-hati meninjau izin untuk semua objek untuk memastikan bahwa Anda tidak memiliki file terbuka yang tidak diinsulasi yang sensitif untuk ditimpa atau dibaca oleh peretas. Saya pikir dalam melakukan itu Anda mendapatkan mekanisme lain yang dapat Anda gunakan. Jika Anda mengirimkannya sampai akhir, Anda mungkin melihat kesulitan berbagi file atau berbagi direktori.
Sekarang mari kita lihat bagaimana
Capsicum mencoba menyelesaikan masalah ini. Di sini, begitu kita memasuki mode "kotak pasir", semuanya akan tersedia hanya melalui peluang. Karena itu, jika Anda tidak memiliki
Kemampuan , Anda tidak dapat mengakses objek apa pun.
Orang-orang dalam artikel ini membuat taruhan besar pada namespace global. Jadi apa ruang nama global ini, dan mengapa mereka begitu khawatir tentang itu?
Sistem file mereka sendiri adalah semacam contoh cemerlang dari namespace global. Anda dapat menulis garis miring dan mendaftar semua file yang Anda inginkan di belakangnya. Misalnya, buka seseorang di direktori home, misalnya,
/ home / nickolai / ... Mengapa ini buruk? Mengapa mereka menentang namespace global di
Capsicum ? Apa yang kamu pikirkan
Pemirsa: jika Anda memiliki izin yang salah, maka saat menggunakan otoritas Anda dapat mendapat masalah.
Profesor: ya. Masalahnya adalah itu masih
Unix . Dengan demikian, masih ada izin file biasa. Karena itu, mungkin, jika Anda benar-benar ingin mengisolasi beberapa proses di kotak pasir, Anda tidak akan dapat membaca atau menulis apa pun di sistem. Tetapi jika Anda berhasil menemukan file yang dapat ditulisi di direktori home dari beberapa pengguna bodoh, maka ini akan agak tidak menyenangkan bagi klien sandbox.
Secara umum, ide mereka adalah untuk secara akurat membuat daftar semua objek yang dimiliki proses. Karena Anda bisa mendaftarkan semua fitur dalam tabel deskriptor file atau di mana saja tempat fitur disimpan untuk Anda. Dan ini adalah satu-satunya hal yang dapat disentuh oleh proses tersebut.
Tetapi jika Anda memiliki akses ke namespace global, maka ini berpotensi tidak mungkin. Karena walaupun Anda memiliki serangkaian fitur terbatas, Anda masih dapat memulai baris dengan slash dan menulis beberapa file baru, dan Anda tidak akan pernah tahu set operasi atau objek yang dapat diakses oleh proses ini.
Itulah sebabnya mereka sangat khawatir dengan namespace global, karena itu bertentangan dengan tujuan mereka untuk secara tepat mengendalikan segala sesuatu yang harus diakses oleh proses kotak pasir. Dengan cara ini, mereka mencoba menghilangkan ruang nama global dengan banyak perubahan kernel di
FreeBSD . Dalam kasus mereka, kernel harus memastikan bahwa semua operasi melewati beberapa kemampuan, yaitu, melalui deskriptor file.
Mari kita periksa apakah kita benar-benar membutuhkan perubahan kernel. Bagaimana jika kita melakukannya di perpustakaan? Bagaimanapun, kami mengimplementasikan
Capsicum , yang sudah memiliki perpustakaan. Dan yang kami lakukan hanyalah mengubah semua fitur ini, seperti "buka, baca, tulis," untuk menggunakan fitur
Kemampuan secara eksklusif. Kemudian semua operasi akan melalui beberapa fitur, mencarinya di tabel file, dan sebagainya. Akankah ini berhasil?
Pemirsa: Anda selalu dapat melakukan panggilan sistem
syscall .
Profesor: ya. Masalahnya adalah bahwa ada satu set panggilan sistem yang diterima oleh kernel, dan bahkan jika Anda menerapkan perpustakaan yang baik, ini tidak akan mencegah kemungkinan bahwa proses yang buruk atau terganggu akan membuat panggilan sistem secara langsung. Karena itu, Anda harus entah bagaimana memperkuat intinya.
Dalam kompiler, model ancaman tidak dalam proses kompiler yang dikompromikan dan tidak dalam kode arbitrer, tetapi dalam kecerobohan programmer. Jadi jika pengembang program tidak salah dan melakukan hal yang benar, maka perpustakaan mungkin akan cukup.
, , , . - , .
? — ,
cap_enter . ,
cap_enter ? , ?
, , . , , , .
cap_enter ,
open () ,
openat .
Unix- , ,
open ,
openat , , , — :
openat (dirfd,“name) .
openat «name» , .

,
Capability open , , , . . - ? -, ? , – . , ?
: , .
: . , , . , , . , . , , . -, .
, , , , , . , , .. , , , . ?
. ? ,
Unix PID . ,
kill (25) PID = 25 . , .
Capsicum ? ?
: .
: . -, . ,
Unix , . ,
PID , ,
fork ,
pdfork , « ». , - .
. , . , - : « «» , , , , ». . , , - .
, , , . , . , , .

. , «-» . ,
openat , «-». , «-», .
? , «-» ?
: , , . ,
Capability .
: , .
: , , - …
: .
: - .
: , . «-» ? ,
openat -
b/c/../.. ?
, , ? - , . , , ,
openat (d, “b/c/../..) «c» , - .

. , , , . «-», . , , . , , . ,
UID - ?
: , .
: , . , , «»
UID ? :
cap_enter UID . , . ? ?
: ,
UID , , , , , - .
: , . «»
UID . , ,
UID . , , , .
UID .
54:14
:
Kursus MIT "Keamanan Sistem Komputer". 6: «», 3.
, . ? ? ,
30% entry-level , : VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps $20 ? ( RAID1 RAID10, 24 40GB DDR4).
Dell R730xd 2 ? 2 Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 $249 ! Cara membangun infrastruktur gedung. kelas menggunakan server Dell R730xd E5-2650 v4 seharga 9.000 euro untuk satu sen?