Kursus MIT "Keamanan Sistem Komputer". Kuliah 20: Keamanan Ponsel, Bagian 1

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 3
Kuliah 2: "Kontrol serangan hacker" Bagian 1 / Bagian 2 / Bagian 3
Kuliah 3: “Buffer Overflows: Exploits and Protection” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 4: “Pemisahan Hak Istimewa” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 5: "Dari mana sistem keamanan berasal?" Bagian 1 / Bagian 2
Kuliah 6: “Peluang” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 7: “Kotak Pasir Klien Asli” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 8: “Model Keamanan Jaringan” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 9: "Keamanan Aplikasi Web" Bagian 1 / Bagian 2 / Bagian 3
Kuliah 10: “Eksekusi simbolik” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 11: “Bahasa Pemrograman Web / Web” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 12: Keamanan Jaringan Bagian 1 / Bagian 2 / Bagian 3
Kuliah 13: "Protokol Jaringan" Bagian 1 / Bagian 2 / Bagian 3
Kuliah 14: "SSL dan HTTPS" Bagian 1 / Bagian 2 / Bagian 3
Kuliah 15: “Perangkat Lunak Medis” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 16: “Serangan Saluran Samping” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 17: “Otentikasi Pengguna” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 18: “Penjelajahan Pribadi di Internet” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 19: “Jaringan Anonim” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 20: "Keamanan Ponsel" Bagian 1 / Bagian 2 / Bagian 3

Hari ini kita akan berbicara tentang keamanan Android. Anda dapat menganggapnya sebagai contoh menarik dari sistem yang terutama dirancang dengan mempertimbangkan keamanan. Ada kemungkinan bahwa, tidak seperti banyak sistem yang telah kami periksa sejauh ini, seperti Unix atau browser web, di mana keamanan dalam banyak kasus "kacau" setelah sistem dibuat dan desainnya tidak fokus pada masalah ini, pengembang Android awalnya sangat khawatir tentang kelas serangan spesifik dan konstruk aplikasi.



Mereka datang dengan cara yang lebih baik untuk menyusun aplikasi Android yang akan memungkinkan kita untuk menegakkan kebijakan keamanan dengan lebih baik. Yang paling keren adalah bahwa ini adalah sistem yang cukup banyak digunakan, tidak seperti beberapa makalah penelitian yang hanya dapat menawarkan arsitektur baru, sistem ini sebenarnya digunakan dalam praktiknya, dan semakin banyak perangkat yang menggunakan OS Android.

Hari ini kita akan berbicara tentang bagaimana beberapa hal berhasil atau gagal. Kami akan mempertimbangkan bagian mana dari desain yang mereka anggap penting dan apa yang mereka lewatkan, dan apa hasilnya dalam praktiknya. Ini sangat menarik. Dalam arti tertentu, para pengembang menggunakan sistem yang sudah ada yang kita bicarakan, sehingga Android dibangun di atas UNIX, pada kenyataannya, itu hanya kernel Linux yang berjalan di telepon secara keseluruhan.

Jadi dalam banyak hal, mereka menggunakan beberapa mekanisme yang biasa Anda ingat dari Lab 2, di mana Anda menggunakan pengidentifikasi pengguna dan grup Unix dan hal-hal lain untuk memisahkan aplikasi dari satu sama lain. Tetapi dalam kasus Android, mereka memiliki cara yang sama sekali berbeda dalam mengatur ID pengguna dan izin file daripada di sistem Linux yang khas.

Mari kita mulai dengan membahas apa tingkat ancaman di sini? Apa yang mengganggu orang-orang ini di telepon? Apa yang sedang terjadi di sini? Apa yang mereka coba lindungi dari? Apa model ancaman di perangkat seluler?



Siswa: aplikasi yang bisa berbahaya?

Profesor: ya, mereka khawatir aplikasi yang dapat diinstal di ponsel mungkin berbahaya. Saya pikir ada beberapa aplikasi jahat yang dirancang untuk mendapatkan kendali atas Anda atau mencuri data pribadi Anda. Jadi, Anda harus khawatir tentang data Anda dan tentang hal-hal yang membutuhkan biaya - pesan SMS, panggilan telepon, koneksi internet, dan sebagainya.

