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 3Kuliah 7: “Kotak Pasir Klien Asli”
Bagian 1 /
Bagian 2 /
Bagian 3 Hari ini kita akan berbicara tentang sistem yang disebut
Native Client , yang digunakan
Google di dunia nyata. Ini adalah teknologi kotak pasir untuk menjalankan kode pada platform yang berbeda. Ini digunakan di
browser Chrome , memungkinkan aplikasi web untuk menjalankan kode mesin sewenang-wenang. Ini sebenarnya adalah sistem yang sangat keren. Ini juga menggambarkan kemampuan isolasi dan kotak pasir khusus atau teknik pemisahan hak istimewa yang disebut
isolasi kesalahan perangkat lunak ,
isolasi kesalahan perangkat lunak , tanpa menggunakan sistem operasi atau mesin virtual untuk membuat kotak pasir.

Sebagai gantinya,
Native Client mengambil pendekatan yang sama sekali berbeda untuk melihat instruksi spesifik dalam file biner untuk mengetahui apakah aman untuk menjalankannya atau tidak. Karena itu, sebelum kita mulai mempelajari detail teknis dari sistem, mari kita cari tahu mengapa orang-orang ini benar-benar ingin menjalankan kode mesin? Minat khusus mereka dalam menerapkan solusi ini di browser web, di mana Anda sudah dapat menjalankan kode
JavaScript ,
Flash Player dan beberapa proses lainnya. Mengapa orang-orang ini sangat bersemangat tentang kemampuan untuk menjalankan kode pada platform
x86 ? Setelah semua, tampaknya ini adalah langkah mundur.
Hadirin: mereka ingin mendapatkan perhitungan yang sangat cepat.
Profesor: ya, ini adalah satu keuntungan besar dari kode mesin. Bahkan jika itu mungkin tidak aman dalam jangka panjang, itu memang memberikan kinerja tinggi. Segala sesuatu yang tidak akan Anda lakukan dalam
JavaScript , misalnya, menulis sebuah program dan mengompilasinya, akan benar-benar bekerja lebih cepat. Apakah ada alasan lain?
Pemirsa: Menjalankan Kode yang Ada?
Profesor: benar. Penting bahwa tidak semuanya dapat ditulis dalam
JavaScript . Jadi jika Anda memiliki aplikasi yang sudah ada, atau, dalam terminologi industri, kode "warisan" yang ingin Anda jalankan di Internet, ini sepertinya solusi yang bagus. Karena Anda bisa mengambil perpustakaan yang ada, misalnya, semacam "mesin" grafis yang kompleks yang peka terhadap kinerja dan banyak hal rumit lainnya yang tidak ingin Anda implementasikan kembali, dan ini akan menjadi solusi yang baik.
Jika Anda hanya memprogram aplikasi web baru, haruskah Anda menggunakan klien Anda sendiri jika Anda tidak terlalu peduli tentang warisan atau kinerja?
Hadirin: Maka Anda tidak perlu menggunakan
JavaScript .
Profesor: ya, itu alasan yang bagus. Jika Anda tidak suka
JavaScript , maka Anda tidak perlu menggunakannya, kan? Anda dapat menggunakan, misalnya,
C , Anda dapat menjalankan kode
Python , menulisnya di
Haskell , dalam bahasa apa pun yang menurut Anda lebih cocok.
Jadi, ini adalah daftar motivasi yang cukup meyakinkan untuk menjalankan kode Anda sendiri di peramban, dan cukup sulit untuk mendapatkan hak atas tindakan semacam itu. Hanya dalam sedetik, kami akan mempertimbangkan detail teknis, dan sekarang saya ingin menunjukkan kepada Anda demo pelatihan sederhana yang saya terima dari situs web
Native Client .

Ini cukup sederhana, karena Anda dapat mengambil
C ++ atau program
C dan menjalankannya di browser. Anda dapat melihat halaman web ini, yang merupakan file
HTML yang memiliki banyak kode
JavaScript di dalamnya.

Alasan keberadaan kode
JavaScript ini adalah memungkinkan Anda untuk berinteraksi dengan bagian-bagian
Klien Asli . Mengenai operasi browser, arti dari solusi semacam itu adalah Anda memiliki semacam halaman web yang berisi kode
JavaScript . Dan solusi ini berfungsi dengan keistimewaan halaman dan memungkinkan Anda untuk melakukan berbagai hal di halaman web itu sendiri, misalnya, berkomunikasi dengan jaringan dalam beberapa keadaan.
Native Client memungkinkan Anda menjalankan modul di dalam browser, sehingga kode
JavaScript dapat berinteraksi dengannya dan menerima respons. Ini menunjukkan beberapa kode
JavaScript yang diperlukan oleh
Native Client untuk berinteraksi dengan modul
NaCl spesifik yang akan kita jalankan.

