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 terbaru. 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 3Kuliah 8: “Model Keamanan Jaringan”
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 9: "Keamanan Aplikasi Web"
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 10: “Eksekusi simbolik”
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 11: “Bahasa Pemrograman Web / Web”
Bagian 1 /
Bagian 2 /
Bagian 3 Nikolai Zeldovich: ayo mulai! Jadi, hari ini kita akan berbicara tentang pendekatan yang sangat berbeda dan mendasar untuk membuat aplikasi web yang aman. Ini tentang sistem yang disebut Ur / Web. Sekarang tamu kami Adam Chipala, yang merupakan penulis sistem ini, seorang profesor di MIT, akan memberi tahu Anda tentang sistem yang ia buat.
Adam Chipala: Saya ingin mendapatkan demonstrasi sesegera mungkin. Tetapi sebelumnya saya akan menunjukkan beberapa slide untuk menjelaskan isi dari sistem ini. Anda mungkin sudah mendapatkan beberapa ide tentang ini dari catatan kuliah hari ini.
Jadi apa itu Ur / Web? Selalu bermanfaat untuk memulai dengan penjelasan tentang arti judul topik. Ur / Web terutama merupakan bahasa pemrograman untuk membangun aplikasi web. Inilah yang dimiliki Web dalam namanya. Ini adalah semacam sistem tumpukan lengkap yang melakukan semua yang Anda butuhkan untuk membuat aplikasi web. Ur berarti bahasa pemrograman universal baru yang digunakan untuk mengimplementasikan fungsi-fungsi web ini.
Inti dari Ur / Web adalah bahwa alih-alih menggunakan bahasa pemrograman untuk tujuan umum, perpustakaan, dan kerangka kerja tradisional untuk membuat aplikasi web, semua ini sudah diintegrasikan ke dalam bahasa pemrograman Ur / Web kustom. Ini adalah bahasa yang pada saat runtime melibatkan kompilasi daripada interpretasi. Dan kompiler, dalam arti tertentu, memahami apa yang harus dilakukan aplikasi web. Ini akan menunjukkan kesalahan yang Anda buat, tidak seperti kompiler Java biasa, yang tidak mengerti di mana Anda memiliki kesalahan.
Ada tiga prinsip utama yang saya coba gunakan ketika mengembangkan bahasa ini: efisiensi pemrograman, keamanan, dan kinerja, terutama di sisi server, untuk penskalaan. Dalam konteks ini, yang kedua paling relevan.
Dalam kebanyakan kasus, pengguna aplikasi Anda tidak akan melihat masalah kecil dengan kinerja di sisi klien, tetapi bahkan masalah kecil di sisi server dapat membuat Anda membeli lebih banyak server daripada yang diperlukan.

Saat ini, sudah ada beberapa pengguna Ur / Web, namun tidak banyak dari mereka yang menggunakan bahasa pemrograman lain. Tapi setidaknya itu satu-satunya aplikasi web komersial yang merupakan pembaca RSS dan yang mendukung fitur-fitur eksotis seperti menampilkan komentar. Ada juga URL yang ditemukan oleh penutur bahasa Inggris non-pribumi yang sekarang menyesali nama tersebut. Ini disebut BazQux Reader, kombinasi dari keterampilan taktis komunitas peretas. Aplikasi ini sudah memiliki beberapa ribu pengguna berbayar. Dan sepertinya jauh lebih baik untuk menghadapinya daripada apa yang dilakukan dengan CSS. Ini adalah bukti bahwa ini dapat dilakukan dengan menggunakan Ur / Web.
Merasa bebas untuk mengganggu saya dengan pertanyaan kapan saja, meskipun saya mungkin masih belum tahu apa yang menyebabkan pertanyaan itu. Dengan demikian, keberhasilan utama penjualan Ur / Web adalah memiliki model pemrograman tingkat tinggi yang sangat berbeda dari Django, yang Anda ketahui dari kuliah sebelumnya. Dan dia memiliki kisah keamanan yang bagus.
Beberapa fungsi yang ingin Anda miliki untuk keamanan sudah terintegrasi ke dalam sistem, sehingga Anda tidak perlu bekerja keras untuk memastikan program Anda aman. Saya akan bercerita lebih banyak tentang ini dalam waktu dekat.
Selain itu, bahasa ini memberikan kinerja sisi server yang tinggi bahkan jika dibandingkan dengan alat pembuatan aplikasi web yang lebih populer, saya pikir Anda sudah pernah mendengarnya. Peringatannya adalah bahwa kita mungkin perlu mempelajari lebih banyak ide dari bahasa pemrograman fungsional seperti Haskell sebelum menggunakan Ur / Web.
Saya melihat pertanyaan dan jawaban untuk pelajaran ini, dan sekitar seperlima dari siswa mengeluh tentang bagian fungsional pemrograman yang sulit untuk diselesaikan. Saya minta maaf, tetapi ada begitu banyak ide bagus di dunia pemrograman fungsional sehingga akan sulit untuk tidak memulai dari saat itu, secara bertahap menambahkan hal-hal yang lebih kompleks ke dalamnya. Tetapi saya akan berusaha untuk tidak membutuhkan pengetahuan yang ketat tentang materi yang akan saya bicarakan hari ini.
Dengan demikian, model pemrograman ini sangat terkait erat dengan pengetikan statis. Dan ini bukan hanya pengetikan statis, seperti dalam bahasa Jawa, yang memiliki sistem tipe canggung yang relatif tidak ekspresif, tetapi pengetikan statis, mirip dengan yang digunakan dalam Haskell atau Apache Camel. Pengetikan ini adalah salah satu cara kompiler memahami apa yang Anda lakukan dan menangkap kesalahan dalam programnya.

