Kursus MIT "Keamanan Sistem Komputer". Kuliah 21: Pelacakan Data, Bagian 2

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
Kuliah 21: “Melacak Data” Bagian 1 / Bagian 2 / Bagian 3

Siswa: mengapa tidak mungkin memindai kode dan tidak memeriksanya secara manual?

Profesor: dalam praktiknya, inilah yang terjadi. Pengembang tahu bahwa setiap kali penerjemah melakukan pekerjaan semacam ini, ketika mengembalikan nilai kembali, kode khusus digunakan yang secara otomatis memberikan nilai sistem yang terinfeksi ke system.arraycopy (), yang harus dikaitkan dengan itu.

Siswa: benar, tetapi bagaimana dengan bagian manual dari pekerjaan itu?

Profesor: bagian manual terutama untuk mengetahui apa yang seharusnya menjadi kebijakan pelaksanaan audit. Dengan kata lain, jika Anda hanya melihat TaintDroid standar atau Android standar, mereka akan melakukan sesuatu untuk Anda, tetapi mereka tidak akan dapat secara otomatis menetapkan Taint dengan cara yang benar. Jadi seseorang harus secara manual menetapkan kebijakan pelacakan.



Sepertinya tidak akan menjadi masalah besar dalam latihan. Tetapi jika jumlah aplikasi yang menggunakan metode berorientasi mesin terus meningkat, maka kita mungkin memiliki masalah kecil.

Jenis data lain yang perlu dikhawatirkan dalam hal menetapkan infeksi adalah pesan IPC. Pesan IPC pada dasarnya diperlakukan sebagai array. Oleh karena itu, masing-masing pesan ini akan dikaitkan dengan satu noda umum tunggal, yang merupakan gabungan infeksi dari semua bagian penyusunnya.

Ini berkontribusi pada kinerja sistem karena kita hanya perlu menyimpan satu tag noda untuk setiap pesan ini. Dalam kasus yang ekstrem, tingkat infeksi hanya akan dinilai ulang, tetapi tidak akan pernah menyebabkan penurunan keamanan. Hal terburuk yang dapat terjadi pada saat yang sama adalah bahwa jaringan tidak akan mendapatkan data yang bisa sampai di sana tanpa konsekuensi berbahaya untuk privasi.

Jadi, ketika Anda membuat pesan IPC, ia menerima noda gabungan. Ketika Anda membaca apa yang Anda terima dalam pesan ini, data yang diekstrak akan terinfeksi dari pesan itu sendiri, yang masuk akal. Inilah cara penanganan pesan IPC.

Perlu juga mengkhawatirkan tentang bagaimana file diproses. Oleh karena itu, setiap file menerima satu tag noda, dan tag ini disimpan dengan file dalam metadata-nya pada media penyimpanan yang stabil, seperti kartu memori SD. Di sini, pendekatan konservatif yang sama terhadap infeksi terjadi seperti pada kasus-kasus sebelumnya. Gagasan utamanya adalah aplikasi memperoleh akses ke beberapa data rahasia, misalnya lokasi GPS, dan mungkin akan menulis data ini ke file, jadi TaintDroid memperbarui tag noda file ini dengan bendera GPS, setelah itu aplikasi ditutup. Kemudian, beberapa aplikasi lain yang membaca file ini mungkin disertakan.



Ketika ia masuk ke mesin virtual, ke dalam aplikasi, TaintDroid melihat bahwa ia memiliki flag ini, dan karenanya setiap data yang diekstrak saat membaca file ini juga akan memiliki flag GPS ini. Saya pikir itu sangat sederhana.

Jadi, hal-hal apa yang dapat kita infeksi dari perspektif Java? Pada dasarnya ada lima jenis objek Java yang membutuhkan bendera berwarna. Pertama, ini adalah variabel lokal Variabel lokal yang digunakan dalam metode ini. Kembali ke contoh sebelumnya, kita dapat mengasumsikan bahwa char c adalah variabel seperti itu.