Jadi, di sebelah kanan adalah hal-hal yang ingin Anda lindungi di ponsel Anda, dan di sebelah kiri adalah hal-hal yang dapat membuatnya bekerja secara berbeda. Karena ada aplikasi jahat, Android guys tidak ingin pengguna dapat menginstal aplikasi yang ditulis oleh pengembang yang Google belum pernah dengar. Selain itu, aplikasi semacam itu bisa berbahaya, bukan karena pengembang sangat menginginkannya, tetapi karena ia hanya lupa melakukan sesuatu. Dan alangkah baiknya untuk membantu orang-orang ini membuat aplikasi yang aman, karena seringkali pengembang aplikasi bukan ahli di bidang kerentanan yang kemudian dapat digunakan oleh penyerang dalam aplikasinya.



Karena Android tersebar luas, kami dapat melihat laporan kerentanan. Ada database CVE yang membuat katalog banyak kerentanan dalam sistem operasi, dan ini sebenarnya menarik. Tentu saja, ada pesan kesalahan Android di sana, banyak di antaranya Anda temui di kuliah. Buffer overflows masih dimungkinkan di beberapa bagian Android, ada pilihan yang buruk dari cryptosystem default, orang lupa untuk menginisialisasi generator angka acak dan membuat kunci yang dapat diprediksi. Semua ini masih terjadi, karena perangkat lunak tidak aman dari masalah yang diketahui.

Yang menarik adalah bahwa tampaknya masalah-masalah ini terisolasi dan muncul dari waktu ke waktu. Secara umum, mereka dapat dihilangkan, dan sistem tetap cukup aman setelah memperbaiki kesalahan ini. Jadi dalam banyak hal, desain Android bekerja dengan cukup baik. Oleh karena itu, nanti kita akan memeriksa lebih detail bagian mana dari desain yang bekerja lebih baik dan mana yang lebih buruk. Tetapi secara umum, ini adalah solusi perangkat lunak yang cukup dipikirkan dengan matang, atau setidaknya lebih dipikirkan daripada aplikasi Unix desktop yang telah Anda lihat sejauh ini.

Dengan demikian, salah satu cara untuk mengetahui cara melindungi data dan berbagai layanan yang mungkin membebani uang Anda dari aplikasi jahat adalah dengan terlebih dahulu memahami seperti apa bentuk aplikasi untuk sistem Android. Kemudian kita akan berbicara tentang bagaimana berbagai izin atau hak istimewa dikonfigurasi dan diterapkan dalam aplikasi ini. Aplikasi Android sangat berbeda dari apa yang Anda lihat sejauh ini di aplikasi desktop atau aplikasi Internet.

Alih-alih menyusun bagian kode yang tak terpisahkan dengan fungsi utama yang Anda mulai jalankan, aplikasi Android lebih modular. Dalam hal menggunakan Android, Anda dapat menyajikan satu aplikasi sebagai satu set komponen. Artikel kuliah menjelaskan 4 jenis komponen yang disediakan kerangka kerja Android untuk pengembang. Komponen pertama adalah Aktivitas, atau aktivitas. Ini adalah hal yang mewakili antarmuka pengguna dan memungkinkan pengguna untuk berinteraksi dengan aplikasi, menampilkan informasi kepadanya dan menerima penekanan tombol darinya, dan sebagainya.

Dari sudut pandang keamanan, aktivitas memiliki properti yang menarik - input pengguna dikurangi menjadi satu tindakan pada satu waktu. Kerangka kerja Android sebenarnya menjamin bahwa hanya satu jenis aktivitas yang dimungkinkan pada satu waktu, yaitu, jika Anda menjalankan aplikasi perbankan, maka tidak ada aplikasi yang akan berfungsi di latar belakang untuk mencegat kode PIN aplikasi perbankan melalui klik sentuh. Jadi kerangka kerja ini menyediakan penggunaan beberapa fitur keamanan terkait input pengguna. Dengan demikian, aktivitas adalah komponen dari antarmuka pengguna.