Ternyata bahasa Ur utama tempat pembuatan Web / Ur memiliki sistem pengetikan statis yang sangat ekspresif. Begitu banyak yang dilakukan Ur / Web sebenarnya disediakan oleh perpustakaan tanpa dukungan kompiler khusus. Sebagai contoh, kami mengajarkan kepada kompiler bagaimana memeriksa tipe query SQL tanpa membuat aturan untuk memasukkan SQL ke dalam kompiler. Mereka dapat dikodekan sebagai pustaka dan menggunakan tipe standar validasi untuk memastikan pertanyaan SQL Anda mengikuti aturan SQL.
Yang paling relevan dalam konteks ini adalah memastikan tingkat keamanan yang tinggi - sebagian besar kerentanan keamanan yang paling umum tidak mungkin ketika pemrograman di Ur / Web. Anda selamanya dapat mengucapkan selamat tinggal pada serangan injeksi kode berbahaya dan serangan skrip lintas situs. Anda dapat mengizinkan nama bendera yang tampak menakutkan untuk melakukan hal-hal paling mengerikan yang dapat dilakukan dalam aplikasi web, bahkan jika Anda benar-benar menyebabkan semacam "ilmu hitam" menggunakan fungsi antarmuka orang lain.
Ada beberapa properti khusus keamanan lainnya yang akan saya bahas nanti. Performanya juga sangat bagus. Kompiler terutama dioptimalkan untuk membuat kode sumber untuk domain dan jauh lebih produktif daripada kode tulisan tangan di C.
Oleh karena itu, ia memahami apa yang dilakukan aplikasi web, dan dapat mengoptimalkan beberapa hal yang tidak dapat "ditangkap" oleh penyusun tipe umum tradisional. Oleh karena itu, kode sumber yang dijalankan oleh kompiler ini di server berhasil bersaing dengan kode C. Jika kita membandingkan biaya untuk memastikan kinerja dengan biaya tenaga kerja pemrograman dalam bahasa lain, kita melihat bahwa Ur / Web sangat menyederhanakan kehidupan programmer.
Slide berikut menunjukkan patokan cepat untuk kinerja kerangka kerja infrastruktur web pihak ketiga ini.
Ini adalah tangkapan layar dari hasil tes terakhir, di mana berbagai tugas pemrograman web dilakukan oleh kerangka kerja yang berbeda.