Karena itu, kita harus menetapkan tanda pada elemen-elemen ini. Tipe kedua adalah argumen dari Metode argumen metode, mereka juga harus memiliki tanda infeksi. Kedua hal ini hidup di tumpukan, jadi TaintDroid harus melacak tujuan bendera dan banyak lagi untuk jenis objek ini.
Kita juga perlu menetapkan flag ke bidang instance dari bidang instance Object. Bayangkan ada objek C tertentu, itu adalah lingkaran, dan saya ingin tahu jari-jarinya. Jadi, kita memiliki bidang c.radius, dan kita harus mengaitkan informasi infeksi untuk masing-masing bidang ini: dengan dan jari-jari.
Tipe keempat dari objek Java adalah bidang kelas statis dari bidang kelas Static, yang juga memerlukan informasi taint. Ini bisa berupa sesuatu seperti circle.property, yaitu, deskripsi sifat-sifat lingkaran yang kami beri beberapa informasi untuk diwarnai.

Jenis kelima adalah array Array, yang telah kita bicarakan sebelumnya, dan kami menetapkan satu informasi infeksi umum untuk seluruh array.

Ide dasar menerapkan flag taint untuk jenis objek Java adalah mencoba untuk menyimpan flag taint untuk variabel di sebelah variabel itu sendiri.



Katakanlah kita memiliki beberapa variabel bilangan bulat, dan kami ingin menempatkan semacam polusi yang mencemari itu. Kami ingin mencoba menjaga keadaan ini sedekat mungkin dengan variabel, mungkin dengan alasan memastikan operasi cache yang efisien di tingkat prosesor. Jika kita menyimpan noda sangat jauh dari variabel ini, ini dapat menyebabkan masalah, karena setelah penerjemah melihat nilai memori untuk variabel Java aktual ini, ia ingin berkenalan dengan informasi tentang infeksinya sesegera mungkin.

Jika kita melihat operasi move-op, kita perhatikan bahwa di tempat-tempat ini dalam kode, dst dan src, ketika penerjemah mempertimbangkan nilainya, ia juga mempertimbangkan infeksi noda yang sesuai.

Dengan demikian, menempatkan hal-hal ini sedekat mungkin satu sama lain, Anda mencoba memastikan penggunaan cache yang lebih efisien. Ini sangat sederhana. Jika Anda melihat apa yang dilakukan pengembang untuk argumen metode dan variabel lokal yang hidup di stack, Anda dapat melihat bahwa mereka pada dasarnya menyoroti flag taint di sebelah tempat variabel berada.

Misalkan kita memiliki hal favorit tentang kuliah kita, diagram tumpukan yang mungkin akan segera kamu benci untuk sering disebutkan. Biarkan variabel lokal 0 berada di tumpukan kami, lalu TaintDroid akan menyimpan dalam tag tag tentang infeksi variabel ini tepat di bawahnya. Jika selanjutnya Anda memiliki variabel lain, tagnya juga akan terletak tepat di bawahnya, dan seterusnya. Ini sangat sederhana. Semua hal ini akan berlokasi di jalur cache yang sama, yang akan membuat akses ke memori lebih murah.



Siswa: Saya ingin tahu bagaimana Anda dapat memiliki satu flag untuk seluruh array dan flag yang berbeda untuk setiap properti objek. Bagaimana jika salah satu metode objek dapat mengakses data yang disimpan di propertinya? Itu akan menjadi ... Anda tahu apa yang saya maksud?

Profesor: Apakah Anda bertanya tentang alasan menerapkan kebijakan seperti itu?

Mahasiswa: ya, tentang alasan penggunaan kebijakan semacam itu.