Dan Anda dapat mengirim pesan ke modul ini. Bagaimana ini dilakukan? Anda mengambil objek modul ini dalam
JavaScript , menyebutnya
postMessage, dan dengan demikian mendukung pengiriman pesan ini ke modul
NaCl . Ketika modul
NaCl merespons, ia akan meluncurkan fungsi pesan dalam
JavaScript . Dan dalam kasus khusus ini, sebuah dialog muncul di browser.

Jadi di sisi
JavaScript , ini adalah antarmuka halaman web yang cukup sederhana. Satu-satunya hal yang perlu Anda lakukan adalah menetapkan modul
NaCl dengan cara ini. Artinya, Anda cukup memasukkan modul dengan
ID tertentu di
sini . Yang paling menarik di sini adalah kode
halo dengan ekstensi
nmf . Dia hanya mengatakan bahwa ada file yang dapat dieksekusi yang perlu Anda unduh dan mulai bekerja dengannya di lingkungan
NaCl .

Kode asli ini benar-benar seperti kode C ++ lainnya yang dapat Anda tulis. Bagian yang menarik adalah fungsi pemrosesan pesan
HandleMessage ini.

Ini adalah kelas
C ++ , dan setiap kali kode
JavaScript mengirim pesan ke kode
asli , itu akan melakukan fungsi ini. Ia melakukan pemeriksaan
if (message = = 'hello') . Jika demikian, itu akan membuat semacam garis respons dan mengirimkannya kembali. Ini hal yang sangat sederhana. Tetapi secara spesifik, mari kita coba jalankan dan lihat apa yang terjadi.
Kami dapat membangun dan menjalankan server web kecil yang akan melayani halaman ini dan modul
Native Client . Di sini saya bisa pergi ke
URL ini, dan di sini kita melihat halaman web
NaCl . Modul menerima pesan selamat datang dari
JavaScript , membalas dengan string dalam
JavaScript , dan kode
JavaScript memicu dialog sembulan yang berisi respons ini.

Jadi itu benar-benar berfungsi.
Coba cari tahu apakah kami dapat menyebabkan
Native Client mogok. Saya harap tidak, tetapi kita dapat mengambil kode ini dan buffer ini dan menulis banyak omong kosong di dalamnya, misalnya, 65536 dan melihat apa yang terjadi.

Saya harap ini seharusnya tidak menyebabkan browser saya mogok karena
Native Client mencoba memberikan isolasi. Tapi mari kita lihat apa yang terjadi.
Mulai ulang server web. Kami melihat bahwa pintu masuk ke modul masih berhasil, browser kami tidak terluka. Namun, perpesanan dengan klien tidak terjadi, sehingga kotak dialog tidak ada. Mari kita lihat konsol
JavaScript di bagian bawah halaman dan lihat bahwa modul
Native Client memberi tahu kita tentang kegagalan modul
NaCl .