Anda dapat melihat bahwa Ur / Web mengambil tempat ke-4 dari 60 kerangka kerja yang berpartisipasi dalam pengujian kinerja. Setelah screenshot ini diambil, beberapa perbaikan dilakukan untuk kompiler. Oleh karena itu, saya berharap bahwa di babak selanjutnya, menurut hasil, ia akan maju sedikit. Pada dasarnya, ini adalah contoh sederhana menggunakan SQL untuk menghasilkan halaman HTML. Anda menerima sekitar 100.000 permintaan per detik dari server Web / Ur, dan ini lebih dari cukup untuk sebagian besar aplikasi. Adalah penting bahwa slide ini menunjukkan bahwa Anda dapat menggunakan model tingkat tinggi yang memberikan keamanan yang lebih besar dengan sedikit kehilangan kinerja ke kerangka kerja yang lebih umum.
Jadi, izinkan saya mulai dengan gambar-gambar yang mencerminkan kesan saya tentang apa yang dipikirkan programmer saat ini tentang menulis aplikasi web menggunakan kerangka kerja yang paling umum. Lalu saya akan menunjukkan kepada Anda sudut pandang lain yang disediakan oleh Ur / Web dan yang menurutnya, banyak hal yang salah berjalan tanpa kesalahan pada kerangka ini.
Gambar utama adalah server web tempat seluruh proses aplikasi Anda bergantung. Dan ada seluruh armada browser yang akan berinteraksi dengan server ini. Server akan tetap dalam kondisi tertentu, yang memastikan interaksi dengan semua browser ini.
Gambar yang biasa adalah bahwa browser mulai berinteraksi dengan server web dengan mengirimkannya permintaan HTTP, yang mencakup URL yang dibangun di dalamnya. Setelah itu, server web mengirim kembali halaman HTTP dan HTML ke browser. Namun, ada beberapa URL bawaan yang dapat digunakan untuk menentukan permintaan apa yang harus dibuat server web di masa depan.

Server web ini juga dapat berkomunikasi dengan database yang menyediakan penyimpanan persisten yang umum untuk semua pengguna aplikasi. Dalam hal ini, satu protokol SQL populer digunakan untuk percakapan antara jaringan server dan database. Inilah yang akan saya bicarakan ketika membahas kemungkinan Ur / Web.

Aplikasi web modern bukan hanya satu halaman instan. Setiap kali ada sesuatu yang berubah pada halaman, Anda membuat permintaan baru ke server, setelah itu seluruh halaman modul diganti. Ada gaya AJAX di mana browser kadang-kadang mengirim permintaan HTTP tambahan ke server web selama satu tampilan halaman dan menerima tanggapan yang diproses oleh program pengguna. Dalam hal ini, representasi data seperti XML dan JSON biasanya digunakan, serta format sederhana lainnya untuk bertukar data antara klien dan server.

Kemudian, ketika browser mengembalikan jawaban ini, ada beberapa kode JavaScript yang mengimplementasikan logika arbitrer untuk mengontrol antarmuka pengguna, yang diperlihatkan kepada pengguna.

Kode JavaScript ini dapat membaca respons yang diberikan server ke berbagai panggilan AJAX. Dia kemudian dapat memodifikasi halaman, yang ditampilkan terutama dengan mengubah variabel DOM global yang ditetapkan untuk halaman. Bagian mana pun dari program dapat secara sewenang-wenang memengaruhi variabel global ini, yang merupakan halaman. Seringkali bagian halaman dilihat oleh ID string yang dianotasi oleh simpul pohon yang menggambarkan dokumen.
Dan akhirnya, komplikasi lain adalah bahwa kadang-kadang kita ingin server web berkomunikasi dengan browser tanpa permintaan. Misalkan pesan email baru muncul, dan server web ingin memberi tahu browser tentang pesan baru ini.

Dan ada banyak cara untuk melakukan ini, misalnya, Comet - model operasi aplikasi web di mana koneksi HTTP yang konstan memungkinkan server web untuk mengirim data ke browser tanpa permintaan tambahan dari browser, atau protokol dupleks WebSockets, yang berkomunikasi antara browser dan server secara real time. Pada prinsipnya, ini adalah hal yang sama, tetapi dalam arah konseptual yang berbeda.
Jadi, saya ingin kembali ke layar semua protokol dan bahasa ini, setelah sebelumnya memilih beberapa bagian dengan warna kuning. Setelah membaca catatan kuliah, apakah ada yang menebak apa yang umum di antara semua bagian yang disorot ini dalam hal keamanan?
Siswa: semuanya adalah garis di mana Anda dapat meletakkan apa pun.
Profesor: dengan benar, dalam pendekatan yang diterima secara umum untuk pemrograman aplikasi web, semua hal ini adalah string. Dan bahasa pemrograman tidak mengerti bagaimana Anda menggunakannya, jadi tidak bisa membantu Anda menghindari kesalahan. Jadi, misalnya, menyajikan hal-hal ini sebagai string, Anda mendapatkan serangan injeksi kode. Sejauh yang saya tahu, serangan injeksi kode terutama hasil termasuk sebagai primitif dalam bahasa pemrograman Anda atau kerangka kerja Anda beberapa fungsi yang meluncurkan program dalam bentuk teks dalam bahasa yang agak ekspresif.
Ur / Web tidak memiliki interpreter internal untuk mengeksekusi string sebagai program. Dan ini membuat secara struktural tidak mungkin banyak kesalahan aplikasi web yang paling umum. Jadi semua objek yang dipilih ini akan menjadi tidak terlihat atau diwakili oleh tipe khusus, yang membuatnya jelas kode apa yang Anda hadapi. Namun, Anda tidak memiliki gips otomatis untuk string dalam jenis khusus ini.
Sekarang slide menunjukkan model alternatif yang disediakan oleh Ur / Web dan yang mengkompilasi menjadi model tradisional. Jadi itu berfungsi di semua browser yang tersebar luas. Tetapi programmer dapat memikirkannya pada level yang lebih tinggi dan menghindari potensi kesalahan yang mungkin terjadi pada gambar sebelumnya.

