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 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 3Kuliah 12: Keamanan Jaringan
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 13: "Protokol Jaringan"
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 14: "SSL dan HTTPS"
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 15: “Perangkat Lunak Medis”
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 16: “Serangan Saluran Samping”
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 17: “Otentikasi Pengguna”
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 18: “Penjelajahan Pribadi di Internet”
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 19: “Jaringan Anonim”
Bagian 1 /
Bagian 2 /
Bagian 3Kuliah 20: "Keamanan Ponsel"
Bagian 1 /
Bagian 2 /
Bagian 3 Sebelum memulai ulasan terperinci dari sistem, mari kita coba mencari tahu satu hal yang menarik. Mengapa orang-orang ini mengembangkan desain modular yang sama sekali baru untuk aplikasi Android? Ada aplikasi desktop, ada aplikasi web, mengapa mereka perlu menemukan cara baru untuk menulis perangkat lunak? Memang, dalam arti tertentu, ini membingungkan pengembang. Karena, katakanlah, saya terbiasa menulis program kecil saya di C dengan fungsi utama, dan sekarang saya melihatnya dan berkata: “apa-apaan? Apa yang akan saya lakukan dengan semua ini? Saya harus mendefinisikan empat jenis komponen dan mengirim niat, alih-alih menggunakan struktur-C dan menulis kode secara teratur? ”

Jadi apa pro dan kontra dari model aplikasi yang ada? Kami memiliki aplikasi desktop dan Internet, mengapa kami membutuhkan aplikasi jenis ketiga?
Siswa: tetapi modelnya telah benar-benar berubah, bukan? Saya pikir Anda tidak boleh terlalu memercayai pengembang aplikasi desktop seperti pengembang aplikasi untuk perangkat seluler. Selain itu, Anda memiliki pengguna yang lebih berpengalaman dibandingkan dengan jumlah pengguna yang berpengalaman dari aplikasi komputer, dan mereka ingin menggunakan sejumlah aplikasi yang terisolasi satu sama lain.
Profesor: sangat mungkin. Jadi, apakah Anda berpikir bahwa dalam hal aplikasi desktop, kita seharusnya tidak terlalu mempercayai pengembangnya?
Siswa: tentu saja, karena selalu ada putra atau sepupu yang lebih berpengalaman yang akan membantu Anda memecahkan masalah dengan program komputer, tetapi hal-hal berbeda dengan telepon.
Profesor: Tentu saja, keren bahwa ponsel tidak perlu sepupu untuk merawatnya. Tetapi dari sudut pandang keamanan, program komputer memiliki satu karakteristik properti - menginstal aplikasi baru di komputer dapat menjadi proses yang agak memakan waktu. Mungkin ini tidak sepenuhnya benar, karena Anda selalu dapat mengklik file yang dapat dieksekusi dan memulai instalasi, tetapi saya tidak berpikir bahwa orang secara teratur menginstal aplikasi desktop. Bagaimanapun, sebagai aturan, Anda memiliki serangkaian perangkat lunak yang Anda jalankan.
Dalam hal ini, fitur khas dari aplikasi web adalah peluncurannya yang mudah. Anda hanya pergi ke situs tersebut, dan Anda tidak perlu melakukan apa pun kecuali mengklik tautannya, dan sekarang Anda sudah berada di beberapa situs baru di bawah kendali beberapa aplikasi baru. Jadi ini adalah properti aplikasi web yang cukup bagus.

Fitur buruk dari aplikasi komputer adalah kurangnya isolasi aplikasi. Mungkin ini dalam beberapa cara karena kenyataan bahwa ketika Anda menginstal aplikasi seperti itu, Anda sepenuhnya percaya semua yang ada di komputer Anda. Bahkan, tidak ada isolasi antara aplikasi yang Anda instal di laptop Anda dan program atau data lain yang sudah ada, sedangkan dalam kasus aplikasi web ada beberapa isolasi yang masuk akal. Selama Anda mempercayai Kebijakan Asal yang Sama, Anda aman. Oleh karena itu, cukup aman untuk mengunjungi beberapa situs web sewenang-wenang dan mulai menggunakan aplikasinya. Jika aplikasi ini tidak memanfaatkan kerentanan di browser Anda, maka itu tidak akan mengganggu operasi situs yang terbuka di tab browser lain.