Tiga jenis komponen lainnya membantu logika aplikasi untuk berinteraksi dengan komponen lain. Jadi, komponen kedua disebut Layanan, atau layanan. Hal-hal ini bekerja di latar belakang. Misalnya, Anda mungkin memiliki layanan yang melacak lokasi Anda, seperti dalam aplikasi yang dijelaskan orang-orang ini di artikel. Anda mungkin memiliki layanan yang mengambil informasi dari jaringan di latar belakang dan sebagainya.
Komponen ketiga adalah komponen dari penyedia konten, penyedia konten. Itu bisa direpresentasikan sebagai database SQL di mana Anda bisa mendefinisikan beberapa tabel dengan skema, dan sebagainya. Anda dapat mengakses kueri SQL dengan semua data yang disimpan dalam aplikasi ini. Komponen ini memungkinkan Anda untuk mengontrol akses ke database, dengan mengatakan siapa yang diizinkan mengaksesnya.
Di "Android" ada hal lain yang tidak biasa di sistem lain. Ini adalah komponen keempat - penerima siaran, atau penerima siaran. Ini digunakan untuk menerima pesan dari bagian lain dari sistem. Oleh karena itu, kita akan berbicara tentang bagaimana aplikasi berinteraksi satu sama lain dalam hal pesan.



Jadi, ini adalah ide yang sangat logis tentang apa aplikasi Android. Namun pada kenyataannya, semua ini hanya kelas Java atau kode Java yang ditulis oleh pengembang.

Hanya ada antarmuka standar tertentu yang Anda terapkan untuk aktivitas, untuk layanan, untuk penerima siaran, dan untuk penyedia konten, dan jelas bahwa ini hanya kode Java. Dan semua komponen yang ditempatkan dalam persegi panjang hanyalah runtime Java yang berjalan di ponsel Anda, itu hanya satu proses kernel Linux yang berjalan di ponsel Anda. Dan semua komponen ini adalah kelas atau bagian kode yang berbeda yang dijalankan dalam proses runtime Java. Inilah cara ini dapat direduksi menjadi proses tradisional, lebih mudah dipahami oleh Anda.

Hal lain yang berinteraksi dengan aplikasi disebut manifes. Kode untuk semua komponen ditulis atau dikompilasi oleh pengembang aplikasi, tetapi selain itu, ada juga manifes dalam sistem yang berada di luar komponen aplikasi. Ini adalah teks atau file XML yang menjelaskan semua komponen ini dan bagaimana bagian lain dari sistem harus berinteraksi dengan komponen aplikasi ini.



Secara khusus, manifesto ini berbicara tentang apa yang disebut label Lables, yang akan kita bicarakan dalam beberapa detik, yang menentukan hak istimewa aplikasi ini dalam hal apa yang diizinkan untuk dilakukan, dan juga menentukan batasan siapa yang dapat berinteraksi dengan berbagai komponen dari ini. aplikasi. Apakah Anda ingin bertanya bagaimana cara kerjanya?

Siswa: apakah label itu sesuatu yang mendefinisikan "aplikasi ini tidak dapat membuat panggilan telepon" atau "aplikasi ini dapat mengirim pesan"?

Profesor: ya, tanda-tanda ini menentukan apakah aplikasi ini dapat membuat panggilan, mengirim SMS atau menggunakan Internet. Ada dua jenis label, saya akan menggambarnya di sini. Setiap aplikasi memiliki daftar label yang menggambarkan hak istimewa yang dimiliki aplikasi tersebut. Ini seperti izin untuk memanggil nomor telepon, mengaktifkan koneksi Internet, dan sebagainya. Nanti saya akan memberi tahu Anda cara kerjanya.