Jadi kami masih memiliki server web yang menanggapi permintaan. Dan kami masih memiliki armada peramban yang mencoba menggunakan server web. Tetapi perbedaan penting pertama adalah bahwa ketika browser ingin mulai menggunakan aplikasi web, itu tidak hanya mengirim serangkaian permintaan HTTP dengan URL.
Ini menjalankan fungsi kelas satu di server tanpa melibatkan klien. Dan kemudian server merespon tidak hanya dengan string teks protokol HTTP, tetapi dengan pohon dokumen yang diketik dengan ketat. Jadi, alih-alih string HTML, kami memiliki pohon, dalam bahasa pemrograman, objek kelas satu. Dan program memanipulasi pohon khusus ini, bukan string.
Masing-masing pohon ini berisi tautan, yang dengan sendirinya hanyalah catatan kaki untuk fungsi-fungsi lain yang dapat dipanggil di server. Ketika pengguna mengklik tautan ini, browser memilih fungsi dan secara konseptual menyebutnya di server, sebagai fungsi asli yang kami panggil untuk sampai ke titik ini.
Kami juga memiliki antarmuka basis data yang diakses oleh server web yang mengirimkan permintaan ke basis data. Dalam model Ur / Web, ini bukan hanya teks, tetapi pohon sintaksis SQL yang sangat diketik. Dan kemudian basis data akan merespons bukan dengan teks, tetapi dengan daftar catatan nilai eigen dalam bahasa pemrograman Ur yang kami gunakan.