Aplikasi web tampaknya masih dalam posisi yang lebih baik, karena mudah digunakan dan diisolasi. Mengapa orang-orang ini tidak menggunakan aplikasi web Android?
Siswa: aplikasi web tampaknya mengandung sistem operasi, yaitu, misalnya, ada OS Firefox, yang pada dasarnya adalah OS Internet seluler.
Profesor: pasti. Anda mengklaim bahwa orang-orang ini sebenarnya salah. Mereka tidak seharusnya membuat OS Android baru, tetapi cukup membuat browser web raksasa untuk ponsel Anda.
Siswa: setidaknya Mozilla telah menunjukkan bahwa ini mungkin.
Profesor: well, itu cukup adil. Paling tidak, lebih bijaksana untuk mengikuti jalur pembuatan aplikasi web daripada sistem desktop, setidaknya untuk ponsel.
Siswa: karena Anda melakukan panggilan telepon dari aplikasi web, Anda perlu membuat API yang benar-benar baru untuk mengomunikasikan antarmuka aplikasi web dengan telepon.
Profesor: pasti. Dengan demikian, aplikasi web memiliki satu batasan yang dapat diperbaiki: kurangnya API untuk beberapa perangkat seluler. Tetapi ada lebih sedikit aplikasi seperti itu. Misalnya, untuk kamera atau navigator GPS, mereka perlahan, tetapi masih menambahkan antarmuka yang sesuai untuk aplikasi web. Tetapi di sana, dalam aplikasi web, mungkin masih belum ada API untuk melakukan panggilan, mengirim pesan SMS dan sejenisnya.
Kerugian lain dari aplikasi web adalah ketidakmampuan untuk membangun akses terbatas ke aplikasi lain. Kami berbicara tentang niat tersirat di Android, di mana Anda bisa mengatakan: “Saya ingin melihat gambar JPEG ini, tetapi siapa yang tahu aplikasi mana yang akan membukanya? Entah saya ingin melihat file PDF ini, atau berbagi foto ini dengan teman saya yang baru saja saya ambil dengan kamera saya, tetapi saya tidak tahu aplikasi email mana yang akan digunakan. " Jadi mari kita tanyakan monitor tautan untuk menemukan saya beberapa program email yang akan mengirim foto ini. Pada perangkat Android, ini mudah dilakukan, tetapi dalam kasus aplikasi web itu akan menyebabkan kesulitan besar, karena setiap interaksi Anda harus menautkan ke URL tertentu.

Jadi jika Anda tidak tahu penampil PDF mana yang digunakan seseorang, maka Anda tidak akan tahu URL mana yang dapat Anda gunakan untuk melihat file Anda.
Siswa: mungkin kelemahan dari aplikasi web adalah bahwa JavaScript sangat sulit dibaca?
Profesor: ya, memang, ketidaknyamanan lainnya adalah mereka semua ditulis dalam JavaScript. Jadi berpotensi ini mungkin tidak terlalu baik dalam hal kinerja, mungkin sulit untuk memahami apa yang sedang dilakukan program, mungkin sulit untuk dikompilasi secara efisien, dan sebagainya.
Mari kembali ke program komputer. Fitur berguna dari aplikasi desktop adalah kemampuan untuk berbagi file. Semua file Anda tersedia di setiap aplikasi karena Anda baru saja membagikannya. Dengan demikian, Anda memiliki akses mudah ke data apa pun yang tersedia di komputer.

