Defense Is Hard

So here we are in a new office with a new view (it has a window!) with some thoughts to share. There always seems to be random discussions related to offensive vs defensive tools and techniques. This often invokes cliche truisms such as “the attacker only has to be right once”, which is actually a terrible defense (pun intended) as its become quite obvious over the past few years attackers need to chain together several wins in order to achieve total compromise… but I digress. A good attacker knows he or she can always win given enough time and resources. This is because attackers understand their game a lot better than most defenders. People in the role of defender don’t always seem to understand their goal is ultimately undecidable. You could never answer with absolute certainty that your systems are invulnerable. Most people would never attempt to make this argument for fear of being cast out into the unkind world of public mail spools. Yet time and time again we see those in charge of defense rolling out solutions like network based browser exploit detection. Seriously? You think you can detect and stop an exploit written in a turing complete language that is consumed by an application that performs arbitrary computation as described by an untrusted source just by reassembling and parsing a couple of network packets? Furthermore that device assumes it understands how every browser it protects will interpret that potential exploit. The very premise is laughable.

So the problem is clear, defenders are stuck solving an infinite set of problems while their attackers enjoy the luxury of solving just a handful. So one solution for defenders is to increase the number of problems the attacker has to solve while decreasing their own.

“But you just said my problems are infinite!” – Yes I did, but in the real world we can begin to tackle this by common sense measures such as pen testing regularly, implementing proper authentication mechanisms and, above all else, reducing attack surface. Why defend more than you have to? So now you’re %80 of the way there but unfortunately that last %20 is the part you can’t really solve with off the shelf solutions and its where most of your pain is coming from.

So how do we begin to increase attacker problems? Sure you can run up to date software and firewalls and that network appliance in your data center that apparently solves the halting problem… or you could begin to think differently and push undecidability onto your attacker at the moment he tries to exploit your application. The best problems we can throw at an attacker have an element of unpredictability at their core. A good example of this is the protection provided by ASLR (Address Space Layout Randomization). It forces the attacker to solve additional problems, mainly “where is my data” and “where is their code”. We’ve got to think beyond this if we are to raise attacker costs and lower our own. Ask yourself where and how you can introduce unpredictability along the path your attacker is most likely to take. Most enterprises are forced to run a homogeneous network, this is just the cost of business and it’s not going to change anytime soon. Even if you could switch up those applications, they can be fingerprinted and attacked individually. But theres still room to introduce unpredictability in this scenario. There are lower level components you can modify that are harder to fingerprint remotely. For years I’ve recommended running applications with high attack surfaces (web servers, IM clients, browsers etc…) with a different memory allocator than the default system allocator. This introduces an element of unpredictability much like ASLR and breaks a number of assumptions most exploit writers are forced to make. Its not perfect but its a lot harder for an attacker to fingerprint let alone predict. I’m not alone in doing this of course. Ask the best vulnerability/exploit researcher you know, he/she probably does the same thing out of a healthy fear of predictability. This isn’t just advice for end users, its the same advice I give to developers. Study the exploits attackers are writing for the vulnerabilities in your application and then reduce the predictability they are relying on.

Each problem your attacker solves gives him more insight into how to solve the next. This is old news to you if you’ve ever declared game-over on a pentest that started with nothing more than a good information leak. As defenders we’ve got to keep weighting the scale with unpredictability until it tips in our favor. For each additional problem we push onto the attacker our cost goes down and his goes up. Right now the scale is heavily weighted in his favor because we rely on snake oil solutions. So before you make that quarterly presentation to your CISO that includes exported data from that network appliance first try to answer the question: “What new problems have we pushed at our attackers recently?”

proteksi memori dan keamanan di dunia nyata

Saya baru saja membaca sebuah posting di built-in komunitas ilmiah, saya ingin menjawab. John selalu menempatkan konten yang besar di C / C ++ keanehan bahasa dan sering konten keamanan jika itu tidak ada hubungannya dengan keselamatan orang dalam beberapa cara. Posting terkait di atas, pendek, dengan beberapa link ke beberapa proyek penelitian menyelidiki mendapatkan keselamatan memori di memori bahasa inheren berbahaya seperti C / C ++. Daripada harus meninggalkan komentar di blog saya, seperti orang normal, saya menulis posting tidak jelas ini sebagai jawaban.

Saya melihat dua pendekatan yang masuk akal untuk mengurangi risiko kerentanan keamanan diperkenalkan oleh memori dalam waktu dekat. Perhatikan Aku tidak mengatakan “menghentikan kerentanan keamanan memori.” Untuk menghentikan mereka sepenuhnya, kemungkinan memerlukan sejumlah besar kelebihan yang tidak dapat diterima atau radikal mengubah atau memperpanjang bahasa ini, pada dasarnya. Tapi kita bisa mengurangi risiko kesalahan memori nyata dengan langkah-langkah keamanan yang sudah ada dan digunakan dalam praktek.

Yang pertama sudah ada, dan kau tahu itu sebagai ASLR, DEP, SEHOP, kenari stack dan berbagai jenis lain dari pengacakan dan ketidakpastian ditambahkan ke pelaksanaan program (lihat Pax atau MSDN dokumentasi untuk informasi lebih lanjut pada beberapa dari mereka). Sebagian besar perlindungan ini ditambahkan pada waktu kompilasi atau diaktifkan sedangkan sistem operasi Anda. Mereka dirancang untuk menjadi sesederhana mungkin dan memperkenalkan masalah kompatibilitas sedikit atau tidak ada. Itu tidak berarti itu tidak ditambahkan ke pengaturan konfigurasi, atau pengguna, mereka hampir tak terlihat menunjukkan perlindungan keamanan operasional yang efektif. Bahkan ada solusi untuk aplikasi warisan dikompilasi dengan kompiler yang lebih tua. Meskipun kekurangannya, alat EMET Microsoft yang sempurna untuk ini sarana modern perlindungan untuk aplikasi warisan, Anda tidak bisa melakukan bisnis tanpa itu. Obat ini ditambahkan overhead yang sangat kecil dan melakukan pekerjaan yang baik di semua aplikasi, besar dan kecil. Tapi sebagai skala program dalam kompleksitas efektivitasnya berkurang. Contoh terbaik adalah web browser dengan entri yang kaya, seperti JavaScript. Mungkin penyerang mengalahkan mereka menggunakan kerentanan? Ya. Mereka masih layak disimpan di sekitar, namun, dan overhead kinerja rendah? Kau benar. Jadi, ini adalah pendekatan pertama untuk mengurangi risiko kerentanan keamanan memori. Dia sudah di tempat dan efektivitas mereka.

Pendekatan kedua, yang saya tidak setuju dengan John dan penelitian akademis yang paling. Saya tidak melihat perlindungan umum yang menangkap segala sesuatu sebagai kesempatan atau di mana kita harus memfokuskan upaya kami pada penelitian. Hal ini terutama untuk alasan yang sama bahwa langkah-langkah pengurangan risiko yang dijelaskan di atas jatuh dalam menghadapi lingkungan runtime yang kompleks. Sebaliknya, saya melihat program khusus untuk digunakan sebagai risiko berkurang, itu adalah keputusan yang sangat baik untuk menghentikan serangan dunia nyata yang mempengaruhi kita hari ini. Tren ini, yang tidak sepenuhnya baru, tapi itu tidak benar-benar mengambil dalam arus utama belum, dan saya pikir saya tahu mengapa. Sebelum melanjutkan, kita perlu membahas sedikit sejarah. Sepuluh tahun yang lalu itu mungkin untuk menulis mengeksploitasi dengan metode umum seperti metadata tumpukan membusuk dan menyimpan alamat pada catatan pulang. Teknik ini terutama untuk kerentanan portabel dari program lain dalam ukuran dan kompleksitas. Tapi seiring waktu, pengembang dan perpustakaan sistem operasi telah menjadi bijaksana untuk ini dan memperkenalkan kode untuk melakukan teknik-teknik serbaguna mustahil. Hal ini dilakukan dengan berbagai metode, seperti pemindaian daftar ganda terkait pointer, XORing tabel virtual sensitif dari pointer ke fungsi dengan bantuan nilai sihir, dan sebagainya. Mereka sebenarnya obat umum yang saya bahas di atas. Mereka bekerja di semua program dengan overhead minimal dan membunuh banyak metode yang umum digunakan dalam satu frame. Sejak tahun 2000-an pertengahan terlambat untuk mengeksplorasi pengembang telah mengandalkan pada penggunaan data tertentu, untuk memastikan bahwa setelah ini mungkin dengan override pointer tunggal. Jelajahi pengembang untuk melakukan hal ini melalui studi tentang struktur data program khusus yang dapat dengan aman diganti atau kebocoran adalah untuk mengalahkan semua perlindungan umum tersebut. Fakta ini tampaknya hilang dalam akademik, setidaknya di sebagian besar penelitian saya datang di. Tentu saja, langkah evolusi berikutnya dalam pertahanan ingatan kita harus menjadi aplikasi tertentu. Langkah pertama dalam mengembangkan mengeksplorasi mengurangi risiko yang program khusus adalah studi tentang kerentanan individu yang berkaitan dengan mereka. Pengembang sudah melakukan hal ini, tetapi biasanya hanya menghasilkan patch yang memperbaiki masalah. Langkah berikutnya adalah untuk menentukan apakah ada model atau kesalahan dasar kelas untuk kerentanan ini, dan akhirnya memahami bagaimana menggunakan penulis menggunakan standar ini.

Sebuah contoh yang bagus dari program khusus menjelajahi Firefox kerangka mitigasi keracunan. Mozilla pengembang telah melihat kecenderungan umum di Firefox eksplorasi dan mitigasi diperkenalkan, untuk membuatnya lebih sulit. Ini adalah langkah ke arah yang benar. Jika setiap mengeksplorasi menyalahgunakan struktur tertentu dari data dalam aplikasi Anda, mungkin masuk akal untuk melindungi akses ke struktur dan mengurangi kemampuan untuk mencari aman penyerang atau kerusakan. pelaksanaan mitigasi dapat sepele, dan memaksa penyerang untuk menemukan pendekatan yang sama sekali baru. Setelah menaikkan bar cukup tinggi, mereka harus beralih ke target lain. Kadang-kadang desain komponen perangkat lunak asli memiliki konsekuensi yang tidak diinginkan dari pengembang frustrasi dieksplorasi, seperti halnya dengan RenderArena di WebKit (membaca seluruh topik). Intinya adalah untuk belajar bagaimana menggunakan dan memanfaatkan internal yang penulis pegangan yang unik untuk aplikasi mereka, dan kemudian membuat hidup Anda lebih sulit.

Jadi mengapa tidak ditangkap di sarana utama software belum? Nah, para pengembang hampir tidak pernah belajar eksploitasi untuk aplikasi yang mereka dukung. Ini banyak waktu dan kerja keras untuk rakyat, tidak terkait dengan keamanan yang tidak menyadari hal tersebut. Akademisi cenderung memperlakukan masalah keamanan memori sebagai salah satu yang memerlukan semua solusi yang komprehensif. Tapi saya pikir langkah-langkah pengurangan risiko spesifik program harus menjadi langkah penting dalam setiap program SDL sebagai kelanjutan dari studi dan koreksi kerentanan individu. Jangan memperhatikan rincian tentang bagaimana penyerang untuk kompromi sistem dengan menggunakan kode adalah hilangnya informasi berharga. Anda mungkin dapat membuat mitigasi, yang membuat pengoperasian kelas kesalahan sebagai program yang sangat sulit. Ini adalah biaya awal, tetapi dapat membantu untuk mengurangi keparahan kerentanan masa depan.

Sandbox merupakan langkah dalam evolusi ini, tetapi pada dasarnya berbeda dalam pendekatan mereka untuk mengurangi risiko kerentanan keamanan memori. Serta program mitigasi tertentu, mereka memiliki biaya awal untuk mengembangkan dan sulit untuk Nha pengembang peduli dengan masalah keamanan dalam rangka memenuhi syarat untuk pertama kalinya.

Tentu saja, ini adalah gejala dari masalah yang sebenarnya, yang merupakan kerentanan dalam memori dari bahasa berbahaya. pendekatan akademik sering menyajikan ekstensi untuk bahasa atau mekanisme pengiriman yang mencoba untuk memecahkan semua masalah yang terkait dengan tingginya biaya overhead. Pendekatan umum mempengaruhi kinerja terlalu banyak, atau tidak mengambil aplikasi yang ada untuk kompleks. tes dunia nyata untuk ini, sebagai aturan, “itu dapat membangun Chrome atau Firefox.” Jika jawabannya tidak, maka itu belum siap. Pendekatan terbaik untuk mengurangi risiko kesalahan untuk pergi ke berhenti mencari perpanjangan penuh program dalam memori bahasa berbahaya. Masalah ini hampir tidak mungkin untuk memecahkan dalam dunia tenggat waktu, anggaran dan 30 tahun rusak bahasa pilihan desain pemrograman. Sebaliknya, upaya penelitian kami harus difokuskan pada bagaimana kita dapat menghentikan serangan yang mempengaruhi kita hari ini.


Pendidikan Blackhat Dengan LeafSR

konferensi Blackhat di Las Vegas datang dengan cepat. Tahun ini, Anda dapat mengunjungi pelatihan 2-hari kami “maju kode sumber analisis C / C ++” dan belajar bagaimana untuk menemukan kerentanan dalam program yang besar dan kompleks seperti web browser. Klik pada link untuk penjelasan yang lebih rinci dan beberapa testimonial dari mantan siswa.

Tidak seperti kursus pelatihan, sumber audit tidak menawarkan pemahaman yang lebih baik dari kelas kompleks kesalahan, seperti jenis kebingungan dan metode terbukti untuk menemui mereka, siswa juga akan belajar untuk mengevaluasi kerentanan spesifik yang luas karena tidak semua stack overflow yang kritis dan tidak semua dereference NULL pointer tidak ada biaya apapun. Mari kita lihat kerentanan di Firefox, WebKit, Native Client dan server user / RPC IPC ditulis hanya untuk kursus ini.

operasi Handal pada platform modern, membutuhkan tingkat akurasi tertentu. presisi ini berasal dari memahami mekanisme kompleks komponen software yang kompleks, seperti penyalur memori, analisa, mesin JIT dan kolektor sampah. Jika bunga eksploitasi Anda, kemudian datang untuk mencari tahu persis bagaimana sampah pekerjaan V8 JavaScript dengan benda-benda seperti WebKit dan dapat diandalkan karena untuk digunakan setelah kerentanan dalam operasi rilis WebKit.

Kami yakin bahwa Anda akan meninggalkan Las Vegas dengan perspektif baru tentang audit dari sumber-sumber dan keterampilan baru untuk membantu Anda mengidentifikasi kelemahan, dipersenjatai tidak lebih dari editor teks. Yang Anda butuhkan untuk membawa ke kelas laptop, IDE favorit Anda dan keinginan untuk membaca banyak kode.

Sebagai harga kursus akan sampai setelah 31 Mei dan kedua kelas (27-28 Juli dan 29-30 Juli) mengisi dengan cepat. Anda dapat menemukan penjelasan kursus kami dan informasi lebih lanjut di sini di situs Blackhat. Kami berharap dapat melihat Anda di Las Vegas!


