29 April 2013

Buffer Overflow


Pengertian Buffer Overflow


Dalam keamanan komputer dan pemrograman, buffer overflow, atau buffer overrun, adalah anomali di mana sebuah program, saat menulis data ke buffer, melakuakan overruns batas buffer dan menimpa memori yang berdekatan. Ini adalah kasus yang khusus dalam pelanggaran keamanan memori.

Buffer overflows dapat dipicu oleh suatu input yang dirancang untuk mengeksekusi kode, atau mengubah cara program beroperasi. Hal ini dapat mengakibatkan perilaku program menentu, termasuk kesalahan akses memori, hasil yang salah, kecelakaan, atau pelanggaran keamanan sistem. Dengan hal-hal tersebut, maka Hal ini dapat menjadi dasar dari banyak kerentanan perangkat lunak dan dapat dieksploitasi oleh pihak yang tak bertanggung jawab.

Bahasa pemrograman umumnya terkait dengan buffer overflows termasuk C dan C + +, yang tidak menyediakan built-in perlindungan terhadap cara mengakses atau menimpa data dalam setiap bagian data dari memori dan tidak secara otomatis memeriksa bahwa data ditulis ke array (built-in tipe buffer) yang termasuk dalam batas-batas array. Bounds Checking dapat mencegah buffer overflows.

 

Deskripsi teknis Buffer Overflow


Sebuah buffer overflow terjadi ketika data ditulis ke buffer,  lalu merusak nilai-nilai data dalam alamat memori (Memory Address) yang berdekatan dengan buffer tujuannya. Hal ini dapat terjadi saat menyalin data dari satu buffer yang lain tanpa memeriksa terlebih dahulu bahwa data tersebut cocok kedalam buffer tujuannya.

 

Contoh Buffer Overflow


Dalam contoh berikut, program memiliki dua item data yang berdekatan dalam memori: sebuah string buffer 8-byte-panjang, A, dan integer big-endian byte dua, B.





Awalnya, A tidak berisi apa-apa kecuali nol byte, dan B berisi nomor 1979.


Sekarang, program mencoba untuk menyimpan string diakhiri null-"excessive" dengan encoding ASCII dalam buffer A.


"excessive" memiliki panjang 9 karakter dan meng encode sampai 10 byte termasuk terminator, tapi A dapat mengambil hanya 8 byte. Dengan menggagalkan pemeriksaan panjang string, ia juga menimpa nilai di dalam  B:


Nilai B kini digantikan oleh sejumlah "form number" yang terbentuk dari bagian karakter string. Dalam contoh ini "e" diikuti dengan byte nol akan menjadi 25.856.Menulis data melewati ujung memori yang dialokasikan kadang-kadang dapat dideteksi oleh sistem operasi untuk menghasilkan kesalahan kesalahan segmentasi yang mengakhiri proses.

Eksploitasi Buffer Overflow


Teknik-teknik untuk mengeksploitasi kerentanan buffer overflow bervariasi, yaitu menurut arsitektur, sistem operasi dan daerah memori. Misalnya, eksploitasi pada heap (digunakan untuk allocated memory secara dinamis), sangat berbeda dari eksploitasi pada panggilan stack.


Eksploitasi berbasis Stack


Seorang pengguna teknis cenderung dapat mengeksploitasi berbagai tumpukan berbasis buffer overflows untuk memanipulasi program untuk keuntungan mereka.  

beberapa cara yang dapat dilakukan :
  1. Dengan Timpa variabel lokal yang dekat buffer di memori pada stack untuk mengubah perilaku program yang dapat mengambil manfaat penyerang.
  2. Dengan Timpa alamat pengirim dalam stack frame. Setelah fungsi kembali, eksekusi akan dilanjutkan pada alamat sebagaimana ditentukan oleh penyerang, biasanya input pengguna buffer terisi.
  3. Dengan Timpa fungsi pointer, atau handler axception, yang kemudian dieksekusi.