Apa yang agak sulit diimplementasikan di Android mudah dilakukan di aplikasi komputer. Dalam hal OS desktop, jika saya ingin mengkompilasi perangkat lunak, saya akan menjalankan MAKE, menjalankan GCC dan, mungkin, beberapa program lain, dan semuanya akan bekerja pada kode sumber C yang sama di direktori yang sama. Ini jauh lebih sulit dilakukan di Android, di mana data dikaitkan dengan aplikasi utama, yang disimpan oleh penyedia konten. Jadi Anda harus mengotak-atiknya, pertama menggunakan repositori kode sumber, dan kemudian menginstal kompiler C, membuat program, assembler dan banyak lagi. Jauh lebih sulit untuk membuat mereka bekerja bersama.
Ini dapat dilakukan dengan melewati beberapa batasan Android, tetapi dalam hal apa pun lebih rumit daripada pada sistem desktop.
Mahasiswa: Saya pikir mengoptimalkan aplikasi web cukup sulit, mereka dibatasi oleh penggunaan RAM dan kekuatan pemrosesan.
Profesor: ya, prinsip-prinsip mengoptimalkan aplikasi web dan aplikasi desktop berbeda. Saya percaya bahwa kekurangan aplikasi web, setidaknya pada saat mereka mendesain Android, adalah bahwa meluncurkan aplikasi web secara offline sangat sulit. Jika ponsel Anda menangkap sinyal jaringan yang lemah, maka beberapa aplikasi akan sulit untuk diluncurkan, terutama jika beberapa bagiannya keluar dari cache. Namun, saya pikir, seperti yang Anda perhatikan, aplikasi web, meskipun lambat, "mengejar" Android dengan menghilangkan batasan saat ini. Jadi sangat mungkin bahwa aplikasi web akan berfungsi sebagai model yang masuk akal untuk meluncurkan platform operasi telepon baru. Tetapi lima tahun yang lalu mereka tidak cukup baik untuk ini.
Tetapi meskipun ada kekurangan, sekarang akan lebih mudah untuk "mendorong" aplikasi web ke dalam ceruk yang ditempati oleh Android, daripada mulai mengembangkan OS mobile baru dari awal. Oleh karena itu, saya pikir kita masih dapat berbicara tentang keberhasilan apa yang telah dilakukan Android, walaupun mungkin hari ini Anda lebih suka untuk tidak melakukannya dengan cara ini.
Saya pikir dalam hal isolasi, keamanan sistem Android jauh lebih tinggi. Seperti yang saya sebutkan, Android mengandalkan kernel Linux untuk mengisolasi aplikasi dari satu sama lain. Platform Android sebenarnya menetapkan ID pengguna, sehingga App1 ini akan memiliki UID 1001, App 2 akan memiliki UID 1002, dan monitor tautan, yang biasanya memiliki hak akses root, akan memiliki UID 0. Jadi kernel Linux bertanggung jawab untuk Pemisahan aplikasi dari satu sama lain.