Bandingkan asm.js dan NaCl

OK, jadi aku terlambat untuk beberapa bulan asm.js / klien swasta (NaCl) diskusi. Ini normal, karena sebagian besar dari apa yang telah dikatakan sejauh yang membandingkan menakutkan. Jika Anda tidak akrab dengan teknologi apapun, kemudian melihat itu dan ini adalah yang pertama atau posting tidak masuk akal. Dua teknologi bersaing memiliki tujuan yang sama: membawa kode Anda sendiri di Internet. Tapi mereka berdua pendekatan untuk memecahkan masalah ini dengan cara yang berbeda.

Apa masalah dengan jaringan dalam bentuk yang sekarang?

Sejak pertengahan 2000 atau jadi ada upaya besar ini untuk mengambil semua aplikasi legacy dan paste dalam bentuk tag HTML dengan beberapa CSS ringan . Sebuah ide bagus dalam teori, kecuali bahwa, pada kenyataannya, tidak bekerja untuk semua orang jutaan baris aplikasi yang ada C / C ++. Lalu ada aplikasi seperti game dan perkantoran / kantor yang membutuhkan tingkat yang lebih tinggi dari pengguna interaktivitas dan kinerja tentu saja. Kami tidak membahas, Anda dapat melakukan hal-hal menakjubkan dengan JavaScript. Kami hanya mencoba untuk mengatakan bahwa kerja keras hampir selalu datang ke kode mesin dan baterai Theres ada C / C ++, duduk-duduk. Sayangnya, hanya tersedia lingkungan scripting JavaScript di browser Anda. Meskipun mesin JIT dibuat sangat cepat dalam beberapa tahun terakhir, yang lari dari kekuatan C ++ untuk JavaScript masih seperti pemrograman dengan satu tangan terikat di belakang punggungnya. JavaScript tidak memiliki sistem yang cukup mengetik perlu Anda lakukan operasi bit tingkat rendah. Banyak pengampunan, charCodeAt Nha mulai memotong. Mungkin yang paling menyenangkan solusi untuk masalah ini adalah array diketik JavaScript. Yang tidak hanya memungkinkan Anda untuk memuat kernel Linux di browser Anda, tetapi juga kerajinan tumpukan tepat biaya feng shui yang sangat jelek dengan jalur reguler. Sayangnya, mengetik array hanya membawa Anda sejauh ini, karena pada akhirnya, Anda masih menulis JavaScript, dan yang tidak menyenangkan. Harus ada cara yang lebih baik untuk melakukan hal ini …

Apa asm.js?

Ini adalah mesin virtual untuk mengkompilasi C / C ++ program dalam bahasa JavaScript, dan kemudian menjalankannya pada browser. Proses ini dilakukan dengan menggunakan llvm untuk menyertakan C / C ++ kode llvm, yang merupakan sedikit kode, dan kemudian diumpankan ke Mozilla Emscripten, yang membuat JavaScript. Jika browser adalah spesifikasi asm.js (bagian yang ketat dari JavaScript), itu bisa mendapatkan keuntungan dari beberapa kompilasi AOT yang akan mengoptimalkan kode mesin yang dihasilkan. Naik satu bahasa ke bahasa lain tidak baru, telah dilakukan berkali-kali sebelumnya. Karena banyak bahasa yang berbeda dapat dikompilasi ke masa kecil kode LLVM, memiliki banyak kasus penggunaan potensi asm.js.

Setiap Selain asm.js hidup di dalam mesin virtual sendiri, semua tata letak memori virtual yang terkandung dalam array JavaScript masuk. asm.js spesifikasi teknis bagian dari JavaScript, yang berarti non-JavaScript, maka Anda harus menyimpannya secara eksplisit untuk memperoleh manfaat (lihat di atas). Asm.js memiliki sintaks yang dapat Anda baca / tulis sebagai manusia, bukan bytecode, dan sangat dekat dengan JavaScript. asm.js keuntungan yang sudah ada interpreter JavaScript cepat. Hanya bekerja “dan hari ini, itu hanya akan mendapatkan keuntungan dari AOT kompilasi, sedangkan juru JavaScript yang mendukung menganalisis asm.js sintaks beton … bahwa hanya Firefox mendukung setiap malam sekarang …

salah satu hal utama adalah bagian dari JavaScript tidak untuk Anda menghapus persyaratan JavaScript JIT digunakan untuk generasi kode, yang bekerja pada data yang bisa mengubah jenis setiap saat. Jika Anda JavaScript Browser JIT compiler mencari sepotong JavaScript kode seperti ini. ..

 untuk (var b, c) {var /> 
}

satu ( 'BAT', 'OK');
yang (1,2);

… LT tidak tahu jenis yang atau C variabel metode. untuk memecahkan masalah ini, untuk menghasilkan kode untuk a , yang dapat bekerja dengan string, integer dan jenis lain yang didukung oleh mesin, yang dapat memanfaatkan + operator. peramban kembali berakhir Anda harus menjaga variabel ini seperti yang ditunjukkan oleh struktur data yang menunjukkan jenis. Aku bicara secara umum di sini, rincian pelaksanaan berbagai EIC akan berubah. Tapi Anda mungkin bisa melihat bagaimana memperlambat segalanya, tetapi merupakan kebutuhan untuk menciptakan kode Anda sendiri untuk bahasa dinamis diketik seperti JavaScript. Dalam asm.js beberapa pembatasan ini akan diangkat, karena berhubungan dengan kode C / C ++ yang tidak mendukung tipe dinamis, seperti JavaScript tidak. Ketika Anda mendeklarasikan int yang int . Tentu saja, jika Anda tidak bermain dalam beberapa cara lain, tetapi kasus-kasus ini biasanya jelas dan compiler tahu tentang mereka sebelumnya. Jika Anda tertarik untuk bagian-bagian mesin JIT dan bagaimana mereka menangani hal semacam ini, saya sarankan blog ini.

Anda mungkin telah menebak bahwa program seperti permainan yang kompleks dan memiliki komponen visual, yang biasanya dilakukan pada GPU. Untuk melakukan hal ini, kita harus WebGL. Tapi kemudian ada audio, jaringan, akses ke file dan benang. Tampaknya solusi untuk masalah ini akan membutuhkan beberapa API berat dan sangat kaya …

Apa Native Client (NaCl)?

Kami berbicara tentang banyak NaCl di blog ini, tapi ini adalah karena pendekatan baru untuk masalah yang sangat sulit, yaitu, kinerja kode asli dalam memori aman x86 arsitektur suka. Ada reinvention lain deteksi kode berbahaya, pendekatan yang unik untuk kotak sampah semua kode, sementara memberikan mereka akses ke CPU baku. The NaCl tidak mengubah kode yang ada, menerima langsung instruksi x86 / x86_64 / ARM dari Internet, memeriksa mereka dan mengeksekusi mereka. Ini adalah perbedaan mendasar antara asm.js NaCl. Yang pertama mengambil C / C ++ dan mengubahnya menjadi JavaScript, yang dilewatkan melalui mesin JIT, indikasi bahwa ia melakukan sendiri seperti yang Anda menyediakan mereka di browser Anda.

Tentu saja ada beberapa kompromi, seperti proses perakitan sedikit rumit, tapi Google pergi keluar dari jalan mereka untuk menghilangkan rasa sakit. Portabel Native Client (PNaCl) mengambil langkah lebih lanjut dan memungkinkan pengembang untuk memuat sedikit kode ke aplikasi Anda, yang PNaCl disusun untuk musim panas untuk arsitektur tertentu. Dalam hal ini, tampaknya PNaCl asm.js sedikit lebih dekat ke permukaan model, tetapi di bawah itu benar-benar berbeda arsitektur. Kode PNaCl melakukan ada di kotak pasir, dan harus mematuhi aturan ketat yang diberlakukan NaCl.

NaCl juga menyediakan API yang kaya dan melalui PPAPI untuk melakukan pekerjaan berat, grafis, audio dan sungai. Kami tidak akan menutupi arsitektur NaCl sangat mendalam di sini, untuk melihat posting lama kami blog untuk itu. Sebaliknya, kita beralih ke perbandingan keamanan NaCl dan asm.js

Apa manfaat / keamanan trade-off yang masuk?

Setiap baris baru dari kode menambahkan serangan permukaan, dua komponen ini tidak berbeda. Sejak asm.js adalah bagian yang ketat dari kode analyzer JavaScript akan baru untuk melihat. asm.js sifat operasi masih harus dilihat bagaimana hanya di Firefox di malam hari sekarang. Pertama saya kira adalah halaman JIT mencakup ekstensi Firefox tidak mungkin. Saya juga yakin bahwa Anda dapat menggunakannya untuk menurunkan, jika tidak benar-benar diatasi, ASLR. Dalam kami peran serangan JIT Yang Ivnitskiy 2011, saya membahas menggunakan JavaScript untuk mempengaruhi output mesin JIT untuk memasukkan urutan tertentu kode ROP ke dalam memori executable. Saya menduga bahwa kebanyakan pipa JIT digunakan untuk mengkonversi kode asm.js ke dalam kode mesin akan membuat proses lebih mudah di beberapa titik, tapi saya tidak memiliki data untuk membuktikannya sekarang.

Pendekatan mengambil bahasa unmanaged, seperti C / C ++ dan mengubahnya menjadi manajemen dan memastikan memori memecahkan masalah korupsi dalam memori khusus ini bagian dari kode. Jadi jika beberapa C ++ kode awalnya berisi buffer overflow, setelah konversi dan bekerja di asm.js Anda memiliki akses ke jenis JavaScript yang berasal dari pengendalian internal pada saat dijalankan untuk menghindari masalah tersebut. Daripada harus merekam ulang beberapa informasi penting yang akan Anda melemparkan sebuah pengecualian, dan browser akan terus seolah-olah tidak ada yang terjadi. Sebagai titik sisi, mungkin menarik untuk menulis instrumen Asan-seperti dengan asm.js, hasil tes dan kode rambut C / C ++ di browser dengan runtime JavaScript sebagai alat.

NaCl menawarkan lebih dari sekedar hasil bahwa kode C yang ada / C ++ di browser Anda. NaCl memiliki sandbox aplikasi unik, yang dapat digunakan di banyak tempat lain. NaCl statis memeriksa semua kode sebelum dieksekusi. Pemeriksaan ini memastikan bahwa unit dapat dijalankan hanya kode yang menganut satu set ketat aturan. persyaratan ini, sebagai modul NaCl memiliki akses penuh ke prosesor dan dapat melakukan lebih dari program JavaScript saat ini dapat menggunakan antarmuka PPAPI di Chrome. Persyaratan validasi ini dan kode streaming memiliki kinerja di atas kepala, tetapi tidak cukup sehingga membuat aplikasi tidak dapat digunakan besar.

Aku masih berpikir kita akan melihat NaCl pada Android, satu hari, sebagai cara untuk bersaing dengan kode penandatanganan IOS. NaCl adalah DAS untuk plug-in, yang saya percaya itu akan mempengaruhi proyek sandbox untuk terus maju. Jika Anda mengembangkan sandbox untuk aplikasi Anda hari ini, Anda harus membaca dokumen proyek Anda kemarin.

asm.js sandbox tidak menyediakan, atau tingkat keamanan tambahan dalam hal ini. Itu hanya yang mengkompilasi satu set alat untuk bahasa asli di bagian JavaScript. didasarkan pada memori aman dari mesin virtual yang disediakan oleh interpreter JavaScript yang ada yang berisi kode. Kita semua tahu seberapa baik yang bekerja. Tentu saja, saya tidak berbalik sini Mozilla tanpa sandbox browser target yang mudah. Tapi di mana perbedaan utama antara asm.js dan NaCl menjadi jelas. Asm.js tidak pernah dimaksudkan untuk meningkatkan keamanan Firefox, hanya membawa kode C ++ / C untuk sebagian besar platform berbasis web yang ada. NaCl akan melakukannya juga, tetapi juga meningkatkan keamanan Chrome, yang berisi semua plug-in di dua kotak pasir. Saya percaya bahwa jika itu perlu untuk mengambil sebagai plug-in Adobe Flash Player dan port untuk asm.js keuntungan dari keamanan untuk pengguna Firefox, namun pada akhirnya mereka masih tanpa sandbox sekitar mereka dan mesin JavaScript mungkin membayar kinerja yang baik untuknya, juga.

Kesimpulan

asm.js masih dalam pengembangan berat, maka NaCl / PNaCl, tetapi yang terakhir sedikit lebih dewasa saat ini diberikan tujuannya end. Untuk menjalankan asm.js yang ada / C ++ program di perpustakaan bahasa C dan Anda akan harus menyediakan API yang komprehensif, yang membuatnya jauh lebih banyak daripada interpreter yang ada JavaScript menyediakan. NaCl sudah saat ini menawarkan ini bersama dengan kinerja yang lebih baik dan konstruksi lebih kuat dari sandbox. Jika Mozilla ingin mendapatkan serius tentang menjalankan semua kode yang tidak dipercaya dari Internet pada juru JavaScript Anda, itu akan membutuhkan sandbox benar secepat mungkin.

Akhirnya, ketika masa depan mengkompilasi ulang semua JavaScript untuk masa depan jelek.

Update 03/06/13: Tetap beberapa teks ambigu, dipahami asm.js bekerja hanya di Firefox. Lihat detail di atas

NKU racun

Microsoft telah mengambil sikap yang lebih proaktif dalam pengembangan alat keamanan mereka sejak SDLC pada pertengahan tahun 2000. Salah satu langkah sebelumnya dari SDLC digunakan untuk mengurangi kode rentan seharusnya memasukkan file header dengan nama banned.h. Apa yang membuat file header ini digunakan untuk mempermalukan MSVC Pragma fitur yang pengembang sering digunakan secara tidak benar, dan sebagai akibat dari pelaksanaan terpencil kode kerentanan eksekusi dalam aplikasi mereka. Fungsi-fungsi ini tersangka: strcpy, sprintf, memcpy, CopyMemory, RtlCopyMemory, strcat, alloca dan banyak hal lain yang spesifik Win32 . Cara kembali banned.h versi asli Anda memiliki dukungan serupa untuk GCC, tapi dia ditembak di tempat yang saya tidak ingat pada tahun 2008, ketika, atau mengapa, tetapi tidak masuk akal bagi Microsoft untuk mendukung fitur ini dari setiap cara.

Bahkan saat ini, pada tahun 2013, sebagian besar perangkat lunak warisan yang masih penting bagi banyak perusahaan berisi kode yang memanggil fungsi perpustakaan rentan. Meskipun perlindungan memori modern sebagai ASLR dan DEP kerentanan fungsi-fungsi ini juga memperkenalkan cocok untuk digunakan dalam kondisi tertentu.