Dengan metode yang disebut "trampolining", jika alamat dari data yang disediakan pengguna tidak diketahui, tetapi lokasi disimpan dalam register, maka alamat pengirim dapat ditimpa dengan alamat dari opcode, yang akan menyebabkan eksekusi diberikan ke pengguna data. Jika lokasi disimpan dalam register R, kemudian melompat ke lokasi yang mengandung opcode untuk melompati R, dengan panggilan R atau instruksi serupa, akan menyebabkan eksekusi tersedianya data pengguna. Lokasi-lokasi yang cocok opcodes, atau byte dalam memori, dapat ditemukan dalam DLL atau eksekusi itu sendiri. Namun biasanya opcode tidak boleh berisi karakter null dan lokasi opcodes ini dapat bervariasi di antara aplikasi dan versi dari sistem operasi. Proyek Metasploit adalah salah satu database seperti opcodes cocok, meskipun hanya dapat ditemukan di sistem operasi Windows.

Tumpukan berbasis buffer overflows tidak akan tertukar dengan stack overflow.
kerentanan ini biasanya ditemukan melalui penggunaan fuzzer a.


Eksploitasi berbasis Heap


Sebuah buffer overflow terjadi di area tumpukan data disebut sebagai timbunan overflow dan dieksploitasi dengan cara yang berbeda dengan berbasis stack. Memori di heap dialokasikan secara dinamis oleh aplikasi pada saat run-time dan biasanya berisi data program. Eksploitasi dilakukan dengan merusak data ini dengan cara-cara khusus dan menyebabkan aplikasi menimpa struktur internal seperti pointer linked list. Teknik Kanonik overflow menimpa memori dinamis alokasi linkage (seperti meta data yang malloc) dan menggunakan pertukaran pointer yang dihasilkan untuk menimpa fungsi pointer Program.Kelemahan GDI + Microsoft dalam penanganan JPEG adalah contoh dimana overflow dapat terjadi.

 

Hambatan eksploitasi


Manipulasi dari buffer, yang terjadi sebelum membaca atau dieksekusi, dapat menyebabkan kegagalan upaya eksploitasi. Manipulasi ini dapat mengurangi ancaman eksploitasi. Manipulasi dapat mencakup konversi ke atas atau huruf kecil, penghapusan metakarakter dan menyaring string non-alfanumerik. Namun, berbagai teknik yang ada tersedia untuk mem-bypass filter dan manipulasi, kode alfanumerik, kode polimorfik dan serangan return-to-libc. Metode yang sama dapat digunakan untuk menghindari deteksi oleh sistem pendeteksi intrusi. Dalam beberapa kasus, termasuk di mana kode diubah menjadi unicode, ancaman kerentanan telah disalahpahami oleh disclosers hanya sebagai Denial of Service padahal remote eksekusi kode kemungkinan dapat terjadi.

 

Kepraktisan eksploitasi

Dalam eksploitasi dunia nyata ada berbagai tantangan yang perlu diatasi untuk eksploitasi untuk ke andalan beroperasi. Faktor-faktor ini termasuk byte null dalam alamat, variabilitas di lokasi shellcode, perbedaan antara lingkungan dan berbagai langkah-langkah balasan beroperasi.



Pilihan bahasa pemrograman untuk Menghindari Buffer Overflow

Pilihan bahasa pemrograman dapat memiliki efek yang signifikan dalam terjadinya buffer overflows. Pada 2008, di antara bahasa yang paling populer adalah C dan turunannya, C + +, . 
C dan C + + tidak menyediakan built-in perlindungan terhadap kegiatan mengakses atau menimpa data dalam setiap bagian dari memori, lebih khususnya, mereka tidak memeriksa bahwa yang data ditulis ke dalam buffer dalam batas-batas penyangganya. Namun, Library standar C + +  menyediakan banyak cara aman untuk penyangga datanya, dan teknik untuk menghindari buffer overflows juga ada untuk C.Banyak bahasa pemrograman lain menyediakan runtime checking dan dalam beberapa kasus bahkan memeriksa waktu kompilasi yang kemungkinan dapat mengirimkan peringatan atau memunculkan eksepsi bila C atau C + + akan menimpa data dan terus mengeksekusi instruksi lebih lanjut sampai hasil yang salah yang diperoleh yang mungkin atau mungkin tidak menyebabkan program untuk crash.  