Ada kemungkinan bahwa argumen yang saya masukkan menyebabkan buffer overflow atau akses ke beberapa alamat yang salah, tetapi dalam kasus apa pun, modul
NaCl benar-benar mampu mengisolasi kerusakan memori yang tidak disengaja sedemikian rupa sehingga tidak mempengaruhi browser.
Ini adalah demonstrasi cepat dari sistem ini dalam bentuk di mana Anda dapat menggunakannya sebagai pengguna akhir atau pengembang. Mari kita lihat beberapa contoh lagi. Misalnya, bagaimana
Native Client akan bekerja, atau mengapa kita membutuhkan ini saja, dan bukan desain alternatif.
Karena itu, jika tujuan Anda adalah untuk mengisolasi kode Anda sendiri, ada beberapa alternatif yang dapat Anda gunakan untuk melakukannya. Bahkan, orang-orang dulu memiliki masalah menggunakan kode lama dan bahasa lain sebelum
Native Client muncul. Mereka menyelesaikannya dengan berbagai cara, yang mungkin tidak seaman dan
semudah Klien Asli , tetapi memberikan kemampuan isolasi yang sama.
Jadi apa yang harus Anda lakukan jika Anda benar-benar ingin menjalankan kode mesin di browser? Salah satu opsi adalah kepercayaan pada pengembang. Mungkin varian dari pendekatan ini adalah Anda bertanya kepada pengguna apakah ia ingin menjalankan beberapa kode di browser-nya atau tidak.
Jadi, semua orang secara kasar memahami rencana macam apa ini, kan? Misalnya, alih-alih semua strategi kompilasi
Native Client ini, saya bisa membuat program
C , menjalankannya di browser, dan dia akan bertanya kepada saya apakah saya ingin menjalankan situs ini atau tidak? Dan jika saya mengklik "ya", tanpa sengaja "memotong" dalam memori browser, itu akan macet. Jadi itu mungkin, bukan? Ini, tentu saja, menyelesaikan semua masalah ini, tetapi apa yang salah dengan itu?
Saya pikir yang buruk adalah bahwa solusi ini tidak aman. Ini adalah salah satu cara untuk menyiasati sistem ini dan banyak sistem lainnya.
Microsoft memiliki sistem yang disebut
ActiveX yang pada dasarnya mengimplementasikan rencana ini. Anda bisa mengirim binari ke
IE , browser di komputer Anda, dan sampai mereka kembali dengan sertifikat dari pengembang tertentu yang ditandatangani oleh, katakanlah,
Microsoft atau orang lain, browser tidak akan menjalankan kode Anda. Apakah Anda pikir ini adalah rencana yang bermanfaat?
Hadirin: Ini masalah kepercayaan!
Profesor: ya, benar. Anda benar-benar perlu sedikit percaya bahwa pengembang hanya akan menandatangani "binari" yang tidak akan melakukan kesalahan. Tetapi seringkali tidak mungkin untuk mengetahui apakah ini adalah hal yang buruk atau tidak, jadi mereka hanya menulis kode
C dan menandatanganinya secara membabi buta tanpa melakukan banyak pekerjaan. Dalam hal ini, Anda mungkin akan mendapatkan masalah tertentu di masa depan.
Demikian juga, keputusan untuk bertanya kepada pengguna apakah ia benar-benar ingin menjalankan suatu hal tidak menjamin keamanan sama sekali. Bahkan jika pengguna ingin berhati-hati, sebenarnya tidak jelas bagaimana ia harus memutuskan? Misalkan saya benar-benar ingin mengerti jika saya dapat membiarkan program ini bekerja? Saya diberitahu bahwa semuanya baik-baik saja, mungkin itu dibuat oleh pengembang terkemuka
Google.com atau
Microsoft.com . Namun, ini adalah file executable
foo.exe dan saya benar-benar tidak tahu apa yang ada di dalamnya. Bahkan jika saya membongkar kodenya, akan sangat sulit untuk mengatakan apakah dia akan melakukan sesuatu yang buruk atau tidak. Oleh karena itu, sangat sulit bagi pengguna untuk memutuskan apakah menjalankan kode aman untuk sistem.