Sayangnya, sejauh ini, tampaknya tidak setara dengan proyek banned.h menggunakan GCC, jadi saya mulai halaman proyek untuk GitHub. Menggunakan GCC racun Pragma larangan pengenal spesifik kode Anda. Sejauh yang saya tahu, dia tidak merekomendasikan penggunaan GCC Pragma (tapi untuk bersikap adil, saya tidak merekomendasikan menggunakan GCC, dentang adalah pilihan). Ada beberapa keberatan untuk pendekatan ini, namun, jika pegangan adalah bagian dari makro diperluas sebelum pegangan diracun, itu tidak akan memberikan pesan kesalahan. Itu sebabnya Anda tidak ingin bermain panggilan berbahaya kesalahan GCC dibuat dalam file header di luar kendali Anda. Berikut adalah contoh bagaimana Pragma:

# include & amp; amp; l; stdio.h & amp; amp; gt;
# include & amp; amp; l; string.h & amp; amp; gt;

# pragma GCC racun strcpy

int main (int argc, simbol * ARGV [] ) {
simbol BUF [10];
strcpy (buf, ARGV [1]);
return 0;
}

$ rantai CLE -o string.c
string.c: Dalam fungsi ‘utama':
string.c: 8: 2: error: upaya untuk menggunakan diracuni “strcpy”

sederhana tetapi dapat sangat berguna jika Anda memiliki banyak C kode warisan duduk di sekitar bahwa Anda ingin menghapus fungsi-fungsi ini dan menyimpan pengembang untuk terlibat dalam kompilasi kode baru yang berisi mereka. Untuk peluncuran awal dari GCC-racun, kami membuat daftar singkat dari fungsi C berbahaya dalam file header Anda termasuk sumber, seperti yang Anda lakukan dengan banned.h. Saya menekankan “kecil” di sini untuk beberapa alasan penting.

Microsoft dapat melarang banyak fungsi sederhana lainnya, karena Libc mereka setara keamanan, tetapi GNU Libc kehilangan mereka ke daftar kami tidak komprehensif. Sebuah contoh yang baik adalah fungsi memcpy. Ini mungkin adalah sumber dari sejumlah besar serangan buffer overflow, tapi itu hanya tidak praktis untuk menghapus sebagian besar program. Pemecahan masalah ini membutuhkan fungsionalitas yang Pragma racun tidak menyediakan ekstensi seperti compiler dan setara asuransi. Standar C11 baru mendefinisikan beberapa fungsi pengganti melindungi mereka “tes batas antarmuka” bagian, tetapi sejauh yang saya tahu, tidak Glibc menemani memutuskan untuk melaksanakannya, dan mereka melampaui perkembangan penyakit kardiovaskular.

target penggunaan poison.h kami (atau yang serupa) untuk membantu memastikan bahwa kode warisan. masih jauh dari sempurna, tetapi Anda harus dapat menggunakannya dalam proyek internal, menambahkan semua API kustom, Anda ditakdirkan pada tahun 2004 tetapi tidak bisa berhenti pengembang untuk menggunakan.


Blackhat Webcast: C / C ++ AppSec pada 2014

saya akan memberikan Blackhat Webcast gratis di 30 Januari 2014 02:00 ET. Masalah yang akan saya bahas adalah “AppSec C / C ++ pada tahun 2014″. Banyak orang percaya AppSec hanya berlaku untuk aplikasi Web dan aplikasi mobile, tapi AppSec istilah umum yang berlaku untuk setiap aplikasi yang ditulis dalam bahasa apapun. Sementara C dan C ++ bahasa yang lebih tua, mereka di mana-mana dan penting untuk bisnis dan start-up sama. Selama siaran, saya akan membahas kejahatan kesalahan diekstrak dalam memori dan AppSec tampaknya di aplikasi modern C / C ++. Anda dapat membaca deskripsi lengkap dalam situs Blackhat.

Pendidikan di Black Hat USA 2014

Sekali lagi, kami akan memberikan kursus kami “Advanced C / C ++ sumber analisis kode” di Black Hat USA acara tahun ini. Kami menawarkan kursus ini sering klien pribadi kita sepanjang tahun, daripada pengiriman konten terjadi tanpa perbaikan material. kami selalu berusaha untuk menjaga contoh, slide dan kuliah untuk tanggal bahasa. C / C ++ mungkin lebih, tapi kami ingin memastikan bahwa kami mencakup bahan yang relevan, dan itu berarti menjaga Jika diperbarui dan sejalan dengan topik yang ingin siswa kami belajar tentang. kami memperbarui tukar untuk acara Black Hat tahun ini dengan kerentanan dalam versi yang lebih baru dari Nginx, WebKit / Blink, C ++ 11, dan banyak lagi.

ini bukan semacam coding keamanan, dan kami tidak ‘t membuat strcpy. Jika Anda ingin memahami manajemen siklus hidup objek dengan aturan lima tahun, atau untuk memantau dan menganalisis penggunaan terintegrasi setelah pengungkapan kerentanan yang dihasilkan dari mekanisme kurangnya referensi menghitung memberikan tugas operator kelebihan beban, Anda ingin mendaftar untuk kursus. Kami berjanji bahwa Anda akan meninggalkan dengan perspektif yang berbeda tentang audit source code dan sedikit lebih percaya diri bahwa Anda dapat membuat SVN WebKit terbaru dan mulai mencari 0 hari. Sampai jumpa di Las Vegas!


hatiku baik-baik saja, tapi mata saya berdarah

TL; DR: Heartbleed buruk, tapi bukan akhir dari dunia. OpenSSL tidak rentan karena freelists mereka dan akan terus menjadi rentan tanpa mereka.

Kami merasa itu tidak cukup Heartbleed masih merekam jendela, sehingga menulis lagi. Tidak seperti banyak tempat-tempat lain, kita tidak akan berbicara tentang TLS, atau mengapa kami percaya bahwa ekspansi jantung tidak berarti. Sebaliknya, mari kita fokus pada diri sendiri, dan lebih khusus lagi kesalahan, kerahasiaan data bocor.

Pertama, kami ingin menyatakan bahwa, sejauh bahwa kesulitan akan, kerentanan Heartbleed adalah tidak ada yang istimewa, tapi itu tidak berarti itu mudah untuk menemukan. Semua kesalahan yang mudah terdeteksi setelah seseorang menunjukkan mereka kepada Anda. 20/20 mungkin retrospektif. Rick dan Anti Ibu di Codenomicon dan Neelie Mehta Google semua ditemukan terlepas dari kesalahan. Neale juga cukup baik untuk cek kesehatan situs ini sebelum pergi hidup (terima kasih kepada Neel!) Terlepas dari perasaan Anda pada pengungkapan kerentanan, Anda harus berterima kasih kepada mereka untuk itu untuk menemukan kesalahan dan memberi kita semua sesuatu yang menarik untuk dibicarakan.

Semua kode dalam pesan OpenSSL-1.0.1c ini, yang adalah apa yang saya kerjakan usia mesin virtual dengan Apache. Pertama, mari kita lihat beberapa struktur data OpenSSL penting. Untuk diskusi ini, tingkat “atas” dari struktur SSL , yang didefinisikan di ssl.h , yang ssl_st dengan typedef . Dalam struktur ini adalah pointer ke s3 Ketik SSL3_STATE , yang merupakan typedef dengan ssl3_state_st . Dalam struktur ini adalah struktur lain seperti SSL3_RECORD , yang kita sebut sebagai RREC . SSL3_RECORD mengandung Jenis dan Panjang nilai-nilai di bidang lain. SSL3_STATE struktur juga mengandung RBUF dan WBUF Ketik SSL3_BUFFER . SSL3_BUFFER struktur berisi pointer ke data buf dan Len / diimbangi / meninggalkan anggota untuk melacak penggunaannya. buffer ini dialokasikan dan sering dilepaskan selama pertukaran TLS. Dalam rangka meningkatkan kinerja, para pengembang menulis terpisah pelaksanaan daftar bebas OpenSSL untuk penyimpanan. Implementasi ini memori bebas ternyata kereta, tapi sangat mudah untuk memahami (lebih di bawah ini). memori bebas sebenarnya adalah dua daftar, satu untuk membaca buffer ( RBUF ) dan satu untuk menulis buffer ( WBUF ). Daftar ini tersedia melalui SSL_CTX struktur yang berisi wbuf_freelist dan rbuf_freelist , masing-masing. Kami mengacu SSL_CTX struktur melalui pointer dalam SSL struktur. Heres beberapa pseudo-kode untuk membuatnya kurang membingungkan. Beberapa variabel berkurang karena singkatnya

 {struktur SSL SSL_CTX * CTX. SSL3_STATE * s3; {Struktur} SSL_CTX SSL3_BUF_FREELIST wbuf_freelist; SSL3_BUF_FREELIST rbuf_freelist; {} Struktur SSL3_STATE SSL3_BUFFER RBUF; / * Membaca IO goes here * / SSL3_BUFFER WBUF; / * Rekam IO goes here * / SSL3_RECORD RREC; / * Setiap decode catatan goes here * / WREC SSL3_RECORD; / * Jadi di sini * /} {struktur SSL3_BUF_FREELIST size_t chunklen; unsigned int Len; SSL3_BUF_FREELIST_ENTRY * kepala; {} Struktur SSL3_BUFFER unsigned char * buf; / * Setidaknya SSL3_RT_MAX_PACKET_SIZE byte * cm (ssl3_setup_buffers) * / size_t Len; / * Ukuran penyangga * / diimbangi INT; / * Ketika "copy" * / INT kiri; / * Jumlah byte kiri * /} struktur SSL3_RECORD {/ * Jenis * g / INT; / * Rekam Jenis panjang * / / * * RW / INT unsigned; / * Jumlah byte yang tersedia * / / * g * / unsigned int Off; / * Baca / menulis offset 'BUF' * / / * * RW / unsigned char * data; / * Pointer untuk menulis data * / / * * RW / unsigned char * masukan; / * Dimana decoding byte * / / * g * / unsigned char * komputer; / * Hanya dapat digunakan dengan dekompresi - Thanos () ed * /} 