Pada dasarnya, interaksi antara pengidentifikasi pengguna terjadi melalui niat Intent. Ada banyak lagi nuansa tentang bagaimana kernel Linux mengontrol aplikasi menggunakan UID, kita akan membicarakannya sedikit nanti.
Satu pertanyaan menarik: mengapa orang-orang ini memilih Java? Apa peran Java dalam Android? Mengapa itu dibutuhkan sama sekali? Jika kita menulis semua aplikasi dalam C dan bukan Java, atau, misalnya, Assembler, dapatkah ada yang rusak?
Siswa: jika Anda memiliki kerentanan, maka penggunaan bahasa ini dapat menyebabkan distorsi indikator yang penting bagi sistem.
Profesor: ya, ini bisa terjadi, misalnya, buffer overflow dapat terjadi dalam aplikasi. Apa lagi
Siswa: kebingungan dengan izin dapat terjadi.
Profesor: dengan izin apa?
Mahasiswa: dengan latensi, latensi.
Profesor: mari kita lihat lebih dekat. Jadi, seperti yang kami katakan, monitor tautan memeriksa tag untuk kami dan benar-benar menyimpan dalam sistem Android daftar semua aplikasi yang diinstal bersama dengan tag yang sesuai dengan semua aplikasi ini. Jadi, Anda mungkin tidak ingin monitor tautan membuat kesalahan, apa pun bahasa yang digunakan. Jadi memiliki monitor tautan yang ditulis dalam bahasa jenis-aman adalah solusi yang baik. Saya suka Java karena itu adalah jenis bahasa yang aman dengan fitur yang baik. Tetapi bahkan jika aplikasi ditulis dalam C dan buffer overflows terjadi di dalamnya, itu masih tidak dapat merusak label di monitor tautan. Jadi itu tidak akan menjadi masalah besar.
Siswa: mungkin ada beberapa jenis sistem yang dapat merusak kode yang ditulis dalam C?
Profesor: ya, oleh karena itu, pada prinsipnya, akan lebih baik untuk menghindari aplikasi yang berbicara langsung ke kernel Linux. Di Android, ini bukan masalahnya. Aplikasi Android dapat membuat panggilan sistem sewenang-wenang jika mereka mau. Bahkan, untuk alasan kinerja, aplikasi tidak dapat memengaruhi komponen sewenang-wenang yang ditulis dalam C atau Assembler, itulah sebabnya beberapa game "berbicara" di Jawa.
Siswa: Saya pikir dalam beberapa hal ini adalah kesempatan untuk menggunakan semua materi yang ditulis untuk Java, yaitu, pencipta Android ingin menyederhanakan pembuatan aplikasi untuk pengembang. Dan salah satu cara termudah untuk melakukan ini adalah untuk memungkinkan untuk mengambil keuntungan dari perpustakaan Java yang kaya.
Profesor: sangat mungkin. Saya pikir salah satu alasan utama untuk menggunakan Java adalah kegunaan. Mereka mungkin lebih peduli dengan pemrograman dan kemudahan pengembangan, karena Jawa tidak ada hubungannya dengan keamanan.
Hal lain yang ada di sini, tidak seperti iPnone. Sistem operasi iPhone juga memiliki kemudahan pengembangan, tetapi menggunakan C, dan jika Anda mencoba, Anda dapat menyebabkan buffer overflow di dalamnya. Selain itu, ada kekhususan untuk peralatan tertentu, jadi semua mungkin tidak memiliki perpustakaan yang sama. Saya pikir alasan utama pengembang Android memilih Java adalah karena mereka pada awalnya tidak tahu karakteristik perangkat di mana OS ini akan bekerja. Misalnya, pencipta iPhone tahu pasti bahwa mereka akan memiliki prosesor ARM di ponsel mereka, sehingga mereka melakukan pra-kompilasi perangkat lunak dengan model khusus ini. Dan pendekatan ini lebih efektif, karena konsumsi baterai sangat penting untuk ponsel.