Profesor: Saya pikir ini dilakukan untuk memastikan efektivitas implementasi. Mungkin ada aturan lain - misalnya, mereka tidak melaporkan panjang array data, karena kebocoran informasi mungkin terjadi, oleh karena itu mereka tidak memperluas infeksi pada indikator ini. Jadi saya pikir beberapa keputusan dibuat hanya untuk alasan efisiensi. Pada prinsipnya, tidak ada yang menghalangi ketika memberikan akses ke setiap elemen array untuk menunjukkan bahwa benda di sebelah kiri hanya menerima noda dari elemen tertentu.

Namun, tidak jelas apakah ini akan benar, karena, tampaknya, jika Anda memasukkan sesuatu ke dalam array, maka hal ini harus tahu sesuatu tentang array ini. Oleh karena itu, saya pikir pengembang menggunakan kombinasi kedua kebijakan. Menjadi terlalu konservatif, Anda tidak boleh membiarkan kebocoran data yang ingin Anda lindungi, tetapi pada saat yang sama, untuk memiliki akses ke array, Anda harus tahu sesuatu tentangnya. Dan ketika Anda perlu mempelajari sesuatu tentang sesuatu, biasanya itu berarti Anda menggunakan noda.

Jadi, ini adalah skema dasar yang mereka gunakan untuk menyimpan semua informasi ini di samping satu sama lain. Orang dapat membayangkan bahwa hal yang sama dilakukan untuk bidang kelas dan bidang objek. Ketika mendeklarasikan kelas, Anda memiliki beberapa memori slot untuk variabel tertentu, dan tepat di sebelah slot ini terdapat informasi yang mencemari variabel tersebut. Jadi saya pikir semua ini cukup masuk akal.

Ini adalah prinsip TaintDroid. Ketika sistem diinisialisasi atau di lain waktu selama operasi sistem, TaintDroid melihat semua sumber informasi yang berpotensi terinfeksi dan menetapkan bendera untuk masing-masing hal ini - sensor GPS, kamera, dan sebagainya. Saat program berjalan, ia akan mengekstraksi informasi rahasia dari sumber-sumber ini, setelah itu penerjemah akan mempertimbangkan semua jenis fungsi sesuai dengan tabel yang diberikan dalam artikel untuk mencari tahu bagaimana menyebarkan infeksi yang tercemar ke seluruh sistem.

Hal yang paling menarik terjadi ketika data mencoba menembus sistem. TaintDroid dapat mengontrol antarmuka jaringan dan melihat segala sesuatu yang mencoba melewatinya. Dia mencari tanda yang kotor, dan jika data yang mencoba menembus jaringan memiliki satu atau lebih dari tanda ini, mereka akan dilarang menggunakan jaringan. Apa yang terjadi pada saat ini sebenarnya tergantung pada aplikasi.



Misalnya, TaintDroid dapat menunjukkan kepada pengguna peringatan yang mengatakan bahwa seseorang sedang mencoba mengirim data tentang lokasinya ke samping. Mungkin TaintDroid berisi kebijakan bawaan yang memungkinkan aplikasi mengakses jaringan, tetapi pada saat yang sama akan mengatur ulang semua data sensitif yang akan ditransfer, dan seterusnya. Dalam artikel ini, mekanisme ini tidak dijelaskan secara cukup rinci, karena penulis terutama berkaitan dengan masalah "kebocoran" data ke dalam jaringan.

Bagian dari artikel berjudul "Evaluasi" membahas beberapa hal yang ditemukan dalam proses mempelajari sistem. Jadi, penulis artikel menemukan bahwa aplikasi Android akan mencoba mengekstraksi data dengan cara yang tidak terlihat oleh pengguna. Misalkan mereka akan mencoba menggunakan lokasi Anda untuk iklan, mereka akan mengirim nomor Anda ke server jarak jauh, dan seterusnya. Penting untuk dicatat bahwa aplikasi ini, sebagai suatu peraturan, tidak “mematahkan” model keamanan Android dalam arti bahwa pengguna harus mengizinkan mereka mengakses jaringan atau mengizinkan mereka menggunakan daftar kontak. Namun, aplikasi tidak memberikan dalam perjanjian lisensi EULA bahwa mereka berniat untuk mengirim nomor telepon ke server Silk Road 8 atau sesuatu seperti itu. Faktanya, ini adalah penipuan dan menyesatkan pengguna tentang maksud sebenarnya dari aplikasi tersebut, karena jika mereka melihat persyaratan EULA ini dan tahu apa yang sedang mereka hadapi, mereka dapat berpikir apakah akan menginstal aplikasi seperti itu di smartphone mereka atau tidak.