Dengan demikian,
Klien Asli dapat bertindak sebagai mekanisme di mana pengguna bisa mendapatkan kepercayaan apakah mereka harus mengatakan ya atau tidak pada suatu program.
Jadi dalam praktiknya, saya pikir, harus ada opsi yang diusulkan oleh dosen tamu kami Paul Yang minggu lalu. Dia menyarankan untuk menjalankan plugin "
play extension ", atau "play extension" di
browser Chrome . Yaitu, ternyata sebelum memulai ekstensi apa pun, termasuk
Native Client , Anda perlu mengeklik hal ini. Di satu sisi, ini sama dengan meminta pengguna. Tetapi dalam kasus ini, bahkan jika pengguna memutuskan untuk menjawab "ya", sistem akan tetap aman, karena
Klien Asli akan dimasukkan dalam pekerjaan. Dalam pengertian ini, kami memiliki mekanisme keamanan ganda: pertama-tama tanyakan kepada pengguna, dan kemudian, dengan jawaban positif, mulai klien kotak pasir, yang tidak akan membuat peramban mogok.
Dengan demikian, pendekatan lain yang harus diterapkan adalah menggunakan kotak pasir, diimplementasikan melalui OS atau perangkat keras, atau untuk mengisolasi proses. Inilah yang kami periksa dalam 2 kuliah terakhir.
Mungkin Anda akan menggunakan mekanisme isolasi
Unix . Jika Anda memiliki sesuatu yang lebih kompleks, Anda akan menggunakan
FreeBSD atau
Capsicum . Ini bagus untuk mengisolasi sepotong kode di kotak pasir, karena Anda dapat membatasi kemampuannya.
Linux memiliki mekanisme serupa yang disebut
Seccomp , yang kami bahas secara singkat dalam kuliah terakhir, ini juga memungkinkan Anda melakukan hal-hal seperti itu.
Dengan demikian, sudah ada mekanisme untuk menulis kode secara terpisah di mesin Anda. Mengapa orang-orang ini menentang menggunakan solusi yang ada ini? Sepertinya mereka “menciptakan roda” untuk beberapa alasan. Jadi apa yang sedang terjadi?
Hadirin: mungkin mereka ingin meminimalkan kesalahan?
Profesor: ya, mereka tidak mempercayai sistem operasi. Mungkin mereka sebenarnya khawatir dengan kesalahan OS. Sangat mungkin bahwa kernel
FreeBSD atau kernel
Linux mengandung cukup banyak kode
C yang tidak mereka inginkan atau tidak dapat memeriksa kebenarannya, bahkan jika mereka menginginkannya. Dan di
Capsicum atau
Seccomp, pekerjaan dilakukan berdasarkan rencana isolasi, sehingga cukup bahwa kernel hanya memiliki sepotong kecil kode yang setia, sehingga sandbox mempertahankan dan menerapkan isolasi.
Pemirsa: karena Anda mendapatkan lebih banyak cara untuk menggunakan browser, Anda harus berurusan dengan berbagai OS, seperti iOS dan Android, dan akses ...
Profesor: ya, sebenarnya, pertimbangan menarik lainnya adalah bahwa biasanya banyak sistem operasi memiliki kesalahan. Selain itu, pada kenyataannya, sistem operasi yang berbeda dalam beberapa hal tidak kompatibel satu sama lain. Ini berarti bahwa setiap OS memiliki mekanisme sendiri, seperti yang ditunjukkan di sini:
Unix memiliki
Capsicum ,
Linux memiliki
Seccomp , tetapi ini hanyalah variasi dari
Unix .
Mac OS memiliki
Seatbelt ,
Windows memiliki sesuatu yang lain, dan daftarnya berlanjut.
Jadi pada akhirnya, setiap platform yang Anda gunakan memiliki mekanisme isolasi sendiri. Dan yang sebenarnya tidak terlalu mengganggu mereka adalah mereka harus menulis kode yang berbeda untuk
Mac ,
Windows, dan
Linux . Tetapi lebih dari itu, itu mempengaruhi bagaimana Anda menulis hal-hal ini untuk bekerja di dalam kotak pasir. Karena di dalam
Native Client, Anda benar-benar menulis sepotong kode yang menjalankan cara yang sama dengan kode OS "asli", dengan cara yang sama seperti yang dijalankan oleh kode
Apple , kode
Windows, atau kode sistem
Linux .
Dan jika Anda menggunakan mekanisme isolasi ini, maka mereka sebenarnya memberlakukan batasan berbeda pada program yang ditempatkan di kotak pasir. Jadi, Anda harus menulis satu program yang akan berjalan di dalam sandbox
Linux , program lain untuk dijalankan di dalam sandbox
Windows , dan sebagainya.
Itu yang benar-benar tidak bisa diterima oleh mereka. Mereka tidak mau berurusan dengan masalah semacam ini. Pertimbangan lain apa yang Anda miliki?
Audiens: mungkin kinerja sistem. Karena jika Anda menggunakan
Capsicum , Anda perlu menjaga sumber daya yang cukup untuk memastikan bahwa proses bekerja di dalam kotak pasir. Di sini mereka mungkin menghadapi masalah yang sama.
Profesor: ya, itu benar. Paket isolasi kecelakaan perangkat lunak sebenarnya sangat intensif sumber daya, yang pada tingkat OS dapat menyebabkan kurangnya sumber daya untuk mendukung kotak pasir. Ternyata di
Native Client mereka sendiri
, mereka benar-benar menggunakan kotak pasir dan kotak pasir OS mereka untuk memberikan keamanan tambahan. Jadi, pada kenyataannya, mereka tidak menang dalam kinerja implementasi mereka, meskipun mereka mungkin bisa.
Hadirin: mungkin mereka ingin mengendalikan segalanya. Karena mereka dapat mengontrol apa yang terjadi di browser, tetapi jika mereka mengirimnya ke komputer klien di OS, mereka tidak tahu apa yang bisa terjadi di sana.
Profesor: dapat dikatakan bahwa ya, OS mungkin memiliki kesalahan atau tidak mengelola kotak pasir dengan cukup baik. Atau antarmuka sedikit berbeda, jadi Anda tidak tahu apa yang akan diungkapkan oleh sistem operasi.
Pemirsa: dan ini tidak akan mencegah kode melakukan beberapa hal buruk. Ada banyak hal yang dilakukan kode, misalnya, Anda ingin melakukan analisis statis, tetapi loop kode mencegah program untuk bertindak.
Profesor: pada kenyataannya, sangat sulit untuk menentukan apakah ada proses berulang yang tak terhingga atau tidak, tetapi pada prinsipnya, pendekatan ini memungkinkan Anda untuk menangkap beberapa masalah kode. Saya pikir satu contoh yang sangat menarik, yang saya tidak tahu sampai saya membaca artikel mereka, menunjukkan bahwa orang-orang ini khawatir tentang kesalahan perangkat keras, dan bukan hanya tentang kerentanan OS yang dapat dijalankan oleh kode. Misalnya, prosesor itu sendiri memiliki beberapa instruksi yang dapat menyebabkannya membeku atau me-restart komputer. Pada dasarnya, peralatan Anda seharusnya tidak memiliki kesalahan seperti itu, karena sistem operasi bergantung pada kenyataan bahwa perangkat keras akan membantu mencapai kernel untuk menghilangkan konsekuensi dari kesalahan pengguna.
Tetapi ternyata prosesornya sangat kompleks sehingga mereka memiliki kesalahan, dan orang-orang ini mengatakan mereka menemukan bukti tentang ini. Jika ada beberapa instruksi kompleks yang tidak dapat diterima oleh prosesor, itu akan berhenti alih-alih memproses inti sistem. Ini buruk. Saya pikir ini bukan bencana jika saya hanya menjalankan beberapa hal bermanfaat di laptop saya, tetapi jauh lebih buruk jika komputer macet ketika saya mengunjungi semacam halaman web.
Dengan demikian, mereka ingin membuat tingkat perlindungan yang lebih tinggi untuk modul
Native Client daripada yang menyediakan isolasi di tingkat OS, bahkan bebas dari kesalahan perangkat keras. Jadi soal keamanan, mereka berperilaku seperti paranoid, termasuk masalah keamanan perangkat keras.
Sekarang mari kita lihat bagaimana
Native Client sebenarnya mengisolasi proses di kotak pasir. Dengan demikian,
Klien Asli mengambil pendekatan yang berbeda, yang dapat disebut "mengisolasi kegagalan perangkat lunak."