Fakta bahwa orang-orang dari Android menggunakan Java mungkin kurang efisien dalam hal penghematan energi atau kinerja prosesor, karena ini terkait dengan JRE dan sebagainya. Tetapi kemudian ada keuntungan dari porting OS ke perangkat dengan arsitektur yang berbeda. Oleh karena itu, jika Anda memiliki ponsel dengan prosesor MIPS, ARM, atau x86, aplikasi Java dapat dijalankan di ketiga perangkat. Pengembang Android ingin platform mereka digunakan pada semua jenis peralatan atau telepon. Jadi ini mungkin alasan utama mengapa mereka mengorbankan keamanan demi menggunakan Java.
Ternyata lingkungan Java runtime tidak memberikan manfaat keamanan khusus untuk aplikasi, itu hanya hal yang nyaman bagi pengembang dan pengguna. Tetapi dari sudut pandang isolasi, semuanya pada dasarnya tergantung pada kernel dan monitor tautan yang mengontrol operasi aplikasi.
Mahasiswa: Tidakkah kemudahan pengembangan mengarah pada keamanan aplikasi? Memang, ketika menulis monitor referensi C, ada banyak lagi cara untuk membuat kesalahan.
Profesor: ya, Anda benar sekali! Sebenarnya, saya seharusnya tidak mengatakan bahwa kemudahan pengembangan tidak ada hubungannya dengan keamanan. Ini benar-benar bodoh karena Anda ingin melakukannya semudah menulis kode yang benar. Jadi dalam arti tertentu, sebuah sistem yang Anda dapat dengan mudah menulis kode yang benar saja memberikan keamanan lebih. Dalam arti tertentu, Anda benar berasumsi bahwa pengembang Android ingin menghindari kesalahan saat menulis kode, jadi Anda tidak ingin menulisnya dalam bahasa C. Yang rumit. Dan saya tidak tahu mengapa Apple memilih C sebagai bahasa pemrograman ketika mengembangkan OS-nya.
Karena pilihan seperti itu menciptakan masalah buffer overflow dalam aplikasi, dan jika aplikasi ini sangat penting, maka berpotensi rentan. Tidak terkait dengan kompromi aplikasi lain, tetapi Anda masih tidak ingin aplikasi perbankan Anda ditulis dalam C.
Siswa: Tautan Monitor ditulis dalam Java atau C?
Profesor: Di Android, monitor tautan sebagian besar ditulis dalam Java. Namun, ada beberapa "kait" di dalamnya untuk berkomunikasi dengan antarmuka eksternal dan aplikasi menggunakan kode asli. Tetapi sebagian besar logikanya ditulis di Jawa. Jadi ini sebenarnya rencana yang cukup aman.
Sekarang mari kita coba mencari tahu apa lagi aplikasi UID digunakan, kecuali untuk memisahkan aplikasi dari satu sama lain dalam hal proses yang mereka mulai. Alasan utama untuk menggunakan UID adalah untuk menciptakan kemampuan untuk berbagi akses ke sumber daya bersama dan bertukar data dalam sistem.
Kami telah melihat satu mekanisme untuk ini - mengirimkan niat ke monitor tautan. Namun di Android, ada banyak hal yang tidak dilakukan melalui maksud tautan monitor. Mungkin tidak semuanya dikirim melalui Intent karena alasan kinerja. Anda tidak ingin memanggil monitor tautan untuk setiap operasi yang Anda lakukan pada sistem, pertama-tama menyangkut akses ke Internet. Jika Anda ingin mengakses Internet di perangkat yang menjalankan Android, maka buka saja soketnya, sama seperti aplikasi Linux standar lainnya. Sebuah aplikasi hanya dapat menanyakan kernel: "Saya perlu soket karena saya ingin terhubung ke mesin ini", ini adalah bagaimana Internet diakses.
Selanjutnya, akses ke media yang dapat dipindahkan harus diperhatikan. SD-, . , , , , , . , . , , Android . , , GPS-, .

«» Android, Linux, /dev/camera. Linux, , , . , - , , Java. C Assembler, Linux, . Java , Java-.
: , , - , ?
: , ! , . ? , №2, ID . Android UID GID , . , . , , , - «android.permission.internet», , .

, . , , , . — Linux Android. , - , - , , Linux. Android GID 3003, . , , . , - . Android - , . , GID UID .
SD-. GID, SD-, , . , . , SD- GID SD-.
, , Android.

, , , . , SQL -, , . — UID , , .
, , , GPS, . GID, . , , dev/camera - GID, , , GID .
, , №2, , UID GID , - .
, SD-? , SD-? , SD- , , . ?
: , , , , .
: . , Android , . , SD- . , , SD- . , Android , , , FAT, - . , , - .
: , ?
: , . , , . , , , , . , .

— , , ? , , DIALPERM, INTERNET, FRIENDVIEW?
: , , ?
: , , , . , , . , . Android , iOS, , iPhone , , , SMS-, JPEG . .
– , , . . , Android , , . , - «», , , , , OK. , , .
, , , Android , — , . , , , . Android, 4.3, , , . , . , , , , . , , API, , .
55:10
MIT « ». 20: « », 3.
, . ? ? ,
30% entry-level , : VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps $20 ? ( RAID1 RAID10, 24 40GB DDR4).
VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps ,
.
Dell R730xd 2 ? 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?