Oleh karena itu, kita tidak perlu khawatir tentang salah mengonversi string ke representasi "asli" atau tentang mengonversi representasi "asli" ke format lain yang secara tradisional dapat disediakan oleh basis data kepada kita.
Ini adalah elemen kunci dalam bagaimana semantik Web / Ur membuat programmer lebih mudah bekerja dengan banyak skrip yang sebenarnya dapat terjadi saat aplikasi sedang berjalan.
Ada ide transaksi standar dalam dunia database relasional, di mana Anda dapat melakukan serangkaian operasi tanpa mengganggu mereka dengan utas paralel lainnya. Dan Ur / Web mengadaptasi model ini dan menanamkannya dalam semantik bahasa. Oleh karena itu, ketika satu fungsi dilakukan pada server atas nama klien, semua aksesnya ke database terjadi dalam bentuk blok atom tanpa gangguan yang disebabkan oleh semua permintaan simultan lainnya ke server yang sama. Anda tidak dapat menghindari perilaku ini, bahkan jika Anda mau, karena transaksi ini dibangun ke dalam bahasa pemrograman.
Dan mereka benar-benar membuatnya lebih mudah untuk menjalankan permintaan bersamaan dan berpotensi membantu menghindari masalah keamanan yang muncul ketika ada beberapa pergantian kombinasi permintaan tertentu.
Saya ingin mendapatkan jawaban atas salah satu pertanyaan yang disajikan dalam ringkasan kuliah ini dan yang membuat saya penasaran. Jadi, Ur / Web mendeteksi ketika suatu transaksi gagal karena masalah eksekusi paralel seperti jalan buntu, dan secara otomatis memulai kembali transaksi. Seseorang, menjawab pertanyaan, menulis bahwa ini dapat memfasilitasi peluncuran serangan keamanan, yang bergantung pada kegagalan transaksi karena masalah konkurensi. Saya hanya ingin bertanya kepada kelas, dapatkah seseorang memberikan contoh serangan seperti itu, seperti yang Anda bayangkan? Jika Anda memiliki sistem yang secara otomatis me-restart transaksi dalam kebuntuan, bagaimana ini dapat menyebabkan masalah keamanan? Saya tidak punya jawaban untuk pertanyaan ini, itulah sebabnya saya bertanya. Pertanyaan ini mungkin memiliki jawaban yang tidak jelas sehingga layak didiskusikan.
Siswa: mungkin ini dapat menyebabkan kegagalan layanan DoS? Jika dia akan memulai kembali transaksi yang Anda kirim, dan Anda tahu itu tidak akan berhasil, Anda dapat melanjutkan untuk memulai kembali proses ini dan coba lagi ...
Profesor: ok, lanjutkan ...
Siswa: jika Anda memaksa sistem untuk melakukan apa yang Anda tahu, itu tidak akan pernah berhasil, Anda dapat mencoba lagi dan lagi, dan, pada akhirnya, menyebabkan layanan gagal.
Profesor: benar, tetapi untuk melakukan ini, Anda perlu setidaknya dua utas bekerja pada saat yang sama. Meskipun ini berpotensi berhasil, Anda mungkin dapat meluncurkan serangan penolakan layanan. Dalam hal ini, Anda dapat mengambil keuntungan dari fakta bahwa penangan permintaan dihidupkan ulang berulang kali dan secara sengaja menyebabkan konflik, dan menggunakan ini sebagai cara untuk meningkatkan kekuatan serangan DoS selain apa yang bisa Anda dapatkan dengan bantuan model serangan tradisional jenis ini. Yah, aku bisa mempercayainya.
Siswa: apakah ini satu-satunya cara untuk menyebabkan kegagalan transaksi?
Profesor: ya, ini adalah satu-satunya cara untuk menyebabkan crash dan restart otomatis.
Siswa: mungkin ada pihak ketiga yang gagal secara bersyarat. Maka Anda bisa menggunakan ini untuk memantau perilaku pengguna lain.
: , - , - . . , , , . , . , , , . .
: , , , . , ?
: , , , .
: , , , ? , .
: , , . , .
: , , , , , ?
: , , , , , ? , – , . . , , .
: , , ?
: , , . , , , . , – .
, -. AJAX, .

, . , . , - .

, . , .
, Ur/Web , . — , . , , . — , , .
— , , , . , , , .
. Ur/Web- Ur/Web-. JavaScript, . , . .
, , . , . , , , . , , , .

. , , , , , . . , , JavaScript.
JavaScript , , , JavaScript .
, , Ur/Web- — . , , , . JSON. .

, , . , . . - .
, , , , . : «, », . «» .

, . , ?
: , ?
: RPC , . , .
— , . , , .
: ?
: HTTP-. , - , , , HTTP .
, , . . , Ur/Web. , .

, . , , URL- URL-. . , URL.
URL . - , URL. , HTML . HTML. , XML-, , .
- , . HTML- , .

, , . , , UTF-8. , .
, UTF-8, . - , Tangled Web ( ), Ur/Web, , .
Ngomong-ngomong, kapan saja selama demonstrasi ini, harap sarankan eksperimen yang muncul di pikiran Anda sehingga kami dapat mencoba di sistem saya kesalahan apa yang dapat ditangkap.Saya pikir ini adalah cara paling produktif untuk menunjukkan kemampuan Ur / Web.27:45 menitKursus MIT "Keamanan Sistem Komputer". Kuliah 11: Bahasa Pemrograman Web / Web, Bagian 2Versi lengkap dari kursus ini tersedia di
sini .
Terima kasih telah tinggal bersama kami. Apakah Anda suka artikel kami? Ingin melihat materi yang lebih menarik? Dukung kami dengan melakukan pemesanan atau merekomendasikannya kepada teman-teman Anda,
diskon 30% untuk pengguna Habr pada analog unik dari server entry-level yang kami buat untuk Anda: Seluruh kebenaran tentang VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps dari $ 20 atau bagaimana membagi server? (opsi tersedia dengan RAID1 dan RAID10, hingga 24 core dan hingga 40GB DDR4).
VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps hingga Desember secara gratis ketika membayar untuk jangka waktu enam bulan, Anda dapat memesan 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?