Mahasiswa: dapat diasumsikan bahwa bahkan jika mereka memasukkan persyaratan ini ke dalam perjanjian lisensi, itu tidak akan berhasil, karena orang biasanya tidak membaca EULA.

Profesor: ini asumsi yang sangat masuk akal, karena bahkan para ilmuwan komputer tidak selalu memeriksa perjanjian lisensi. Namun, kejujuran seperti itu di EULA masih akan bermanfaat, karena ada orang yang benar-benar membaca perjanjian lisensi. Tetapi Anda benar sekali dengan asumsi bahwa pengguna tidak akan membaca banyak halaman yang ditulis dalam cetakan kecil, mereka cukup mengklik "setuju" dan menginstal aplikasi.

Jadi, saya pikir aturan untuk mengirimkan informasi melalui sistem cukup sederhana, seperti yang telah kita katakan, noda hanya bergerak dari sisi kanan ke sisi kiri. Namun, kadang-kadang aturan untuk pergerakan arus informasi ini dapat memiliki hasil yang agak bertentangan.
Bayangkan sebuah aplikasi mengimplementasikan kelas daftar tertautnya sendiri. Kami memiliki kelas sederhana yang disebut ListNode, ia akan memiliki bidang objek untuk data Objek dan objek berikutnya ListNode yang mewakili daftar berikutnya.

Misalkan aplikasi memberikan data yang terinfeksi ke bidang data Object - informasi rahasia yang diterima dari sensor GPS atau yang lainnya. Pertanyaannya adalah, ketika kita menghitung panjang daftar ini, haruskah itu terinfeksi? Anda akan kagum bahwa jawaban atas jawaban pertanyaannya adalah “tidak”, yang dijelaskan oleh bagaimana TaintDroid dan beberapa sistem ini menentukan aliran informasi. Mari kita lihat apa artinya menambahkan simpul ke daftar tertaut.

Menambahkan simpul terdiri dari 3 langkah. Jadi, hal pertama yang Anda lakukan adalah memilih daftar simpul baru yang berisi data yang ingin Anda tambahkan - Alloc ListNode. Langkah kedua adalah menetapkan bidang data ke simpul baru ini. Dan hal ketiga yang Anda lakukan adalah menggunakan semacam patch untuk ListNode di sebelah untuk menggabungkan node ke dalam daftar - ini adalah pointer ptr "berikutnya".



Menariknya, langkah ketiga tidak terkait dengan bidang data sama sekali, hanya mempertimbangkan nilai selanjutnya. Begitu data Object terinfeksi, kita mulai menghitung panjang daftar, mulai dari beberapa head node, melalui semua pointer ptr "selanjutnya" dan hanya menghitung berapa banyak pointer yang telah berlalu. Jadi algoritma penghitungan tidak menyentuh data yang terinfeksi.