Dengan demikian, ini adalah hak istimewa yang dimiliki aplikasi. Selain itu, Anda juga dapat melampirkan label ke masing-masing komponen, dan di sana mereka mengambil arti yang berbeda - ini adalah hak istimewa untuk aplikasi tertentu. Jika Anda memiliki komponen dengan label, maka untuk berinteraksi dengannya, komponen lain juga harus memiliki label yang sesuai.
Misalnya, Anda mungkin memiliki tag dengan hak istimewa Melihat Teman yang dapat Anda gunakan untuk melihat lokasi teman Anda. Ini adalah hak istimewa yang mungkin dimiliki suatu aplikasi. Tetapi untuk memastikan hak istimewa ini, Anda harus melampirkan label ini ke komponen tertentu, dalam hal ini, ke komponen Penyedia Konten, ke basis datanya, di mana ada informasi tentang lokasi teman Anda. Dan sekarang siapa pun yang ingin mengakses basis data ini perlu memiliki label yang sama dalam hak istimewa mereka.



Ini adalah cara Anda mengatur izin. Anda bisa menganggapnya sebagai ID pengguna atau ID grup di Unix, dengan pengecualian string acak yang membuatnya sedikit lebih fleksibel. Artinya, Anda tidak akan pernah kehabisan ID ini dan Anda tidak khawatir tentang seseorang yang kehilangan mereka.

Ternyata para pengembang Android tidak terlalu berhati-hati dalam menentukan ruang lingkup label ini. Anda dapat memiliki dua aplikasi yang memilih untuk melabeli yang sama. Dengan demikian, label-label ini sebagian ditentukan oleh aplikasi. Misalkan Anda memiliki dua aplikasi di ponsel Anda - Facebook dan Google+, dan keduanya menyatakan bahwa mereka menginginkan garis izin baru untuk fungsi "Lihat Teman" di jejaring sosial. Anda berkata: "tidak masalah, ini adalah baris yang sama."

Tentu saja, pada kenyataannya, baris dengan daftar Label ini jauh lebih lama daripada yang saya gambar. Ada domain gaya aplikasi Java yang mendefinisikan nama huruf kecil label. Misalnya, izin panggilan DIALPERM yang saya lukis tampak seperti com.google.android.dialperm. Tapi secara kasar, ini adalah baris yang muncul dalam izin. Oleh karena itu, jika Anda memiliki aplikasi yang bermaksud baik, mereka tidak akan bertentangan dengan jalur izin ini.

Tapi ternyata, sayangnya, di sistem operasi Android tidak ada yang memaksa aplikasi untuk perilaku seperti itu, dan ini menciptakan masalah potensial. Saya tidak tahu mengapa mereka tidak diperbaiki. Kami akan melihat apa yang terjadi jika kami memiliki dua aplikasi yang bertentangan dengan nama label.

Jadi, inilah tampilan aplikasi: seperangkat program Java yang membentuk komponen, manifes yang menjelaskan izin untuk aplikasi, dan pembatasan yang diperlukan untuk semua komponen. Interaksi antara aplikasi dilakukan dengan menggunakan benda yang ditemukan oleh pengembang Android dan disebut Intent - Intention. Niat adalah pesan terstruktur, dan dalam sedetik kita akan melihat bagaimana pesan itu digunakan. Untuk saat ini, saya akan mengatakan bahwa Intent memiliki tiga hal utama. Tentu saja, maksudnya berisi bidang lain, tetapi yang paling penting adalah nama komponen Komponen yang ingin Anda kirimi pesan. Ini diikuti oleh tindakan tindakan yang komponen perlu lakukan dan data data bersama dengan tipe MIME yang ingin Anda kirim ke komponen lain.



Sebagai contoh abstrak, Anda dapat membayangkan bahwa komponen ini adalah com.android.dialer / Dial - ini adalah bagaimana nama komponen ditunjukkan dalam Android, ini adalah semacam nama domain Java. Jadi, com.android.dialer adalah nama aplikasi secara keseluruhan, yang ingin Anda kirimi niat, dan melalui garis miring Anda menulis nama komponen aplikasi target yang Anda kirimi pesan ini - / Panggil. Dengan cara ini Anda memberi nama komponen tertentu yang ditujukan untuk pesan tersebut. Aksi mewakili serangkaian tindakan spesifik yang mungkin terlihat seperti android.intend.Dial.