Rencananya bukan bergantung pada kenyataan bahwa sistem operasi atau peralatan akan memeriksa hal-hal saat program sedang berjalan, tetapi mengandalkan mereka untuk meninjau instruksi di muka dan memutuskan bahwa mereka dapat dieksekusi sepenuhnya dengan aman. Jadi, sebenarnya, cukup untuk melihat file biner untuk memeriksa semua instruksi yang mungkin dan melihat apakah mereka akan aman atau tidak aman. Setelah Anda memutuskan bahwa semuanya akan aman, Anda dapat memulai proses karena Anda tahu bahwa itu terdiri dari hal-hal yang aman dan tidak akan ada kegagalan.
Jadi apa yang akan mereka lakukan adalah melihat hampir semua instruksi dalam kode biner yang dikirim ke browser dan memutuskan apakah instruksi spesifik aman atau tidak.
? . ? , , .
-
ALU , , . , . , , . , , , .

? , , . , , , . , «» , ? .
, , , - , . «» , - . , «» , . , , , , .
, ( ) . . ,
if , , . , , – .
, , , . . , , . , , , , «» .

. , , . , , .
, , , , - , . , , , , .
Trusted Service Runtime , . .
Google . ,
NaCl .
, , , , , — , — . , .
: , ,
NaCl ? , ?
: , , ,
NaCl . ,
malloc pthread_create ,
Trusted Service Runtime . - ,
Unix , - . , ,
JavaScript -.
RPC JavaScript , .

, ,
NaCl Unix -, - , -.
. ,
Native Client . –
Native Client ?
,
Native Client . , , . , ,
x86 . , , «», .
, . , , 0 256 . , , , , .
? , ?
: , .
: , . , , . , , ? , ?
: .
: !
: -, , . .
: , . , . , , . , , ,
Trusted Service Runtime . , ,
Trusted Service Runtime , . , .
, ,
NaCl , . , 0. ,
NaCl . .
28:00
:
Kursus MIT "Keamanan Sistem Komputer". 7: « Native Client», 2.
, . ? ? ,
30% entry-level , : VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps $20 ? ( RAID1 RAID10, 24 40GB DDR4).
3 Dell R630 —
2 Intel Deca-Core Xeon E5-2630 v4 / 128GB DDR4 / 41TB HDD 2240GB SSD / 1Gbps 10 TB — $99,33 , ,
di sini .Dell R730xd 2 kali lebih murah? Hanya kami yang memiliki 2 x Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 TV dari $ 249 di Belanda dan Amerika Serikat! Baca tentang Cara Membangun Infrastruktur Bldg. kelas menggunakan server Dell R730xd E5-2650 v4 seharga 9.000 euro untuk satu sen?