Menariknya, jika Anda memiliki daftar tertaut yang diisi dengan data yang terinfeksi dan kemudian menghitung panjangnya, ini tidak akan menghasilkan generasi nilai yang terinfeksi. Ini mungkin tampak sedikit tidak logis, meskipun ketika mempertimbangkan array, kita telah mengatakan bahwa panjang array juga tidak mengandung noda. Ada alasan yang sama. Menjelang akhir kuliah, kami akan membahas bagaimana Anda dapat menggunakan bahasa yang memungkinkan Anda sebagai programmer untuk menentukan jenis infeksi Anda sendiri, dan kemudian Anda dapat mengembangkan kebijakan Anda sendiri untuk hal-hal seperti itu.
Fitur yang baik dari TaintDroid adalah Anda, sebagai pengembang, tidak perlu memberi label apa pun, TaintDroid melakukannya untuk Anda. Ia mencatat semua hal rahasia yang bisa menjadi sumber informasi, dan semua hal yang bisa menjadi “penyumbatan” informasi, sehingga Anda, sebagai pengembang, siap bekerja. Tetapi jika Anda ingin mengontrol penambahan node, Anda mungkin harus membuat beberapa kebijakan sendiri.
Bagaimana TaintDroid memengaruhi kinerja sistem? Overhead yang ada sebenarnya tampak cukup masuk akal. Memori di atas adalah untuk menyimpan semua tag infeksi. Beban prosesor terutama akan terdiri dari tujuan, distribusi, dan verifikasi infeksi ini, dan harus dicatat bahwa menggunakan mesin virtual Dalvik adalah pekerjaan tambahan. Jadi, melihat sumbernya, melihat informasi infeksi 32-bit ini, kami melakukan operasi yang telah kami pertimbangkan. Ini adalah overhead komputasi.

Overhead ini tampaknya cukup moderat. Menurut penulis artikel tersebut, menyimpan tag noda memerlukan 3% hingga 5% memori tambahan, jadi ini tidak terlalu buruk. Beban prosesor sedikit lebih tinggi dan dapat mencapai dari 3% hingga 29% daya komputasi. Hal ini disebabkan oleh fakta bahwa setiap kali loop dijalankan, penerjemah perlu melihat tag ini dan melakukan operasi yang sesuai. Meskipun ini hanya operasi bitwise, mereka harus dilakukan setiap saat. Ini tidak buruk bahkan dalam kasus beban 29%, karena pengembang dari Silicon Valley terus-menerus berbicara tentang fakta bahwa ponsel modern memerlukan prosesor quad-core. Satu-satunya masalah mungkin muncul dengan baterai, karena bahkan jika Anda memiliki inti prosesor tambahan, Anda tidak mungkin ingin memiliki telepon panas di saku Anda yang mulai "meledak" ketika mencoba menghitung hal-hal ini. Tetapi jika baterai Anda tidak terlalu terpengaruh oleh perhitungan seperti itu, maka semuanya tidak terlalu buruk.



Jadi ini adalah ikhtisar dari karya TaintDroid. Punya pertanyaan?

Siswa: apakah Anda hanya menandai apa yang ada sepanjang waktu? Atau masing-masing variabel ditandai?

Profesor: semuanya ditandai, jadi secara teoretis tidak ada yang mencegah Anda menaruh informasi tentang infeksi untuk hal-hal yang tidak terinfeksi sama sekali. Saya pikir bahwa segera setelah sesuatu mendapatkan setidaknya satu noda sedikit, Anda perlu membangun sesuatu seperti tata letak perubahan dinamis. - , , . taint, , , - , , . , , - . TaintDroid . Dalvik.

– taint x86 ARM? , , , , , , Java . ?

, , , . , , , , , Java- - . x86, , , , , , .
, taint , , , . .



, x86 — . . , - x86, . , , , P, , , !

, taint x86. , , , AD, , .
-, , . -, , . , , , .

, . , . , , , . , « » Taint Explosion.
, , . , Dungeons and Dragons, .

, , - - . , , , .
, - esp esb. , .



, x86, , esp. , , . , , , ebp, , , . , , , taint .

, Linux . , . , - .

: ? , .

: . x86, , . , . Bochs – IBM PC, 86. TaintBochs, x86 . x86, , . , . , , , , , , - .

54:10

Kursus MIT "Keamanan Sistem Komputer". Kuliah 21: Pelacakan Data, Bagian 3


Versi 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 temukan 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 Januari 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?

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


All Articles