Ini adalah string yang sudah ditentukan sebelumnya yang dimasukkan aplikasi ke dalam bidang tindakan jika mereka ingin dialer telepon memanggil nomor tertentu. Misalnya, jika Anda ingin melihat semacam dokumen di telepon, maka di bidang Tindakan Anda memasukkan garis tindakan seperti android.intend.ViewDoc. Ini memberitahu komponen penerima bahwa Anda hanya ingin melihat kontak yang dipanggil sebelum memanggil nomor teleponnya.
Akhirnya, data Data pada dasarnya adalah URL sewenang-wenang atau URL dari data yang ingin Anda kirim dengan pesan ini. Itu bisa berupa nomor telepon atau URL HTTP yang ingin Anda lihat atau buka, atau aplikasi lain yang ditunjukkan oleh URL dalam sistem.



Ini adalah cara Anda mengirim pesan yang dikirim melalui sistem menggunakan runtime Android itu sendiri, yang terletak di bawah semua aplikasi ini. Dengan demikian, runtime Android dapat dianggap sebagai persilangan antara aplikasi dan kernel. Ini tidak sepenuhnya benar, tetapi kami akan mencoba menggambar semacam gambar untuk memperjelas seperti apa arsitektur benda ini.

Katakanlah kita memiliki satu aplikasi yang berjalan di Android, dan aplikasi lain. Persegi panjang ini adalah App1 dan App 2, dan masing-masing mewakili apa yang ditunjukkan pada gambar atas - komponen, manifes, label.



Ini semua adalah proses yang berjalan di atas kernel Linux, yang menyediakan beberapa tingkat isolasi antara aplikasi. Ada juga yang disebut artikel kuliah sebagai Referensi Monitor. Dia akan memediasi semua interaksi yang disengaja antara aplikasi yang berbeda. Oleh karena itu, jika Lampiran 1 ingin mengirim pesan ke Lampiran 2, ia terlebih dahulu mengirim pesan ke monitor tautan.
Jadi, cara Anda mengirim semua niat ke Android adalah Anda membuat salah satu pesan niat ini dan merutekannya melalui beberapa saluran ke Monitor Referensi ini.



Sistem Android memiliki implementasi salurannya sendiri untuk mengirimkan niat seperti itu, yang disebut Binder, atau Bundle. Setiap aplikasi Android, berdasarkan perjanjian, akan membuka Binder - menghubungkan ke monitor tautan sehingga dapat menerima niat dari aplikasi ini, serta mengirim pesan ke aplikasi ini.

Dalam kasus kami, jika Appendix 1 menulis Intent for Appendix 2 ke monitor link, maka monitor link akan mencari tahu kemana niat ini akan pergi, dan kemudian akan mengirimkannya ke Appendix 2. Kemudian, Appendix 2 dapat memicu beberapa tindakan, menerima pesan, atau menjalankan permintaan SQL untuk Aplikasi 1.



: – Reference Monitor?

: , — , . , , , RM, ? ? , 1. ?

: , - , , .

: , . , , , . , , . . , 2?

: , PKI. .

: , , . , , , , RM , App 1. PKI . . , , , . , , . , ?

: , , .

: . , «» , . , , , . , Labels. ?

: , , . , , , , « ».

: , , . , RM , . , - . .

, 2 , . – , . , , , . .

, . , . — , , . , , , . , , - .

Android , , , , . , , , «» . , Google Voice, VoIP, Skype , . : « , - ». , , — , PDF JPEG .



. , PDF , , . RM .

: « , , , , ». , , .

: ?

: . , , . , , . , , .

Android RPC. , , Bind intent, , : « ». , , .



, - , , Bind intent.

: , ?

: , 2. , , 2. , - .

, 2 bind, - , . , , .



, , , , Service, . , , .
: , , . , .

: , , , . . , bind. RPC , .

, . , , RM . , RPC , , , , , RPC .

, , RPC, RPC, RPC .

27:40

Kursus MIT "Keamanan Sistem Komputer". 20: « », 2


.

, . ? ? , 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 Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 $249 ! . c Dell R730xd 5-2650 v4 9000 ?

Source: https://habr.com/ru/post/id432616/


All Articles