Contoh bahasa tersebut termasuk Ada, Eiffel, Lisp, Modula-2, Smalltalk, OCaml dan seperti C-derivatif sebagai Topan dan D. Jawa dan. NET Framework lingkungan bytecode juga mensyaratkan batas pemeriksaan pada semua array. Hampir setiap bahasa ditafsirkan akan melindungi terhadap serangan buffer overflows, menandakan kondisi kesalahan yang jelas. Seringkali bahasa menyediakan informasi yang cukup untuk melakukan jenis batas checking. Berbagai Opsi disediakan untuk mengaktifkan atau menonaktifkannya. Pembuat Software harus hati-hati dalam mempertimbangkan biaya keselamatan terhadap kinerja saat memutuskan bahasa dan compiler pengaturan untuk digunakan.

 

Penggunaan Library yang aman


Masalah buffer overflows adalah umum di C dan C + + karena mereka mengekspos rincian representasional buffer sebagai wadah untuk tipe data. Sehingga Buffer overflows harus dihindari dengan mempertahankan tingkat tinggi kebenaran dalam kode yang melakukan manajemen buffer. Hal Ini telah lama dianjurkan untuk menghindari fungsi Library standar yang tidak batas diperiksa, seperti mendapat, scanf dan strcpy. Morris worm dieksploitasi mendapat panggilan di fingerd.Pada September 2007, Laporan Teknis 24.731, disiapkan oleh C komite standar, diterbitkan, Ia menentukan satu set fungsi yang didasarkan pada string C perpustakaan standar dan I / O fungsi, dengan parameter penyangga ukuran tambahan. Namun, efektivitas fungsi-fungsi untuk tujuan mengurangi buffer overflows masih diperdebatkan, membutuhkan intervensi programmer berdasarkan per panggilan fungsi yang setara dengan intervensi yang bisa membuat analog tua perpustakaan standar fungsi buffer overflow yang aman.

 

Perlindungan dari buffer overflow


Perlindungan terhadap buffer overflow digunakan untuk mendeteksi berbagai kejadian yang paling umum dalam buffer overflows dengan memeriksa bahwa tumpukan belum diubah ketika kembali berfungsi. Jika sudah diubah, program keluar dengan kesalahan segmentasi. Tiga sistem tersebut Libsafe, dan StackGuard dan ProPolice gcc patch.
Microsoft's Data Execution Prevention mode melindungi pointer ke Exception Handler SEH dari data yang ditimpa.

 

Perlindungan Pointer


Buffer overflows bekerja dengan memanipulasi pointer (termasuk alamat yang disimpan). PointGuard diusulkan sebagai-ekstensi compiler untuk mencegah penyerang yang mampu memanipulasi pointer dan alamat. Pendekatan ini bekerja dengan memiliki compiler menambahkan kode untuk secara otomatis XOR-encode pointer sebelum dan sesudah mereka digunakan. Karena penyerang (teoritis) tidak tahu apa nilai akan digunakan untuk encode / decode pointer, ia tidak dapat memprediksi apa yang akan menunjuk ke jika ia menimpa itu dengan nilai baru. PointGuard tidak pernah dirilis, tapi Microsoft menerapkan pendekatan awal yang mirip pada Windows XP SP2 dan Windows Server 2003 SP1. Daripada menerapkan perlindungan pointer sebagai fitur otomatis, Microsoft menambahkan API yang dapat dipanggil pada kebijaksanaan programmer . Hal ini memungkinkan kinerja yang lebih baik (karena tidak digunakan sepanjang waktu), tetapi menempatkan beban pada programmer untuk mengetahui jika diperlukan.Karena XOR adalah linier, penyerang mungkin dapat memanipulasi pointer. Hal ini dapat memungkinkan serangan berhasil jika penyerang dapat mencoba mengeksploitasi beberapa kali dan / atau mampu menyelesaikan serangan dengan menyebabkan pointer untuk menunjuk ke salah satu dari beberapa lokasi (seperti lokasi manapun dalam kereta luncur NOP). Microsoft menambahkan rotasi acak untuk skema encoding mereka untuk mengatasi kelemahan ini untuk sebagian kasus penimpaan data.



Sumber : Wikipedia (en)
 

Tidak ada komentar:

Posting Komentar