Jadi sekarang kita memahami beberapa struktur dasar memungkinkan kita untuk menyelidiki kerentanan. Heartbleed adalah dalam kisaran dari membaca pelaksanaan OpenSSL TLS detak jantung. tls1_process_heartbeat fungsi bertanggung jawab untuk analisis pesan detak jantung TLS. Sejalan 2586 pointer ke dialokasikan beban S, yang merupakan pointer ke struktur seperti SSL . Struktur ini berisi sebuah pointer ke s3 Ketik SSL3_STATE . Struktur yang ditunjukkan oleh s3 adalah array SSL3_RECORD jenis, yang kita sebut sebagai RREC . Indeks P sekarang menunjuk ke record pertama. Di 2593 garis nilai panjang diekstrak dari catatan dan ditugaskan untuk payload [1]. 2610 garis memori yang dialokasikan untuk pesan respon. Panggil OPENSSL_Malloc mengalokasikan cukup memori untuk (19 + payload) byte, nilai kembali ditugaskan untuk pointer Clipboard . Baris di 2616 disebut memcpy disalin dari Lapangan (menunjukkan bahwa catatan hanya jenis dan panjang bidang) di PV (The penyangga kami hanya dialokasikan ke baris di 2610) adalah persis jumlah biaya byte berguna

 2584 tls1_process_heartbeat (SSL * s) 2585 2586 {unsigned char * p = & amp; amp; amp;. S & amp; amp; gt; s3- & amp; amp; gt; rrec.data [0] * pl; 2587 tanpa tanda tangan hbtype singkat; 2588 tanpa berguna sinyal beban INT; 2589 INT unsigned paket = 16; / * Gunakan minimum mengisi * / 2590 2591 / * Baca jenis dan panjang payload pertama * / 2592 hbtype = * p ++; 2593 n2s (p, payload); Pl = 2594 w; 2595 2596, ketika (S & amp; amp; gt; msg_callback) 2597 s- & amp; amp; gt; msg_callback (0, s & amp; amp; gt; versi TLS1_RT_HEARTBEAT, 2598 & amp; amp; amp; s- & amp; amp; gt; s3- & amp; amp; gt; rrec.data [0] s & amp; amp; gt; s3 - & amp; amp; gt; RREC panjang, 2599 s, s & amp; amp; gt; msg_callback_arg) ;. 2600 2601 ketika (hbtype == TLS1_HB_REQUEST) 2602 2603 {unsigned char * buffer * bp; 2604 INT R; 2605 2606 / * Alokasikan balasan ukuran 2607 bytes * jenis pesan, dan ukuran beban 2-byte lebih 2.608 * Payload lebih bantalan * 2609/2610 = OPENSSL_malloc penyangga (1 + 2 + mengisi muatan +); 2611 PV = penyangga; 2612 2613 / * Masukkan jenis respon, durasi dan menyalin payload * / 2614 * PN = ++ TLS1_HB_RESPONSE; 2615 (basis pasangan payload) s2n; 2616 memcpy (BP, pl, payload); 2617 PV + = Payload; 2618 / * hal acak * / 2619 RAND_pseudo_bytes (PV, indentasi); 2620 2621 g = ssl3_write_bytes (s, TLS1_RT_HEARTBEAT, penyangga bantalan + 3 + payload); 

Jadi kesalahan adalah bahwa ukuran catatan Lapangan poin untuk tidak cocok dengan nilai payload. pulsa koneksi TLS dengan mengirimkan panjang nilai lebih besar dari ukuran sebenarnya dari rekor memcpy baca di luar rekaman dan kembali ke apa yang ada di memori setelah perekaman pengguna. kesalahan ini sederhana dan telah didokumentasikan dengan baik di tempat lain. Tapi mari kita mengambil langkah mundur dan fokus pada OPENSSL_malloc Panggilan. OPENSSL_malloc adalah makro yang memanggil CRYPTO_malloc di mem.c . CRYPTO_malloc adalah malloc_ex_func , yang merupakan pointer fungsi, yang dapat dikonfigurasi dalam pelaksanaan OpenSSL untuk memanggil Thanos lain:

 static void * (* malloc_func ) (size_t) = Thanos; static void * default_malloc_ex (size_t, const char * berkas, int baris) {return malloc_func (jumlah); } Static void * (* malloc_ex_func) (size_t, const char * berkas, int baris) = default_malloc_ex; 

Jika kita melihat prototipe fungsi di atas, kita melihat bahwa default_malloc_ex mengembalikan malloc_func , yang merupakan fungsi pointer ke ... menunggu untuk itu ... Thanos . Ini mungkin datang sebagai kejutan bagi Anda, tapi tampaknya ada beberapa kebingungan di internet yang terkena memori bila dipicu kesalahan ini. Lebih pada bahwa dalam beberapa poin.

Jadi kita tahu, CRYPTO_malloc dapat dikurangi untuk memanggil Thanos , dan membuat default. Ini adalah di mana data kami ditulis sebelum , tapi tidak di mana Anda membacanya dari . Untuk memahami mengapa data sensitif bocor, kita harus memahami bahwa freelists menyimpan catatan, di mana untuk mengambil data. Jika kita melihat SSL_CTX_new , kita melihat kode berikut, yang mendefinisikan pertama kalinya freelists. Sebagian besar anggota diinisialisasi ke 0 kecuali untuk wbuf_freelist dan rbuf_freelist , yang ditugaskan untuk panggilan mengembalikan nilai dari OPENSSL_malloc .

 1677 SSL_CTX * SSL_CTX_new (Const SSL_METHOD * met) 1678 {... 1827 #ifndef OPENSSL_NO_BUF_FREELISTS 1828 RET & amp; amp; gt; freelist_max_len = SSL_MAX_BUF_FREELIST_LEN_DEFAULT; 1829 RET & amp; amp; gt; rbuf_freelist OPENSSL_malloc = (sizeof (SSL3_BUF_FREELIST)); Jika 1830 (RET & amp; amp; gt;! Rbuf_freelist) 1831 Goto ERR; 832.000 RET & amp; amp; gt; rbuf_freelist- & amp; amp; gt; chunklen = 0; 1833 RET & amp; amp; gt; rbuf_freelist- & amp; amp; gt; Len = 0; 1834 RET & amp; amp; gt; rbuf_freelist- & amp; amp; gt; Kepala = NULL; 1835 RET & amp; amp; gt; wbuf_freelist OPENSSL_malloc = (sizeof (SSL3_BUF_FREELIST)); 1836 Ketika (RET & amp; amp; gt;! Wbuf_freelist) 1837 {1838 OPENSSL_free (RET & amp; amp; gt; rbuf_freelist); 839.000 Goto ERR; 1840} 1841 RET & amp; amp; gt; wbuf_freelist- & amp; amp; gt; chunklen = 0; RET 1842 & amp; amp; gt; wbuf_freelist- & amp; amp; gt; Len = 0; 1843 RET & amp; amp; gt; wbuf_freelist- & amp; amp; gt; Kepala = NULL; 

ini menyoroti entri pertama dalam rbuf_freelist dan wbuf_freelist memanggil OPENSSL_malloc , kita tahu tantangan ke Thanos . Dengan demikian, kita tahu bahwa memori punggung daftar ini awalnya dipilih dengan Thanos , sehingga tinggal di sepanjang sisi bagian rutin lain dari kode ditugaskan, disebut Thanos langsung. Potongan-potongan ditambahkan ke blok bebas menggunakan freelist_insert dan diekstrak dari blok bebas, menggunakan freelist_extract . Jika freelist_extract fungsi disebut untuk pertama kalinya dalam daftar chunklen 0 (lihat di atas), yang berarti bahwa garis 688 tidak akan tercapai, sehingga THT dan hasil = NULL , yang berarti bahwa panggilan OPENSSL_malloc on line 698 akan terjadi. Ini hanya mengembalikan sepotong sel di bawah kendali Thanos . Jika kondisi ini terpenuhi, daftar irisan bebas yang ada yang tersedia untuk digunakan, sesuai dengan ukuran yang dibutuhkan. Blok ini dilewatkan kembali ke pemanggil, dan ukuran daftar berkurang satu jika itu adalah bagian terakhir dalam daftar, chunklen reset ke 0.

 678 static void * 679 freelist_extract (SSL_CTX * CTX, INT for_read, Int SZ) 680 {681 daftar SSL3_BUF_FREELIST *; 682 SSL3_BUF_FREELIST_ENTRY * THT = NULL; 683 * Hasil tidak valid = NULL; 684.685 CRYPTO_w_lock (CRYPTO_LOCK_SSL_CTX); 686 daftar for_read =? ctx- & amp; amp; gt; rbuf_freelist: ctx- & amp; amp; gt; wbuf_freelist; 687 if (list = NULL & amp; amp; amp;! & Amp; amp; amp; sz == (INT) daftar-& amp; amp; gt; chunklen) 688 THT = daftar-& amp; amp; gt; kepala; 689 if (THT = NULL!) {Daftar-690691 & amp; amp; gt; Kepala = & amp; amp; THT GT; berikutnya; 692 hasil = THT; 693 if (--list- & amp; amp; gt; Len == 0) 694 daftar-& amp; amp; gt; chunklen = 0; 695} 696 CRYPTO_w_unlock (CRYPTO_LOCK_SSL_CTX); 697-698 hasil = OPENSSL_malloc (SZ) (hasil!); Hasil 699 kembali; 700} 

Jika pemanggil dilakukan dengan sepotong penarikan dari daftar panggilan freelist_insert diproduksi. Fungsi pemeriksaan pertama untuk melihat apakah ukuran yang diminta sama dengan daftar chunklen , atau jika daftar chunklen 0. cek lain untuk melihat apakah daftar Len di freelist_max_len (default 32) dan lebih besar dari sizeof (SSL3_BUF_FREELIST_ENTRY) . Jika kondisi ini terpenuhi, maka daftar chunklen diatur ke ukuran yang diinginkan (bisa 0 jika tidak digunakan sebelumnya), THT ditugaskan nilai fragmen menjadi dimasukkan, Berikutnya pointer diatur di kepala daftar kepala diatur untuk THT , ukuran daftar meningkat, dan akhirnya MEM pointer diatur ke NULL. Jika kondisi ini tidak terpenuhi, pertama MEM akan free'd memanggil OPENSSL_free on line 725.

 702 703 kekosongan freelist_insert statis (* SSL_CTX CTX INT for_read, size_t sz, void * MEM) 704 {705 * daftar SSL3_BUF_FREELIST; 706 SSL3_BUF_FREELIST_ENTRY * THT; 707.708 CRYPTO_w_lock (CRYPTO_LOCK_SSL_CTX); 709 Daftar = for_read? ctx- & amp; amp; gt; rbuf_freelist: ctx- & amp; amp; gt; wbuf_freelist; 710 if (list = NULL & amp; amp; amp;! & Amp; amp; amp; 711 (SZ == daftar-& amp; amp; gt; chunklen || daftar-& amp; amp; gt; chunklen == 0) & amp; amp; amp; & amp; amp; amp; 712 daftar-& amp; amp; gt; Len & amp; amp; l; ctx- & amp; amp; gt; freelist_max_len & amp; amp; amp; & amp; amp; amp; 713 SZ & amp ; amp; gt; = sizeof (* THT)) 714 {715 daftar-& amp; amp; gt; chunklen = SZ; 716 THT = MEM; 717 & amp; amp; THT GT; daftar-harinya = & amp; amp; gt; kepala; 718 daftar-& amp; amp; gt; Kepala = THT; 719 ++ daftar-& amp; amp; gt; len; 720 MEM = NULL; 721} 722 723 CRYPTO_w_unlock (CRYPTO_LOCK_SSL_CTX); 724 if (MEM) 725 OPENSSL_free (MEM); 726} 

dapat membantu memori bebas untuk mempercepat pelaksanaan koneksi OpenSSL jika ukuran buffer tertentu diminta berulang kali. memori bebas (membaca dan menulis) tidak peduli apa isi dari bagian atau penelepon tersebut merujuk kepada mereka. buffer ini biasanya setup oleh ssl3_setup_buffers (yang merupakan ssl3_setup_read_buffer dan ssl3_setup_write_buffer ), dan akses kepada mereka sebagai s3- & amp; amp; gt; RBUF , dan akhirnya lulus kembali melalui ssl3_release_read_buffer dan ssl3_release_write_buffer . Oke, jadi sekarang kita memahami dasar-dasar blok SSL gratis (s).

Jadi mengapa semua ini adalah menarik, ketika datang ke Heartbleed? Nah, Internet adalah terang benderang dengan bukti konsep kode untuk kesalahan, aman kebocoran kredensial sesi sensitif dan kunci seharusnya rahasia. Dalam rangka untuk memahami bahwa ada kebocoran, kita hanya perlu melihat kami ssl & amp; amp; gt; s3- & amp; amp; gt; wbuf.buf dan ssl & amp; amp; gt; s3- & amp; amp; gt; rbuf.buf pointer. Kita tahu bahwa mereka dapat disimpan di blok bebas sepanjang sisi potongan lain dari ukuran yang sama persis. Kita juga tahu bahwa ruang bebas memiliki ukuran maksimum, yang merupakan 32 secara default. Jadi cara termudah untuk mulai memilih catatan dari daftar ini, hanya menambah daftar menggunakan beberapa sambungan, atau membuat beberapa permintaan dari berbagai ukuran. Yang terakhir bekerja karena daftar berisi hanya potongan ukuran tertentu.

Jadi sementara OpenSSL adalah menggunakan daftar bebas untuk catatan ini, mereka masih didasarkan pada memori dikembalikan oleh Thanos , yang berarti bahwa mereka dapat hidup berdampingan dengan memori lainnya, yang memiliki dan menggunakan komponen lainnya seperti web server yang menggunakan OpenSSL. Itu sebabnya kita melihat data rahasia ketika kita sebut kesalahan. Alasan lain yang dapat menyebabkan kebocoran data rahasia adalah bahwa OpenSSL mendekripsi catatan ini "di situs". Ini berarti bahwa data SSL buffer ditranskripsikan di lokasi saat ini di memori.

Saat ini, ada beberapa perdebatan tentang bagaimana keamanan OpenSSL melunak penurunan di distributor tumpukan standar, memasukkan daftar gratis Anda sendiri. Pada dasarnya, saya tidak setuju dengan pandangan ini.

  • Untuk memulai, memori bebas yang didukung oleh sistem Thanos (default). Mereka tidak menyadari mereka rentan Thanos sendiri () dari awal.
  • pelaksanaan daftar bebas dan desain yang sama dapat ditemukan dalam sebagian besar aplikasi cukup kompleks Anda berjalan pada desktop Anda sekarang.
  • Kerentanan ini masih cocok untuk digunakan, dan akan terus bocor daerah sensitif dari memori dengan atau tanpa blok bebas.
  • Menariknya, jika Anda ingin menguras data dari tumpukan umum blok bebas adalah bahwa Anda perlu untuk berkeliling pertama.

Ambil titik di atas penting untuk memahami fungsi dan tingkat keparahan keseluruhan kerentanan [2].

Kesimpulannya Heartbleed buruk tapi panik lakukan. kode OpenSSL dapat menjadi berantakan, tapi memiliki beberapa kerentanan eksekusi kode jauh dalam beberapa tahun terakhir bahwa tidak ada membayar banyak perhatian. Internet masih di sini, Anda dapat dengan aman menavigasi email Anda, sehingga tidak ada yang peduli, dan menyediakan banyak energi

Ditulis oleh:. @ChrisRohlf

[1] menunjuk panjang variabel "berguna" adalah batas sosiopat

[2] Dalam pelatihan C / C ++ analisis kode sumber kami yang canggih, kami berbicara banyak tentang memori distribusi dan bagaimana hal itu mempengaruhi tingkat keparahan kesalahan. Kami fokus pada di mana objek disimpan dalam memori, dan mengapa penting untuk memahami bagaimana siklus hidup mereka dikelola dan benda-benda lain dan struktur data yang dikelola bersama mereka.


Pastikan Komit

SR Leaf - Aman Komit Kami di sini Lembar SR terus menemukan kerentanan dampak yang signifikan keamanan dan arsitektur masalah keamanan bagi pelanggan kami: segala sesuatu dari penyalur berbahaya bagi eskalasi hak istimewa melalui aplikasi web unserialized session cookies. Kami ingin memecahkan masalah bahwa solusi untuk masalah ini membutuhkan. Kami hancur ratusan kerentanan keamanan yang buruk di zaman kita dan belajar banyak pelajaran berharga di sepanjang jalan. Kami sangat percaya dalam beberapa pelajaran keselamatan ini dan mengintegrasikan mereka ke dalam pekerjaan kami untuk klien setiap hari:

  • Keamanan sebelumnya merupakan bagian dari siklus pengembangan, semakin baik. desain yang aman lebih kuat dan lebih mudah untuk mempertahankan dalam jangka panjang
  • untuk bersaing dengan mengeksploitasi teknik dan tren serangan sangat penting untuk perlindungan dan promosi aplikasi yang paling sensitif dan kode
  • Rencana Ketersediaan tempat untuk mengatasi masalah-masalah keamanan yang mungkin timbul adalah salah satu investasi terbaik Anda dapat membuat aplikasi Anda

Hari ini mengumumkan “aman Komit”, yang mencakup semua layanan , kami menawarkan kaki surat SR. Asuransi Komit membuat semua yang telah kita pelajari selama bertahun-tahun, dan membuatnya tersedia untuk pengembang, keamanan dan personel operasional, pada setiap tahap siklus hidup pengembangan perangkat lunak. Jika Anda masih dalam perencanaan atau sudah mulai membuat fase kode, kita dapat menerapkan keahlian kami untuk proyek. Kami mencapai ini dengan bantuan dari ulasan arsitektur rinci, struktur defensif dan aplikasi tes.

Kita juga tahu bahwa aplikasi legacy dan masih sering memerlukan pendekatan yang berbeda untuk mengurangi potensi risiko. Ada beberapa langkah yang dapat Anda ambil untuk mengidentifikasi dan mengurangi kerentanan dalam aplikasi legacy dan meminimalkan dampak yang tetap tersembunyi.

Penerapan prinsip-prinsip, kita beralih untuk melindungi Komit kami percaya bahwa hasil akhirnya bisa menjadi kode yang lebih aman dengan utang keamanan yang lebih rendah dari waktu ke waktu.


Kita bergerak!

Kami punya kabar baik untuk mengumumkan hari ini DePerry Doug dan aku bergerak untuk bergabung dengan tim keamanan Yahoo. Kita tahu Alex Stamos, wakil presiden keamanan informasi Yahoo untuk beberapa waktu. Kami bertemu Alex melalui komunitas keamanan dan mengagumi upaya ia dan timnya lakukan untuk menjamin keamanan Yahoo, + 800 juta pengguna di seluruh dunia.

didirikan Piagam Security Research di 2011, dan bekerja dengan pelanggan dan mitra kami telah pengalaman yang sangat berharga bagi saya. Kami telah melakukan pekerjaan perintis untuk klien di seluruh sektor keuangan, start-up, pemerintah, dan yang ada di antara mereka. Sekarang saatnya untuk petualangan berikutnya. Kami berharap untuk membuat pengalaman kami di Yahoo dan tetap berhubungan dengan jaringan luar biasa yang telah kita buat selama bertahun-tahun.

Chris Rohlf

25 Juli 2014

” “border =” 0 “, SRC = “https://pixel.wp.com/b.gif?host=blog.leafsr.com&blog=37236103&post=123&subd=leafsr&ref=&feed=1″ width = “1” height = “1” />

Melindungi Hard

Jadi kami memiliki kantor baru dengan sudut pandang baru (yaitu, jendela!) dengan beberapa pemikiran untuk berbagi. Ada sepertinya selalu menjadi diskusi acak terkait dengan serangan terhadap alat dan metode defensif. Hal ini sering menyebabkan kebenaran untuk klise, seperti “seorang penyerang hanya harus tepat sekali,” Itu benar-benar menakutkan Perlindungan (pun intended) karena telah menjadi jelas dalam beberapa tahun terakhir, penyerang harus string bersama beberapa kemenangan untuk mendapatkan kompromi umum … tapi saya ngelantur. Seorang hacker yang baik tahu apa yang dia selalu dapat menghemat waktu dan sumber daya. Hal ini karena penyerang memahami permainan saya jauh lebih baik daripada sebagian besar pembela. Pengguna dalam peran pembela tidak selalu tampaknya menyadari tujuannya, akhirnya larut. Anda tidak pernah bisa menjawab dengan kepastian yang mutlak bahwa sistem kekebalan tubuh Anda. Kebanyakan orang tidak akan pernah mencoba untuk membuat sebuah argumen, takut jatuh oleh dunia yang kejam gulungan alamat publik. Namun, waktu dan lagi kita melihat para pemimpin solusi penyebaran pertahanan seperti deteksi intrusi berbasis web browser. Benar-benar? Apakah Anda pikir Anda dapat mendeteksi dan menghentikan Turing mengeksploitasi ditulis dalam bahasa yang dikonsumsi oleh sebuah aplikasi yang melakukan perhitungan sewenang-wenang, seperti yang dijelaskan oleh sumber yang tidak dipercaya, perakitan mudah dan analisis sepasang paket jaringan? Selain itu, perangkat berasumsi bahwa cara mengamankan masing-masing browser akan menginterpretasikan potensi untuk digunakan. Sangat lucu.

Jadi masalahnya jelas, bek terjebak jumlah tak terbatas solusi untuk masalah, dan penyerang mereka menikmati kemewahan hanya segelintir solusi. Oleh karena itu, solusi untuk pembela untuk meningkatkan jumlah masalah penyerang harus memecahkan mengurangi sendiri

“Tapi Anda hanya mengatakan masalah saya tidak terbatas!” -. Ya, saya lakukan, tapi di dunia nyata, kita dapat mulai mengatasi umum ini langkah-langkah akal seperti tes pen teratur pelaksanaan mekanisme otentikasi yang tepat dan, di atas semua, mengurangi serangan permukaan. Mengapa melindungi lebih dari yang Anda butuhkan? Jadi sekarang kita memiliki 80% dari perjalanan ke sana, tapi sayangnya di bagian akhir dari 20% yang Anda dapat benar-benar diselesaikan dengan dari rak dan di mana sebagian besar rasa sakit Anda berasal.

seperti yang kita mulai meningkatnya masalah penyerang? Tentu, Anda bisa mendapatkan up to date dan bahwa firewall dan perangkat jaringan di pusat data, yang tampaknya memecahkan masalah terputus-putus … atau Anda dapat mulai berpikir secara berbeda dan kemudian keraguan dari penyerangnya di saat ia mencoba untuk menggunakan aplikasi Anda. Sebagian besar masalah yang bisa bermain pada penyerang adalah unsur ketidakpastian di dasar Anda. Sebuah contoh yang baik dari ini adalah perlindungan yang diberikan oleh ASLR (Address Space Layout acak). Hal ini akan memaksa penyerang untuk memecahkan masalah tambahan, pada dasarnya, “di mana account saya” dan “apa kode Anda.” Kita harus berpikir tidak hanya itu, jika kita ingin meningkatkan dan mengurangi biaya menyerang kita sendiri. Tanyakan pada diri sendiri, di mana dan bagaimana Anda dapat memberikan ketidakpastian lintasan penyerang kemungkinan untuk mengambil. Sebagian besar perusahaan yang terpaksa mengungsi jaringan homogen, itu hanya biaya melakukan bisnis, dan ini tidak akan berubah dalam waktu dekat. Bahkan jika Anda bisa pergi untuk aplikasi ini, mereka dapat sidik jari dan menyerang secara individual. Tapi Teresa masih ruang untuk memperkenalkan ketidakpastian dalam skenario ini. Ada komponen tingkat yang lebih rendah dapat diubah, yang merupakan sidik jari yang paling sulit dari jarak jauh. Selama bertahun-tahun, saya telah merekomendasikan untuk menjalankan aplikasi dengan serangan permukaan yang tinggi (server web, klien pesan instan, browser, dll …) dengan memori pengalokasi yang berbeda, daripada sistem standar untuk distributor. Ini memperkenalkan unsur ketidakpastian, serta ASLR dan melanggar sejumlah asumsi, paling dipaksa untuk mengeksploitasi penulis. Ini tidak sempurna, tetapi jauh lebih sulit sidik jari striker apalagi memprediksi. Saya tidak sendirian dalam tidak diketahui ini. Meminta kerentanan terbaik / mengeksploitasi peneliti Anda tahu dia / dia mungkin melakukan hal yang sama dengan rasa takut yang sehat prediktabilitas. Ini tidak hanya nasihat kepada pengguna akhir, itu adalah nasihat yang sama saya berikan kepada pengembang. Belajar bagaimana menulis eksploitasi untuk kerentanan penyerang dalam aplikasi, dan kemudian mengurangi prediktabilitas yang mereka harapkan.

Semua masalah yang penyerang memutuskan untuk memberinya pemahaman yang lebih besar tentang bagaimana untuk memecahkan berikut. Ini adalah berita lama bagi Anda jika Anda pernah mengatakan bahwa permainan ini di PenTest, yang dimulai dengan tidak lebih dari liburan yang baik. Sebagai pengacara, kita tidak harus menjaga keseimbangan dengan ketidakpastian dewan atas nama kami. Untuk setiap tugas tambahan disajikan dalam menyerang harga kami turun, dan itu naik. Sekarang menggulung skala dalam mendukung Anda, karena kami memiliki solusi minyak ular. Jadi sebelum Anda membuat CISO presentasi kuartalan Anda, termasuk data yang diekspor dari perangkat jaringan, pertama mencoba untuk menjawab pertanyaan: “Apa masalah yang kita telah diidentifikasi dalam hitter kami akhir-akhir ini”


border =

Keamanan dan penyimpanan di dunia nyata

Hanya membaca halaman blog di Dibangun di Akademi, saya ingin menjawab. John selalu menempatkan konten yang besar di C / C ++ keanehan bahasa dan sering konten keamanan tidak berhubungan dengan keselamatan orang dalam beberapa cara. Mail yang tercantum di atas, pendek dengan beberapa link ke beberapa proyek penelitian yang menyelidiki mendapatkan penyimpanan memori bahasa keamanan inheren berbahaya, seperti C / C ++. Daripada meninggalkan komentar di blog saya, seperti orang normal, saya menulis blog ini sebagai respon membingungkan.

Saya melihat dua pendekatan yang masuk akal untuk mengurangi risiko kerentanan keamanan diperkenalkan oleh memori dalam waktu dekat. Perhatikan Aku tidak mengatakan “berhenti kerentanan keamanan memori.” Untuk menghentikan mereka sama sekali, kemungkinan memerlukan sejumlah besar beban yang tidak dapat diterima atau untuk secara radikal mengubah atau memperluas bahasa didasarkan. Tapi kita bisa mengurangi risiko keamanan nyata teknik bug memori yang sudah ada dan digunakan dalam praktek.

Yang pertama sudah ada, dan kau tahu itu sebagai ASLR, DEP, SEHOP, kenari stack dan berbagai jenis lain dari pengacakan dan ketegangan ditambahkan ke pelaksanaan program (lihat PAX atau MSDN dokumentasi untuk informasi lebih lanjut tentang beberapa mereka). Sebagian besar perlindungan ini ditambahkan ke proses kompilasi atau tertanam dalam sistem operasi Anda. Mereka dirancang untuk menjadi sesederhana mungkin dan masalah kompatibilitas hadir dengan sedikit atau tidak ada. Ini berarti bahwa tidak ada konfigurasi tambahan atau pengaturan bagi pengguna, mereka nyaris tak terlihat menunjukkan bahwa lingkungan kerja keamanan yang nyata. Bahkan ada solusi untuk aplikasi warisan dibangun dengan compiler warisan. Meskipun kekurangan, alat Microsoft EMET sangat bagus untuk apa ini sarana modern untuk melindungi aplikasi yang lebih tua bahwa Anda tidak dapat melakukan bisnis tanpa itu. Perlindungan ini menambahkan overhead yang sangat kecil dan melakukan pekerjaan dengan baik di semua aplikasi, besar dan kecil. Tapi seperti kompleksitas program untuk meningkatkan efektivitasnya menurun. Contoh terbaik adalah web browser dengan starter yang kaya seperti JavaScript. Mungkin penyerang mengalahkan mereka mengeksploitasi kerentanan? Ya. Mereka masih layak disimpan di sekitar, meskipun demikian, dan kerugian kinerja kecil? Benar-benar. Jadi di sini adalah pendekatan pertama untuk mengurangi risiko kerentanan keamanan di memori. Dia sudah di tempat dan efektivitas mereka.

Pendekatan kedua, yang saya tidak setuju dengan John dan penelitian lebih akademis. Saya tidak melihat tindakan perlindungan umum yang menangkap segala sesuatu sebagai kesempatan, atau di mana kita harus memfokuskan upaya kami pada penelitian. Hal ini terutama untuk alasan yang sama bahwa pelonggaran jatuhnya up dalam menghadapi lingkungan runtime yang kompleks. Sebaliknya, saya melihat sebuah program khusus untuk menggunakan keadaan mitigasi solusi yang cukup baik untuk menghentikan serangan dunia nyata yang mempengaruhi kita hari ini. Ini adalah tren yang tidak sama sekali baru, tetapi tidak cukup mencapai mainstream belum, dan saya pikir saya tahu mengapa. Sebelum pergi lebih jauh, kita perlu membahas cerita sedikit. Sepuluh tahun yang lalu itu mungkin untuk menulis mengeksploitasi dengan metode umum seperti merusak metadata tumpukan disimpan alamat pengirim pada catatan. Teknik ini terutama portabel untuk kerentanan dalam aplikasi lain dari semua ukuran dan kompleksitas. Namun seiring waktu, sistem operasi dan pengembang perpustakaan menjadi bijaksana untuk ini dan disampaikan kode untuk membuat teknik ini tidak bisa universal. Hal ini dilakukan dengan berbagai metode, seperti memeriksa daftar ganda terkait dari pointer, XORing pointer fungsi virtual meja sensitif dengan nilai-nilai sihir, dan sebagainya. Mereka sebenarnya obat umum yang saya bahas di atas. Mereka bekerja di semua program dengan overhead minimal dan membunuh banyak teknik Generic Exploit dalam satu tembakan. Dari tahun 2000-an pertengahan akhir, pengembang telah mengandalkan pada eksploitasi aplikasi data tertentu untuk mencapai apa yang dulu mungkin melalui pointer menulis ulang. Mengeksploitasi pengembang untuk melakukan hal ini dengan mempelajari spesifik Program struktur data yang dapat dengan aman diganti atau kebocoran adalah untuk mengalahkan semua hambatan umum ini. Fakta ini tampaknya akan hilang di akademisi, setidaknya, sebagian besar studi saya telah menemukan. Tentu saja, langkah evolusi berikutnya dalam perlindungan kami harus aplikasi tertentu. Langkah pertama untuk mengurangi desain untuk menggunakannya, yang merupakan program khusus adalah studi tentang kerentanan individu yang mempengaruhi mereka. Pengembang sudah melakukan hal ini, tetapi biasanya hasil hanya dalam patch yang memperbaiki masalah ini. Langkah selanjutnya adalah menentukan bila ada model yang mendasari atau kelas dari kesalahan untuk kerentanan ini dan akhirnya memahami persis bagaimana menggunakan penulis menggunakan standar ini.

Sebuah contoh yang bagus dari program khusus untuk mengeksplorasi mitigasi adalah keracunan Firefox. Pengembang Mozilla telah melihat kecenderungan umum untuk menggunakan Firefox dan memperkenalkan mitigasi, untuk membuatnya lebih kuat. Ini adalah langkah ke arah yang benar. Jika semua orang menyalahgunakan mengeksplorasi struktur data tertentu dalam aplikasi, mungkin masuk akal untuk membatasi akses ke struktur ini dan mengurangi kemampuan untuk mencari penyerang atau andal merusak. Pelaksanaan mitigasi dapat sepele, dan memaksa penyerang untuk menemukan pendekatan baru. Setelah menaikkan bar cukup tinggi, kita harus beralih ke target lain. Kadang-kadang desain komponen perangkat lunak yang asli adalah konsekuensi yang tidak diinginkan dari kekecewaan mengeksploitasi pengembang, seperti halnya dengan RenderArena di WebKit (membaca seluruh thread). Intinya adalah untuk belajar bagaimana menggunakan dan memanipulasi para penulis inner eksklusif untuk aplikasi Anda, dan kemudian membuat hidup Anda lebih sulit.

Jadi mengapa tidak tertangkap dalam perangkat lunak utama belum? Nah, para pengembang hampir tidak pernah belajar bakat, ditujukan untuk aplikasi yang mendukung. Ini banyak waktu dan kerja keras untuk orang-orang yang tidak terkait dengan keamanan yang tidak menyadari hal tersebut. Akademisi cenderung melihat masalah keamanan memori sebagai salah satu yang membutuhkan solusi yang komprehensif. Tapi saya pikir program ini adalah mitigasi spesifik harus menjadi langkah penting dalam setiap program SDL sebagai perluasan dari studi dan koreksi kerentanan individu. Jangan memperhatikan detail sistem seperti penyerang mengorbankan menggunakan kode merupakan limbah informasi berharga. Kemungkinan, Anda dapat membuat mitigasi, yang membuat operasi kelas kesalahan dalam program yang sangat sulit ini. Ini adalah biaya awal saya, tetapi dapat membantu mengurangi keparahan kerentanan masa depan.

sandbox langkah lain dalam evolusi ini, tetapi pada dasarnya berbeda dalam pendekatan mereka untuk mengurangi risiko kerentanan keamanan di memori. Serta program mitigasi tertentu, kita memiliki biaya awal untuk mengembangkan dan sulit untuk bepergian pengembang tidak berhubungan dengan keamanan, untuk mendapatkan hak pertama kalinya.

Tentu saja, perawatan ini gejala dari masalah yang sebenarnya, yang merupakan kerentanan berbahaya dalam bahasa memori. Pendekatan pengajaran sering memperkenalkan ekstensi bahasa atau mekanisme penegakan hukum, yang sedang mencoba untuk menyelesaikan semua masalah dengan harga biaya overhead yang tinggi. Pendekatan umum mempengaruhi kinerja terlalu banyak, atau tidak menerima aplikasi yang kompleks yang ada dalam rekening. Tes dunia nyata untuk ini adalah, sebagai suatu peraturan, “dapat membuat Chrome atau Firefox?”. Jika jawabannya tidak, maka tidak cukup siap. Pendekatan terbaik untuk mengurangi risiko kesalahan ini hadir untuk berhenti berjuang untuk program penuh dalam ruang memori dari bahasa berbahaya. Masalah ini hampir tidak mungkin untuk memecahkan dalam dunia tenggat waktu, anggaran dan 30 tahun dari keputusan desain bahasa rusak. Sebaliknya, penelitian kami harus fokus pada bagaimana kita bisa menghentikan serangan yang mempengaruhi kita hari ini.


Blackhat LeafSR belajar

hacker konferensi di Las Vegas cepat. Tahun ini, Anda dapat mengunjungi pelatihan dua hari “analisis kode sumber Lanjutan C / C ++” dan belajar bagaimana menemukan kerentanan dalam program besar dan kompleks seperti web browser. Klik link untuk penjelasan yang lebih rinci dan umpan balik dari alumni.

Tidak seperti banyak sumber Audit program lain ada penawaran kami lebih pemahaman mendalam dari kelas kesalahan yang kompleks, seperti jenis kebingungan dan metode terbukti untuk tinggal Anda, siswa juga belajar untuk mengevaluasi kerentanan kerentanan tertentu sebagai Tidak semua stack overflow sangat penting, dan bukan pointer NULL dereference semua tidak berguna. Mari kita lihat kerentanan di Firefox, WebKit, Native Client dan akhir server / RPC IPC ditulis hanya untuk ini, tentu saja.

Operasi diandalkan dalam platform modern membutuhkan tingkat tertentu akurasi. Presisi ini berasal dari memahami mekanisme kompleks komponen software yang kompleks, seperti manajemen memori, analisa, mesin JIT dan kolektor sampah. Jika Anda tertarik pada saham, kemudian belajar bagaimana pengumpul sampah bekerja dengan benda-benda V8 JavaScript seperti WebKit dan terpercaya penyebab operasinya setelah merilis penggunaan kerentanan dalam WebKit.

Kami yakin bahwa Anda akan meninggalkan Vegas dengan perspektif baru tentang sumber cek dan keterampilan baru yang akan membantu Anda menemukan kerentanan bersenjata tidak lebih dari editor teks. Yang Anda butuhkan untuk membawa laptop ke kelas adalah IDE Anda dan keinginan untuk membaca banyak kode favorit.

Harga di tukar naik setelah tanggal 31 Mei, dan dua kelas (Juli 27/28 dan 29/30 Juli) mengisi dengan cepat. Anda dapat menemukan deskripsi kursus kami dan informasi lebih lanjut di sini di situs Blackhat. Kami berharap dapat melihat Anda di Las Vegas!


Bandingkan asm.js dan NaCl

OK, jadi saya memiliki beberapa bulan kemudian untuk asm.js / Native Client (NaCl) debat. Ini normal, karena sebagian besar dari apa yang telah dikatakan sejauh ini, yang membandingkan buruk. Jika Anda tidak akrab dengan teknologi, jadi saya melihatnya dan ini adalah pertama atau posting tidak masuk akal. Dua teknologi bersaing memiliki tujuan yang sama: untuk membawa kode asli di Internet. Tapi kedua solusi mengatasi masalah ini dalam beberapa cara.

Apa yang salah dengan internet dalam bentuk yang sekarang?

Sejak pertengahan 2000-an atau lebih, telah menjadi upaya besar untuk membawa semua aplikasi warisan ini dan mendorong mereka ke HTML- Formulir tag dengan CSS polos. Sebuah ide bagus dalam teori, tapi itu tidak benar-benar bekerja untuk semua orang jutaan aplikasi garis yang ada dari C / C ++. Lalu Theres aplikasi seperti game dan suite kantor / kinerja, yang membutuhkan tingkat yang lebih tinggi dari interaktivitas dan kinerja tentu saja. Kami tidak mengatakan Anda tidak dapat melakukan hal-hal menakjubkan dengan JavaScript. Kami hanya berusaha untuk mengatakan bahwa berat hampir selalu datang ke kode asli dan Theresa baterai yang ada C / C ++, duduk-duduk. Sayangnya, tersedia scripting lingkungan hanya di browser Anda JavaScript. Meskipun mesin JIT menjadi sangat cepat dalam beberapa tahun terakhir, yang dijalankan dari C ++ JavaScript daya properti, seperti pemrograman dengan satu tangan terikat di belakang punggungnya. JavaScript tidak memiliki cukup mengetik perlu Anda lakukan operasi-bit tingkat rendah. Banyak alasan, <> charCodeAt tidak mulai memotong. Mungkin yang paling menyenangkan solusi untuk masalah ini adalah Java-script untuk menambah berat badan. Yang tidak hanya memungkinkan Anda untuk memuat kernel Linux di browser Anda, tetapi juga memberikan yang jelas banyak muatan Feng Shui yang jalur reguler sangat jelek. Sayangnya, setelah Anda telah mengetik array sejauh ini, karena pada akhirnya Anda masih menulis JavaScript, dan bukan sembarang kesenangan. Harus ada cara yang lebih baik untuk melakukan hal ini …

Apa asm.js?

Ini adalah mesin virtual yang memungkinkan Anda untuk mengkompilasi / C ++ program dalam C untuk JavaScript dan menjalankannya di browser. Proses ini dilakukan dengan menggunakan llvm untuk memasukkan C / C ++ kode dalam kode bit llvm yang kemudian ditransmisikan ke Mozilla Emscripten, yang ternyata dalam JavaScript. Jika browser berikut spesifikasi asm.js (bagian ketat JavaScript), Anda bisa mendapatkan keuntungan dari beberapa kompilasi AOT yang akan mengoptimalkan kode mesin yang dihasilkan. Kompilasi satu bahasa ke bahasa lain tidak baru, telah dilakukan berkali-kali sebelumnya. Karena banyak bahasa yang berbeda dapat dikompilasi ke LLVM kode masa menggigit banyak potensi kasus penggunaan untuk asm.js.

Setiap aplikasi asm.js kehidupan di mesin virtual sendiri, tata letak memori virtual seluruh terkandung dalam JavaScript diketik array. Asm.js spesifikasi teknis subset dari JavaScript, yang berarti non-JavaScript, sehingga Anda harus secara eksplisit mendukung Anda untuk mendapatkan manfaat (Lihat di atas.) Asm.js telah sintaks dapat membaca / menulis sebagai manusia, dia Hal ini tidak kode byte, dan sangat dekat dengan JavaScript. Keuntungannya adalah bahwa interpreter cepat asm.js JavaScript sudah ada. Ini hanya bekerja “hari ini, tapi akan mendapatkan keuntungan dari kompilasi AOT, karena penerjemah JavaScript Anda mendukung sintaks analisis asm.js tertentu … bahwa hanya Firefox mendukung malam sekarang …

A hal utama adalah subset dari JavaScript lakukan untuk Anda menghilangkan kebutuhan untuk penggunaan JavaScript JIT untuk menghasilkan kode yang bekerja dengan data yang bisa mengubah jenis setiap saat. Jika browser Anda JavaScript JIT compiler-pandangannya di sepotong kode, JavaScript, karena …

 Fungsi (Var Var akan C) {
inverse B + C;
}

('Watts', 'OK');
(1,2);

… JIT-jenis tidak tahu adalah dan a variabel. Cara untuk mengatasi ini adalah untuk menghasilkan kode untuk fungsi E , yang dapat bekerja dengan string, angka dan jenis lain yang didukung oleh mesin, yang dapat menggunakan + operator. Pada bagian belakang browser harus menyimpan variabel-variabel ini seperti yang ditunjukkan oleh struktur data yang menunjukkan jenis. Saya berbicara secara umum di sini, rincian pelaksanaan berbagai JIT juga akan berubah. Tapi Anda mungkin bisa melihat bagaimana memperlambat segalanya, tapi merupakan persyaratan dalam membentuk kode Anda sendiri untuk secara dinamis mengetik bahasa seperti JavaScript. Dalam asm.js beberapa pembatasan ini akan dihapus, karena itu ada hubungannya dengan kode C / C ++ yang tidak mendukung jenis dinamis sebagai JavaScript, tidak. Jika Anda menyatakan int nya int . Tentu saja, jika Anda tidak merilisnya sebagai sesuatu yang lain, tetapi kasus ini biasanya jelas, dan compiler tahu tentang mereka di muka. Jika Anda tertarik secara detail mesin dan JIT, karena mereka harus berurusan dengan hal semacam ini, saya sarankan blog ini.

Anda mungkin menduga bahwa program seperti permainan yang kompleks dan memiliki komponen visual, yang biasanya dilakukan pada GPU. Untuk melakukan hal ini, kita harus WebGL. Tapi kemudian Theres, akses ke jaringan file audio dan tema. Tampaknya untuk memecahkan masalah ini akan membutuhkan beberapa berat dan sangat kaya API …

Apa Native Client (NaCl),?

Kami berbicara tentang banyak NaCl dalam blog ini, tapi itu karena pendekatan baru untuk masalah yang sangat sulit, yaitu kinerja kode asli dalam memori aman x86 suka. Ini adalah reinterpretasi lain deteksi kode berbahaya, pendekatan unik mereka ke sandbox semua kode pada saat yang sama memberikan Anda akses ke prosesor baku. NaCl Nha mengkonversi kode yang ada, menerima langsung instruksi x86 / x86_64 / ARM dari Internet, memeriksa mereka dan mengeksekusi mereka. Ini adalah perbedaan mendasar antara asm.js NaCl. Pertama gelombang C / C ++ dan mengubahnya menjadi JavaScript, yang ditempatkan melalui mesin JIT, yang terakhir melaksanakan instruksi sendiri pada bagaimana Anda sekarang mereka dalam browser.

Tentu saja ada beberapa kompromi, seperti proses perakitan sedikit rumit, tapi Google telah pergi keluar dari cara untuk meringankan rasa sakit. Portabel Native Client (PNaCl) mengambil langkah lebih lanjut dan memungkinkan pengembang untuk memuat sedikit kode untuk aplikasi Anda, yang disusun pada musim panas PNaCl untuk arsitektur tertentu. Dalam hal ini, tampaknya, PNaCl pola asm.js sedikit lebih dekat di permukaan, tetapi dengan arsitektur yang sama sekali berbeda. Kode PNaCl memproduksi ada di kotak pasir, dan harus mematuhi aturan ketat yang diberlakukan NaCl.

NaCl juga menawarkan API yang luas dan kaya melalui PPAPI untuk melakukan grafis berat, audio dan kabel. Kami tidak akan menutupi arsitektur NaCl sangat mendalam di sini untuk melihat posting blog lama kita untuk ini. Sebaliknya, kita akan pindah ke keamanan kami dari NaCl dan asm.js

Apa yang manfaat / keuntungan dan kerugian keamanan memasuki

Setiap baris baru kode? menambahkan serangan, dua komponen ini tidak berbeda. Jadi asm.js bagian ketat kode JavaScript analyzer adalah tampilan baru. Karakteristik kinerja asm.js masih harus dilihat bagaimana hal ini hanya di Firefox malam sekarang. Tebakan pertama saya adalah yang membuat distribusi JIT-halaman topi pada Firefox mustahil. Saya juga yakin bahwa Anda dapat menggunakannya untuk menurunkan, jika tidak menang, ASLR. Pada tahun 2011 serangan kami JIT Ivnitskiy Yang kertas dan saya membahas penggunaan JavaScript, untuk mempengaruhi output mesin JIT untuk memasukkan urutan tertentu kode ROP ke dalam memori eksekusi. Saya menduga bahwa kebanyakan pipa JIT digunakan untuk mengkonversi kode asm.js ke dalam kode mesin akan membuat proses lebih mudah, di beberapa titik, tapi saya tidak memiliki data untuk membuktikannya sekarang.

Pendekatan mengambil bahasa sebagai unmanaged C / C ++ dan mengubahnya menjadi perangkat penyimpanan dikendalikan dan aman memecahkan masalah korupsi di memori khusus ini bagian dari kode. Jadi bagaimana jika beberapa C ++ kode, awalnya terdapat buffer overflow ketika dikonversi dan bekerja di asm.js Anda mengakses jenis JavaScript, dipasok dari kontrol internal di runtime untuk menghindari masalah tersebut. Alih-alih menulis ulang beberapa data penting yang akan Anda melempar pengecualian, dan browser akan terus seolah-olah tidak ada yang terjadi. Sebagai titik sisi, mungkin menyenangkan untuk menulis Asan, asm.js sebagai alat, yang memeriksa rambut dan C C / ++ kode di browser menggunakan JavaScript runtime sebagai alat ukur.

NaCl menawarkan lebih dari sekedar mentransfer C / C ++ kode yang ada pada browser Anda. NaCl memiliki sandbox aplikasi unik, yang dapat digunakan di banyak tempat lain. NaCl statis memeriksa semua kode sebelum eksekusi. Pemeriksaan ini memastikan bahwa modul hanya dapat mengeksekusi kode yang menganut satu set ketat aturan. Persyaratan ini karena modul NaCl memiliki akses penuh ke prosesor dan dapat melakukan lebih dari program saat menggunakan JavaScript dapat antarmuka PPAPI di Chrome. Inspeksi dan kode ini persyaratan harus mengurangi kapasitas aliran, tetapi tidak cukup sehingga membuat aplikasi besar tidak dapat digunakan.

Aku masih berpikir kita akan melihat Android NaCl selama sehari, sebagai cara untuk bersaing dengan iOS kode penandatanganan. NaCl adalah DAS untuk plug-in, yang saya percaya akan mempengaruhi sandbox proyek pergi ke depan. Jika Anda mengembangkan sandbox untuk aplikasi Anda hari ini, Anda harus membaca dokumen desain Anda kemarin.

asm.js tidak menyediakan sandbox, atau lapisan tambahan keamanan tentang masalah ini. Ini hanya satu set alat, yang mengkompilasi bahasa sumber pada JavaScript subkelompok. Hal ini bergantung pada mesin penyimpanan yang aman virtual yang disediakan oleh penerjemah ini JavaScript mengandung kode. Kita semua tahu seberapa baik yang bekerja. Tentu saja, saya tidak menemukan kesalahan di sini tanpa browser Mozilla sandbox adalah sasaran empuk. Tapi di situlah perbedaan utama antara asm.js dan NaCl menjadi jelas. Asm.js tidak dimaksudkan untuk meningkatkan Firefox keamanan, dan membawa C / C ++ kode yang ada di sebagian besar platform berbasis web. NaCl akan melakukannya dengan baik, tetapi juga meningkatkan keamanan Chrome isi semua plug-in di dua kotak pasir. Saya pikir jika itu perlu untuk mengambil sebagai plug-in Adobe Flash Player dan port untuk asm.js keuntungan ini untuk menjamin keamanan pengguna Firefox, tetapi pada akhirnya mereka masih tanpa sandbox sekitar mesin JavaScript dan mungkin membayar hukuman kinerja untuk dia juga.

Temuan

asm.js masih dalam pengembangan berat, maka NaCl / PNaCl, tapi sedikit lebih dewasa sekarang diberikan gol kedua terakhirnya. Asm.js untuk menjalankan program yang ada di C / C ++ perpustakaan, dan ia harus menyediakan API yang luas, sehingga jauh lebih dari interpreter JavaScript yang ada memberikan. NaCl sudah saat ini menawarkan ini bersama dengan produktivitas yang lebih tinggi dan desain sandbox kuat. Jika Mozilla ingin mendapatkan serius tentang menjalankan semua kode yang tidak dipercaya dari internet ke juru JavaScript Anda, dia perlu sandbox nyata sesegera mungkin.

Akhirnya, ketika masa depan mengkompilasi ulang semua JavaScript untuk masa depan jelek.

Update 03/06/13: Tetap beberapa teks ambigu yang dimaksudkan asm.js hanya bekerja di Firefox. Lihat di atas untuk rincian


GCC racun

Microsoft telah mengambil peran lebih aktif dalam alat-alat keamanan pengembang sejak SDLC pada pertengahan 2000. Salah satu tahapan sebelumnya dari SDLC digunakan untuk mengurangi kerentanan kode diperkenalkan dengan nama banned.h file header . Apa adalah file header yang menggunakan Pragma MSVC untuk mengutuk fitur yang pengembang sering salah digunakan dan, karena itu, pelaksanaan eksekusi kode jauh kerentanan dalam aplikasi mereka. Fungsi-fungsi ini adalah tersangka: strcpy, sprintf, memcpy, CopyMemory, RtlCopyMemory, strcat, alloca dan banyak spesifik Win32 lainnya. Jalan kembali dalam versi aslinya adalah dukungan serupa banned.h untuk GCC, namun dilepas pada tahun 2008, saya tidak ingat persis mengapa atau kapan, tapi masuk akal bagi Microsoft untuk mendukung fungsi ini dengan cara apapun.

Bahkan saat ini, pada tahun 2013, sebagian besar perangkat lunak warisan yang sangat penting bagi banyak perusahaan masih berisi kode yang memanggil fungsi perpustakaan rentan. Meskipun perlindungan memori modern sebagai ASLR dan DEP kerentanan fungsi-fungsi ini untuk lebih memperkenalkan berguna di bawah kondisi yang tepat.

Sayangnya, sejauh ini, tampaknya tidak setara dengan proyek banned.h menggunakan GCC, jadi saya mulai proyek ke halaman lain di GitHub. Menggunakan GCC racun Pragma spesifik pengenal larangan kode Anda. Sejauh yang saya tahu, GCC tidak merekomendasikan penggunaan pragma (tapi, untuk menjadi adil, saya tidak merekomendasikan menggunakan GCC, untuk versi dentang). Ada beberapa keterbatasan pendekatan ini, bahkan jika pegangan adalah bagian dari makro ID diperluas telah diracuni, tidak akan menghasilkan kesalahan. Itu sebabnya Anda tidak ingin bermain kesalahan GCC dalam panggilan berbahaya dibuat dalam file header di luar kendali Anda. Berikut adalah contoh bagaimana direktif:

# include dan L; stdio.h & amp; amp; GT
# include dan L; string.h & amp; amp; Gt;

# Pragma GCC racun strcpy

main (int argc int, simbol * ARGV [ ]) {
simbol BUF [10];
strcpy (BUF, ARGV [1]);
return 0;
}

$ GCC – string.c urutan
string.c: Dalam fungsi ‘utama':
string.c: 8: 2: ERROR: upaya untuk menggunakan diracuni “strcpy”

ini sederhana namun dapat sangat berguna jika Anda memiliki banyak C kode warisan duduk di sekitar bahwa Anda ingin menghapus fungsi tersebut dan menjaga pengembang dari membuat dan menyusun kode baru yang berisi mereka. Untuk versi pertama dari GCC-racun, kami membuat daftar singkat dari fungsi C berbahaya dalam file header untuk menyertakan sumbernya, seperti yang Anda lakukan dengan banned.h. Saya menekankan “kecil” di sini selama beberapa alasan penting.

Microsoft dapat melarang banyak fungsi sederhana lainnya karena mereka Libc setara aman, tetapi tidak memiliki GNU Libc mereka untuk daftar kami adalah tidak komprehensif,. Sebuah contoh yang baik adalah fungsi memcpy. Ada kemungkinan bahwa sumber dari sejumlah besar serangan buffer overflow, tapi itu hanya tidak praktis untuk menghapusnya dari sebagian besar program. Memperbaiki masalah ini memerlukan fitur yang tidak meracuni Pragma memberikan ekstensi seperti compiler dan asuransi setara. Standar C11 baru mendefinisikan beberapa fitur keamanan ini menyimpan dalam “‘interface perbatasan, tetapi sejauh yang saya tahu, baik Glibc menemani memutuskan untuk tidak melaksanakannya, dan mereka melampaui perkembangan CVD.

Tujuan menggunakan poison.h kami (atau yang serupa) untuk membantu kode warisan aman. Hal ini jauh dari sempurna, tapi Anda harus dapat menggunakannya dalam proyek internal, menambahkan semua API kustom, itu usang 2004 tetapi tidak bisa berhenti dengan bantuan pengembang.


Blackhat Transmisi: C / C ++ AppSec Pada 2014

Saya akan memberikan Blackhat webcast bebas pada tanggal 30 Januari, 2014-2 EST. Topik yang saya akan membahas adalah “C / C ++ AppSec 2014″. Banyak orang percaya, AppSec hanya berlaku untuk aplikasi Web dan aplikasi mobile, tapi AppSec istilah umum yang berlaku untuk setiap aplikasi yang ditulis dalam bahasa apapun. Bahkan C dan C ++ adalah bahasa yang lama, mereka di mana-mana dan penting bagi perusahaan yang sama dan start-up. Selama siaran, saya akan membahas kejahatan kesalahan operasional dalam memori dan AppSec tampak seperti C / C ++ aplikasi modern. Anda dapat membaca deskripsi lengkap dari situs blackhat.

Pendidikan di Amerika Serikat Black Hat 2014

Sekali lagi, kami akan memberikan kursus kami “Advanced C / C ++ analisis kode sumber,” pada tahun acara Black Hat USA ini. Kami menawarkan kursus ini sering klien pribadi kita sepanjang tahun, daripada pengiriman konten terjadi tanpa perbaikan dalam materi. Kami terus berupaya untuk menjaga contoh, slide dan pembicaraan sampai saat ini. C / C ++ bahasa mungkin lebih, tapi kami ingin memastikan untuk menutupi bahan yang relevan, dan itu berarti menjaga up to date dan sesuai dengan fakta bahwa tema siswa kami ingin belajar tentang. Kami memperbarui nilai tukar untuk Black Hat kerentanan acara tahun ini dalam versi terbaru dari Nginx, WebKit / Blink C ++ 11 atau lebih.

Ini adalah kelas yang aman dari coding, dan kami tidak menutupi strcpy. Jika Anda ingin memahami siklus manajemen hidup menurut obyek dengan aturan lima tahun, atau untuk melacak dan menganalisis penggunaan kompleks setelah rilis kerentanan yang dihasilkan dari referensi menghitung kerugian mekanisme yang disediakan oleh operator penugasan kelebihan beban, Anda ingin mendaftar di kursus. Kami berjanji Anda akan mendapatkan perspektif yang berbeda tentang audit source code dan sedikit lebih percaya diri, Anda dapat memeriksa WebKit SVN terbaru dan mulai mencari-0 hari. Sampai jumpa di Vegas!


Hatiku baik-baik saja, tapi mata saya berdarah

TL; DR: heartbleed buruk, tapi itu bukan akhir dari dunia. OpenSSL tidak rentan karena freelists mereka dan akan terus menjadi rentan tanpa mereka.

Kami merasa bahwa masih tidak cukup komentar heartbleed, sehingga menulis lagi. Tidak seperti banyak tempat-tempat lain, kita tidak akan berbicara tentang TLS, atau mengapa kami percaya bahwa ekspansi jantung adalah orang bodoh. Sebaliknya, kami berniat untuk fokus pada dirinya sendiri dan, lebih khusus, kesalahan untuk itu data sensitif yang bocor.

Pertama, saya katakan bahwa sejauh kesulitan berjalan, kerentanan heartbleed tidak ada yang istimewa, tapi itu tidak berarti itu mudah untuk menemukan. Semua kesalahan yang mudah dikenali ketika seseorang menunjukkan mereka kepada Anda. 20/20 belakang di akhir. Rick dan Anti ibu di Codenomicon dan Neil Mehta di Google saja ditemukan kesalahan. Neil cukup untuk memeriksa posisi sehat ini sebelum ia pergi di udara (terima kasih kepada Neel!) Apapun perasaan Anda tentang pengungkapan kerentanan, Anda harus berterima kasih kepada mereka untuk menemukan kesalahan dan memberi kita semua sesuatu yang menarik untuk dibicarakan.

Semua kode dalam posisi ini dengan OpenSSL-1.0.1c, aku bekerja di mesin virtual tua dengan Apache. Pertama, mari kita membahas beberapa struktur data OpenSSL yang paling penting. Untuk diskusi ini, tingkat “atas” dari struktur SSL , yang didefinisikan di ssl.h , dan ssl_st ke typedef . Dalam struktur ini adalah pointer ke S3 Ketik SSL3_STATE , yang merupakan typedef ssl3_state_st . Dalam struktur ini adalah struktur lain, seperti SSL3_RECORD , yang kita sebut sebagai RREC . The SSL3_RECORD mengandung Jenis dan panjang nilai-nilai di antara daerah lain. The SSL3_STATE struktur juga berisi RBUF , dan WBUF Ketik SSL3_BUFFER . The SSL3_BUFFER struktur berisi pointer ke data buf , dan County / diimbangi / meninggalkan Peserta melacak penggunaannya. Buffer ini dialokasikan dan sering dilepaskan selama pertukaran TLS. Untuk meningkatkan kinerja, para pengembang menulis implementasi daftar bebas OpenSSL terpisah untuk penyimpanan. Ini adalah di atas meja daftar, rupanya para dewa, tetapi sangat mudah untuk memahami (lebih di bawah ini). Memori bebas sebenarnya adalah dua daftar, satu untuk buffer read ( RBUF ) dan satu untuk menulis buffer ( WBUF ). Daftar ini tersedia melalui SSL_CTX struktur yang berisi wbuf_freelist dan rbuf_freelist , masing-masing. Kami mengacu pada SSL_CTX struktur melalui pointer ke SSL struktur. Jerez beberapa pseudo-kode untuk membuatnya kurang membingungkan. Beberapa variabel dipotong untuk singkatnya

 {SSL SSL_CTX * CTX struktur. SSL3_STATE * S3; {} Struktur SSL_CTX SSL3_BUF_FREELIST wbuf_freelist; Rbuf_freelist SSL3_BUF_FREELIST; {} Struktur SSL3_STATE SSL3_BUFFER RBUF; / * Baca IO goes here * / SSL3_BUFFER WBUF; / * Rekam IO goes here * / SSL3_RECORD RREC; / * Setiap diterjemahkan record goes here * / SSL3_RECORD WREC; / * Periksa dari sini * /} {struktur SSL3_BUF_FREELIST size_t chunklen; len int unsigned; SSL3_BUF_FREELIST_ENTRY * kepala; Struktur SSL3_BUFFER} {unsigned char * buf; / * Setidaknya SSL3_RT_MAX_PACKET_SIZE byte * lihat ssl3_setup_buffers () * / size_t len; / * Ukuran penyangga * / INT Bias; / * Ketika 'copy' * / INT Kiri; / * Jumlah byte yang tersisa * /} struktur SSL3_RECORD {/ * g * Jenis / INT; / * Rekam Jenis * / / * * RW / panjang int unsigned; / * Jumlah byte yang tersedia * / / * g * / unsigned int Off; / * Offset baca / tulis "BUF" * / / * * RW / unsigned char * data; / * Pointer ke data record * / / * * RW / unsigned char * I / *, di mana byte decoding adalah * / / * g * / unsigned char * PC / * Gunakan hanya dengan dekompresi -. Thanos () ed * /} 

Jadi sekarang kita memahami beberapa struktur dasar memungkinkan kita untuk menyelidiki Heartbleed're kerentanan dilarang untuk membaca dalam pelaksanaan OpenSSL TLS detak jantung. The fungsi tls1_process_heartbeat bertanggung jawab untuk menganalisis pesan detak jantung TLS. Di 2586 pointer garis ditugaskan beban x adalah pointer ke struktur jenis SSL . Struktur ini berisi sebuah pointer ke S3 SSL3_STATE . Struktur yang ditunjukkan oleh S3 adalah array dari SSL3_RECORD jenis yang kami sebut sebagai RREC . Indeks P sekarang menunjuk ke record pertama. Dalam Garis 2593 nilai panjang diekstrak dari catatan dan ditugaskan untuk payload [1]. Di 2610 garis memori ditugaskan untuk pesan balasan. Panggil OPENSSL_Malloc mengalokasikan cukup memori (19+ payload) byte, nilai kembali ditugaskan untuk indeks clipboard . On line di 2616 disebut memcpy disalin ke pl (menunjukkan catatan jenis dan panjang bidang) di bps (buffer kita hanya dibebankan ke baris di 2610) adalah persis jumlah byte yang dapat digunakan

 2584 tls1_process_heartbeat SSL (* S) 2585 2586 {unsigned char * P = & amp; amp; Amp;. & Amp; Amp; Gt S; s3- & amp; amp; Gt; rrec.data [0] * PL; 2587 hbtype singkat unsigned; 2588 simbol payload INT; 2589 int mengisi unsigned = 16; / * Gunakan minimal padding * / 2590 2591 / * Baca jenis dan panjang payload pertama * / 2592 * p ++ = hbtype 2593 n2s (P, payload); PL = p 2594; 2595 2596 jika (S dan GT; msg_callback) 2597 S dan GT; msg_callback (0, S & amp; amp; gt; versi, TLS1_RT_HEARTBEAT, 2598 dan amp; S dan GT; s3- & amp; amp; gt; rrec.data [0], S & amp; amp; gt; S3 - & amp; amp ; gt; rrec.length, 2599 tahun, dan S gt; msg_callback_arg); 2600 2601 jika (== TLS1_HB_REQUEST hbtype) 2602 2603 {unsigned char * buffer * BP; 2604 INT R; 2605 2606 / * Mengalokasikan memori untuk jawaban, ukuran 1 byte 2607 * Tipe 2 byte lagi panjang pesan kargo, dan 2608 * beban lebih padding 2609 * / 2610 penyangga = OPENSSL_malloc (1 + 2 + beban + fill); 2611 bp = Buffer; 2612 2613 / * Masukkan jenis respon, panjang, copy beban * / 2614 * Uap ++ = TLS1_HB_RESPONSE; 2615 S2n (payload, BP); 2616 memcpy (BP, persegi, payload); 2617 BP + = beban; 2618 / * random bantalan * / 2619 RAND_pseudo_bytes (BP, upholstery); 2620 2621 R = ssl3_write_bytes (dengan TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding); 

Dengan demikian, kesalahan adalah bahwa ukuran record pl belum untuk poin yang sesuai dengan nilai muatan. Mengirim pesan detak jantung TLS dengan nilai lebih besar dari ukuran sebenarnya dari rekaman akan menyebabkan memcpy membacakan rekaman dan kembali ke yang disimpan dalam memori setelah perekaman kepada pengguna. Kesalahan ini sederhana dan telah didokumentasikan dengan baik di tempat lain. Tapi mari kita mengambil langkah mundur dan fokus pada OPENSSL_malloc Panggilan. OPENSSL_malloc adalah makro yang memanggil CRYPTO_malloc mem.c . CRYPTO_malloc Panggil malloc_ex_func , yang merupakan pointer ke fungsi yang dapat diatur dalam pelaksanaan OpenSSL memanggil alokasi memori lain:

 static void * ( * malloc_func) (size_t) = Thanos; static void * default_malloc_ex (size_t Dalam pembangunan file *, int line) {return malloc_func (Nm); } Static void * (* malloc_ex_func) (size_t, char * konstruksi berkas, INT line) = default_malloc_ex; 

Jika Anda melihat prototipe fungsional di atas, kita dapat melihat bahwa default_malloc_ex kembali malloc_func , yang merupakan pointer ke fungsi menunggu ... Anda ... Thanos . Ini mungkin datang sebagai kejutan bagi Anda, tetapi tampaknya ada beberapa kebingungan di internet yang terkena memori ketika memulai kesalahan ini. Lebih pada bahwa dalam beberapa paragraf.

Jadi kita tahu CRYPTO_malloc dapat dikurangi untuk panggilan ke Thanos , dan membuat default. Di sinilah data kami ditulis sebelum , tetapi tidak di mana kita membaca di . Untuk memahami mengapa data rahasia yang bocor, kita harus memahami bahwa freelists menyimpan catatan dari mana untuk mengambil data. Jika kita melihat SSL_CTX_new kita lihat kode berikut, yang menetapkan freelists pertama. Sebagian besar anggota diinisialisasi ke 0, dengan pengecualian wbuf_freelist dan rbuf_freelist , ditugaskan untuk nilai yang dikembalikan dengan memanggil OPENSSL_malloc .

 1677 SSL_CTX * SSL_CTX_new (SSL_METHOD konstruksi * met) 1678 ... 1827 {#ifndef OPENSSL_NO_BUF_FREELISTS 1828 RET & amp; amp; Gt; freelist_max_len = SSL_MAX_BUF_FREELIST_LEN_DEFAULT; 1829 RET & amp; amp; Gt; rbuf_freelist OPENSSL_malloc = (sizeof (SSL3_BUF_FREELIST)); 1830 ketika (RET & amp; amp; gt;! Rbuf_freelist) 1831 go ERR; Ribuan RET 832 & amp; amp; Gt; rbuf_freelist- & amp; amp; Gt; chunklen = 0; 1833 RET & amp; amp; Gt; rbuf_freelist- & amp; amp; Gt; Len = 0; 1834 RET & amp; amp; Gt; rbuf_freelist- & amp; amp; Gt; Kepala = NULL; 1835 RET & amp; amp; Gt; wbuf_freelist OPENSSL_malloc = (sizeof (SSL3_BUF_FREELIST)); Jika 1836 (RET & amp; amp; gt;! Wbuf_freelist) 1837 {1838 OPENSSL_free (RET & amp; amp; gt; rbuf_freelist); 839 Ribu pergi ERR; 1840} 1841 RET & amp; amp; Gt; wbuf_freelist- & amp; amp; Gt; chunklen = 0; 1842 RET & amp; amp; Gt; wbuf_freelist- & amp; amp; Gt; Len = 0; 1843 RET & amp; amp; Gt; wbuf_freelist- & amp; amp; Gt; Kepala = NULL; 

ini menyoroti entri pertama di rbuf_freelist dan wbuf_freelist , memanggil OPENSSL_malloc , kita tahu, panggilan ke Thanos . Jadi kita tahu bahwa memori punggung mereka daftar awalnya terisolasi dari Thanos , bahwa ia hidup di sisi lain dari buah biasa dipilih oleh kode yang disebut Thanos langsung . Potongan-potongan ditambahkan ke blok bebas menggunakan freelist_insert dan diekstrak dari blok bebas menggunakan freelist_extract . Jika freelist_extract fungsi pertama disebut List chunklen 0 (lihat di atas), yang berarti bahwa garis 688 tercapai, meninggalkan THT dan Hasil = NULL , yang berarti bahwa panggilan untuk OPENSSL_malloc on line 698 akan terjadi. Ini hanya mengembalikan sepotong tumpukan didorong Thanos . Jika kondisi ini terpenuhi, maka daftar gratis bit yang tersedia tersedia untuk digunakan, yang sesuai dengan ukuran yang diinginkan. Blok ini dilewatkan kembali ke pemanggil, dan ukuran daftar berkurang satu jika itu adalah bagian terakhir dalam daftar, chunklen reset ke 0.

 678 static void * 679 freelist_extract (SSL_CTX * CTX, for_read INT, INT SZ) 680 {681 SSL3_BUF_FREELIST * Daftar; 682 SSL3_BUF_FREELIST_ENTRY * EAC = NULL; 683 void * hasil = NULL; 684 685 CRYPTO_w_lock (CRYPTO_LOCK_SSL_CTX); 686 = Daftar for_read? ctx- & amp; amp; Gt; rbuf_freelist: ctx- & amp; amp; Gt; wbuf_freelist; 687 jika (list = NULL & amp; amp; amp;! & Amp; amp; amp; sz == (INT) daftar-& amp; amp; gt; chunklen) 688 THT = daftar-& amp; amp; Gt; kepala; 689 jika (THT = NULL!) {Daftar-690691 & amp; amp; Gt; Kepala ent- = & amp; amp; Gt; menutup; Hasilnya = 692 THT; 693 jika (--list- & amp; amp; gt; Len == 0) 694 daftar-& amp; amp; Gt; chunklen = 0; 695} 696 CRYPTO_w_unlock (CRYPTO_LOCK_SSL_CTX); 697 if (hasil!) 698 = menghasilkan OPENSSL_malloc (SZ); 699 mengembalikan hasilnya; 700} 

Jika pemanggil dilakukan dengan sepotong yang diekstrak dari daftar panggilan freelist_insert diproduksi. Fungsi ini memeriksa untuk melihat apakah ukuran yang diminta adalah sama dengan daftar chunklen , atau jika daftar chunklen 0 cek lain untuk melihat apakah daftar pakaian sudah freelist_max_len (32 secara default) dan lebih dari ukuran sizeof (SSL3_BUF_FREELIST_ENTRY) . Jika kondisi ini kemudian puas dengan daftar chunklen ditetapkan pada nilai yang diminta (yang mungkin telah 0 jika tidak digunakan sebelumnya), THT diatur untuk sepotong yang dimasukkan, Berikutnya pointer diatur ke kepala , kepala daftar didefinisikan sebagai THT , ukuran daftar meningkat, dan akhirnya, MEM pointer diatur ke NULL. Jika kondisi ini tidak terpenuhi, pertama MEM akan free'd memanggil OPENSSL_free on line 725.

 702 703 statis kekuatan freelist_insert (CTX SSL_CTX * INT for_read, SZ size_t, void * MEM) 704 {705 SSL3_BUF_FREELIST * Daftar; 706 SSL3_BUF_FREELIST_ENTRY * THT; 707 708 CRYPTO_w_lock (CRYPTO_LOCK_SSL_CTX); 709 = Daftar for_read? ctx- & amp; amp; Gt; rbuf_freelist: ctx- & amp; amp; Gt; wbuf_freelist; 710 jika (list = NULL & amp; amp; amp;! & Amp; amp; amp; 711 (SZ == daftar-& amp; amp; gt; chunklen || daftar-& amp; amp; gt; chunklen == 0) & amp; amp; amp; & amp; amp; amp; 712 daftar-& amp; amp; gt; Len & amp; amp; lt; ctx- & amp; amp; gt; freelist_max_len & amp; amp; amp; & amp; amp; amp; 713 SZ & amp ; amp; gt; = sizeof (* THT)) {714 715 daftar-& amp; amp; Gt; chunklen = SZ; 716 = THT MEM; 717 ent- & amp; amp; Gt; Berikutnya daftar-= & amp; amp; Gt; kepala; 718 daftar-& amp; amp; Gt; Kepala = THT; 719 ++ daftar-& amp; amp; Gt; Len; 720 MEM = NULL; 721} 722 723 CRYPTO_w_unlock (CRYPTO_LOCK_SSL_CTX); 724 jika (MEM) 725 OPENSSL_free (MEM); 726} 

memori bebas dapat membantu mempercepat kinerja koneksi OpenSSL, ukuran penyangga khusus telah meminta berulang kali. Memori bebas (membaca dan menulis), tidak peduli apa isi dari potongan-potongan yang pelanggan atau menelepon mereka. Buffer ini biasanya setup oleh ssl3_setup_buffers (yang merupakan ssl3_setup_read_buffer dan ssl3_setup_write_buffer ), dan akses ke s3- & amp; amp; Gt; RBUF , dan akhirnya lulus kembali melalui ssl3_release_read_buffer dan ssl3_release_write_buffer . Oke, jadi, sekarang kita mengerti, berbasis SSL bebas blok (s).

Jadi mengapa semua ini menarik ketika datang ke heartbleed? Nah, api Internet konsep kode untuk bug yang dapat ditelusuri data sensitif andal sesi dan kunci seharusnya rahasia. Untuk memahami bahwa ada kebocoran, kita hanya perlu melihat kami SSL dan GT; s3- & amp; amp; Gt; wbuf.buf dan SSL dan GT; s3- & amp; amp; Gt; rbuf.buf pointer. Tentu saja, hal itu dapat disimpan di blok bebas sepanjang sisi potongan lain dengan ukuran yang sama persis. Kita juga tahu bahwa ruang bebas memiliki ukuran maksimum, yang merupakan 32 secara default. Dengan demikian, cara sederhana untuk memulai catatan skrining dari daftar ini adalah dengan hanya menambah daftar beberapa koneksi atau membuat beberapa permintaan dari berbagai ukuran. Karya terbaru karena daftar berisi hanya potongan-potongan dengan ukuran tertentu.

Jadi, untuk menggunakan OpenSSL daftar bebas untuk catatan ini, mereka masih mengandalkan memori dikembalikan oleh Thanos , yang berarti bahwa mereka dapat hidup berdampingan memori disimpan dan digunakan oleh komponen lainnya seperti server Web yang menggunakan OpenSSL. Itu sebabnya kita melihat data rahasia ketika mereka menyebabkan kesalahan. Alasan lain mengapa kita bisa bocor data sensitif adalah bahwa OpenSSL mendekripsi catatan ini "di tempat." Ini berarti bahwa SSL-write buffer yang diterjemahkan dalam lokasi saat ini di memori.

Saat ini beberapa perdebatan tentang bagaimana untuk mengurangi itu melunak distributor tumpukan standar OpenSSL keamanan, memasukkan daftar bebas Anda sendiri. Pada dasarnya saya setuju dengan pandangan ini.

  • Sebagai permulaan, daftar memori bebas yang didukung oleh sistem Thanos (default). Mereka tidak menyadari kerentanan mereka sendiri Thanos () dari awal.
  • pelaksanaan daftar bebas dan sama proyek dapat ditemukan dalam aplikasi yang paling cukup kompleks Anda berjalan pada desktop Anda sekarang.
  • Kerentanan ini akan tetap terlibat dan akan terus bocor bagian sensitif dari memori dengan atau tanpa blok bebas.
  • Menariknya, jika Anda ingin kebocoran data dari memori tumpukan global yang tersedia adalah Anda harus mendapatkan sekitar pertama.

Poin di atas gravitasi yang diambil penting untuk memahami kerentanan operasional dan global [2].

Kesimpulannya, heartbleed buruk tapi panik lakukan. Kode OpenSSL dapat menjadi berantakan, tapi itu jauh kerentanan eksekusi kode agak dalam beberapa tahun terakhir bahwa tidak ada yang membayar banyak perhatian. Internet masih di sini, Anda masih bisa melihat dengan aman e-mail Anda, tidak ada yang peduli, dan banyak makan

Ditulis oleh: .ChrisRohlf

[1] Nama panjang "biaya" variabel adalah sosiopat batas

[2] dalam pelatihan C / C ++ analisis kode sumber kami yang canggih, kami berbicara banyak tentang alokasi memori, dan bagaimana hal itu mempengaruhi tingkat keparahan error. Kami fokus pada apa objek yang dialokasikan di memori, sehingga sangat penting untuk memahami bagaimana siklus hidup mereka dikelola, dan benda-benda lain dan struktur data dikelola di samping mereka.


Aman Komit

Kami di sini di Leaf pameran permanen yang kuat SR dampak kerentanan dan isu-isu arsitektur keamanan bagi pelanggan kami mulai dari penyalur berbahaya untuk hak istimewa deserialized melalui aplikasi web session cookies. Kami ingin memecahkan masalah, untuk memecahkan masalah ini diperlukan. Kami kewalahan oleh ratusan kerentanan keamanan di saat buruk dan belajar banyak pelajaran berharga di sepanjang jalan. Kami percaya sangat mendalam di beberapa pelajaran keselamatan ini dan mengintegrasikan mereka ke dalam pekerjaan kami untuk klien setiap hari:

  • sebelum keamanan merupakan bagian dari siklus pengembangan terbaik. Proyek aman lebih kuat dan lebih mudah untuk mempertahankan dalam jangka panjang
  • Cari penggunaan saat metode dan tren serangan sangat penting untuk melindungi dan meningkatkan aplikasi yang paling sensitif dan kode
  • memiliki rencana di tempat untuk menangani masalah-masalah keamanan yang mungkin timbul di antara investasi terbaik Anda dapat membuat aplikasi Anda

Hari ini kami mengumumkan “Aman Komit”, yang mencakup semua layanan yang kami tawarkan teman SR. Aman Komit mengambil segala sesuatu yang kita pelajari selama bertahun-tahun dan membuatnya tersedia untuk pengembang, keamanan dan personel operasional pada setiap tahap siklus hidup pengembangan perangkat lunak. Atau Anda masih dalam tahap perencanaan atau sudah mulai melakukan kode, kita dapat menerapkan keahlian kami untuk proyek. Kami mencapai ini melalui penilaian rinci dari arsitektur, struktur defensif dan aplikasi tes.

Kami juga memahami bahwa aplikasi warisan masih umum dan memerlukan pendekatan yang berbeda untuk mengurangi potensi risiko. Ada langkah-langkah yang dapat diambil untuk mengidentifikasi dan mengurangi kerentanan dalam aplikasi warisan, meminimalkan dampak dari orang-orang yang tetap tersembunyi.

Ketika menerapkan prinsip-prinsip, yang digulung dalam Safe Komit kita berpikir hasil akhir bisa menjadi kode yang lebih aman dengan keamanan utang yang lebih rendah untuk waktu yang lama.



Kami bergerak!

Kami memiliki beberapa berita menarik untuk mengumumkan hari ini DePerry Doug dan aku bergerak untuk bergabung dengan tim keamanan Yahoo. Kita tahu Alex Stamos, wakil presiden keamanan informasi di Yahoo, untuk beberapa waktu. Kami bertemu Alex melalui komunitas keamanan dan mengagumi upaya ia dan timnya lakukan untuk menjamin keamanan Yahoo, + pengguna 800M di seluruh dunia.

Saya mulai lembar keselamatan penelitian pada tahun 2011, dan bekerja dengan pelanggan dan mitra kami telah menjadi pengalaman yang sangat berharga bagi saya. Kami telah melakukan pekerjaan perintis untuk klien di seluruh sektor keuangan, teknologi start-up, pemerintah dan segala sesuatu. Sekarang saatnya untuk petualangan berikutnya. Kami berharap untuk membuat pengalaman kami di Yahoo dan tetap berhubungan dengan jaringan luar biasa yang telah kita buat selama bertahun-tahun.

Chris Rohlf

25 Juli 2014 g