BUFFER OVERFLOW
1. Apa itu Buffer Overflow ?
Dalam dunia keamanan sistem komputer dan pemrograman, istilah buffer overflow atau buffer overrun merupakan istilah yang cukup terkenal. Buffer overflow merupakan sebuah keadaan anomali di mana sebuah proses menunjukkan perilaku yang aneh disebabkan karena adanya data-data yang disimpan melebihi kapasitas buffer memorinya. Perilaku yang ditunjukkan oleh sebuah proses yang mengalami buffer overflow bisa jadi merupakan sebuah celah keamanan yang dapat dimanfaatkan oleh pihak-pihak yang tak bertanggung jawab.
Buffer overflow seringkali dieksploitasi dengan mengirimkan input-input yang sengaja dirancang untuk memicu keadaan buffer overflow tersebut. Input-input tersebut juga dirancang sedemikian rupa sehingga saat terjadi keadaan buffer overflow maka proses tersebut akan berkelakuan seperti yang diinginkan oleh sang penyerang. Bila keadaan ini telah terjadi maka bukan tidak mungkin informasi-informasi penting yang tersimpan di dalamnya bisa diambil, digunakan atau diubah sekehendak hati oleh sang penyerang.
2. Bagaimana Buffer Overflow dapat terjadi ?
Software apapun cepat atau lambat akan dihampiri oleh titik lemah buffer overflow. Pasalnya, salah satu penyebab buffer overflow adalah prinsip aktivitas dari setiap software, yakni hasil salinan data yang dikirim oleh user dari suatu tempat ke tempat lainnya. Jika developer suatu program menguji semua data sebelum disalin, maka bisa jadi buffer overflow masuk ke dalam library yang digunakan oleh program tersebut.
Hal ini dapat terjadi karena seringkali developer software lupa menguji batas buffer/array. Keterbatasan memory membatasi ukuran dari buffer/array, contohnya bila kita membuat suatu program dengan salah satu isinya sebagai berikut:
char userid[20];
char password[20];
Pertanyaannya bagaimana bila “userid” atau “password” di atas diberi masukan lebih dari 20 karakter?
Biasanya, pada pemrograman yang menggunakan C/C++ lah banyak terjadi kasus- kasus buffer overflow, tetapi tidak tertutup kemungkinan oleh bahasa pemrograman lain. Disini dapat dilihat banyak sekali fungsi- fungsi yang berbahaya yang ada pada C/C++ (atau yang sering kali menggunakan library- library).
Fungsi- fungsi tersebut yang termasuk adalah strcpy(), strcat(), gets(), sprintf() ,scanf(), fscanf() ,sscanf(), vscanf(), vsscanf(), vfscanf(). Fungsi- fungsi tersebut dapat menyebabkan masalah karena fungsi tersebut mudah menggunakan format yang tidak mendefinisikan nilai maksimum formatnya(menggunakan format “%s” adalah hamper selalu merupakan kesalahan apabila membaca input yang tidak valid). Fungsi- fungsi berbahaya lainnya adalah
realpath(), getopt(), getpass(), streadd(), strecpy(), dan trtrns(). Sebagai contoh implementasi buffer overflow dapat dilihat dari script dibawah ini :
Code : Buffer.c
#include
void duplikasi(char *st)
{
char buffer_overflow[30];
strcpy(buffer_overflow, st);
printf("Anda telah memasukan data ke variabel buffer_overflow dengan :\n%s\n", buffer_overflow);
return;
}
int main()
{
char pesan[100];
printf("Masukkan karakter, kemudian tekan Enter : ");
gets(pesan);
duplikasi(pesan);
return 0;
}
Dari kode di atas variabel pesan diduplikasikan ke variabel buffer_overflow yang memiliki kapasitas 30 karakter. Lalu apa yang terjadi jika kita masukkan karakter di atas 30 karakter? Sebelumnya kompile kode Buffer.c dengan gcc compiler.
gcc -o
Kita bisa mencoba program input yang kita buat di shell Linux atau Unix. Dari contoh di atas kita bisa melihat ketika dimasukkan karakter sebanyak 25 karakter aplikasi berjalan normal tetapi ketika dicoba dengan karakter di atas 30 yang terjadi adalah aplikasi mengalami stack smashing, inilah yang dimaksud dengan kondisi buffer overflow. Lalu apa yang terjadi di memori ketika terjadi buffer overflow? Kita akan mencoba menganalisisnya dengan program gdb (program debuger Linux dan Unix).
Dari data diatas dapat dilihat terjadinya stack smashing karena tidak ditemukannya instruksi pada alamat 0xb7fc0410. Biasanya, para cracker atau hacker yang ingin menyusup lebih dalam pada suatu system akan menganalisa hasil debug diatas dan membuat algoritma untuk membuat exploit(program untuk melakukan ekploitasi) untuk system tersebut.
3. Bagaimana cara mengatasi buffer overflow ?
3.1 Validasi Jangkauan Data
Saat kita menggunakan bahasa pemrograman tertentu maka pastinya kita akan dihadapkan dengan berbagai tipe data yang masing-masing memiliki jangkauan tertentu. Jangkauan nilai yang ditawarkan oleh tipe-tipe data tersebut merupakan sesuatu yang dapat didukung oleh hardware dan "dianggap cukup" untuk memenuhi kebutuhan kita. Sebagai contoh jika kita menggunakan tipe data integer 32 bit maka kita dapat memasukkan nilai mulai dari -2.147.483.648 sampai 2.147.483.647 yang dianggap komputer cukup untuk memenuhi kebutuhan kita. Pada kenyataannya terdapat beberapa program yang menemukan bahwa jangkauan nilai ini terkadang tidak cukup untuk memenuhi kebutuhannya.
Di saat terdapat kemungkinan di mana aplikasi yang anda rancang akan menerima input dari pengguna berupa nilai yang tidak seharusnya (melebihi jangkauan tipe data) maka ada baiknya jika kita menambahkan sepotong kode program untuk memeriksa/memvalidasi input yang diberikan pengguna sebelum diproses lebih lanjut. Jika proses validasi gagal maka program akan mengeluarkan peringatan/ pesan error atau mungkin program akan dihentikan secara otomatis.
3.2 Verifikasi Panjang Data
Bahasa pemrograman C dan turunannya seringkali bermasalah jika harus bekerja dengan tipe data String. String pada bahasa C dianggap sebagai array of Character sehingga tidak ada yang membatasi panjangnya kecuali diterminasi dengan karakter NULL atau dibatasi dengan kemampuan hardware sistem itu sendiri.
Dalam imlementasinya pada sebuah program, jarang sekali dibutuhkan panjang string yang tak terhingga. Pengembang program pada umumnya hanya membutuhkan alokasi string dalam jangkauan tertentu agar programnya dapat bekerja dengan baik dan sesuai harapan. Oleh karena itu untuk menghindari serangan buffer overflow ada baiknya dalam sebuah program ditentukan secara pasti berapa batas maksimum dan juga batas minimum dari jumlah string yang akan dipakai. Selanjutnya terhadap input yang dimasukkan dilakukan pemeriksaan apakah input memenuhi syarat jumlah karakter yang digunakan atau tidak. Jika jumlah karakter memenuhi syarat maka program dapat dilanjutkan, sebaliknya jika panjang karakter tak memenuhi syarat maka penguna akan diberi error message atau program dihentikan.
3.3 Mengantisipasi Karakter-karakter Ilegal
Cara yang paling sederhana dalam menguji keamanan sebuah sistem atau aplikasi yaitu dengan memasukkan input berupa karakter-karakter yang merupakan bagian dari program tersebut (misalnya :ls pada UNIX/Linux, $ pada php, cout<<>
Untuk mengatasi masalah-masalah akibat adanya karakter ilegal yang dimasukkan maka diperlukan mekanisme untuk memeriksa input apakah mengandung karakter-karakter yang tidak diperbolehkan atau tidak. Masing-masing bahasa pemrograman umumnya memiliki mekasnisme tersendiri dalam memeriksa masalah ini.
3.4 Beberapa pendekatan lain
Beberapa pendekatan untuk mencegah terjadinya buffer overflow pada level aplikasi telah dibicarakan di atas. Bagian berikut ini akan memberikan beberapa pendekatan tambahan yang sifatnya lebih rumit. Pendekatan yang disajikan di bawah ini diambil dari sudut pandang kompiler dan sistem secara umum namun sifatnya tetap mendukung keamanan aplikasi yang akan kita jalankan nantinya.
3.4.1 Canary-based Defense
Metode Canary-based defense dicetuskan oleh seorang peneliti bernama Crispen Cowan melalui pendekatan yang disebut StackGuard. Konsep dari pendekatan ini yaitu memodifikasi kompiler C sehingga saat dilakukan kompilasi maka ada sebuah nilai yang ditambahkan di depan return address yang disebut "canary" value. Saat sebuah fungsi telah selesai dijalankan dan akan kembali ke return address maka terlebih dahulu nilai "canary" tersebut akan diperiksa. Jika terjadi serangan buffer overflow yang mengubah nilai return address maka nilai "canary" juga akan berubah karenanya. Nilai "canary" yang berubah akan segera diketahui program dan program
akan dihentikan secara otomatis.
Perlindungan dengan metoda canary sangat bermanfaat untuk mencegah terjadinya serangan buffer overflow pada stack (stack overflow). Sayangnya metode ini tidak dapat melindungi aplikasi dari serangan-serangan buffer overflow lain seperti serangan buffer overflow yang mengubah nilai variabel akibat letaknya berdampingan dengan buffer variabel lain yang overflow. Meskipun demikian, konsep ini terus dikembangkan sehingga diharapkan kemampuannya dapat diperluas untuk mengatasi jenis serangan buffer overflow yang lain.
Metode ini meskipun masih memiliki beberapa kelemahan telah diadopsi oleh
beberapa kompiler C. Pengembangan dari konsep StackGuard yaitu ProPolice / Stack Smashing Protector (SSP) telah diimplementasikan pada GNU C Compiler (gcc) yang terdapat pada distribusi OpenBSD semenjak bulan Mei 2003. Selain itu perusahaan Microsoft juga telah menambahkan sebuah flag kompiler (/GS) sebagai implementasi konsep canary pada kompiler C yang dirilisnya.
3.4.2 ASCII Armor Region
Pendekatan ini didasari suatu ide yaitu membuat eksekusi kode saat berada dalam stack menjadi tidak mungkin. Ide ini mengalami banyak masalah dalam implementasinya, terlebih lagi ide ini sangat sulit diimplementasikan dalam mesin-mesin berprosesor x86 (prosesor yang umum digunakan saat ini).
Setelah dilakukan penelitian lebih lanjut maka muncul pendekatan yang lebih masuk akal untuk diimplementasikan yaitu memindahkan semua kode yang executable ke dalam area memori yang disebut "ASCII armor region". Konsep ini didasari pemikiran bahwa kebanyakan penyerang yang memanfaatkan buffer overflow mengalami kesulitan jika harus membuat sebuah program kembali ke sebuah return address dengan angka 0 di dalamnya. Oleh karena itu dengan memindahkan kode-kode program yang executable ke dalam sebuah area memori di mana terdapat alamat-alamat yang memiliki angka 0 akan lebih mempersulit si penyerang jika ingin merusak program dengan serangan buffer overflow.
Namun pendekatan ASCII armor ini tetap saja memiliki beberapa kelemahan. Daerah ASCII armor yang terentang antara alamat memori 0 sampai 0x01010100 terkadang tidak mencukupi untuk program-program berukuran besar sehingga perlindungannya tidak akan terlalu efektif. Meskipun demikian konsep ini tetap dipakai oleh beberapa distro Linux di antaranya Fedora Core (versi gratis dari Red Hat) dan OpenWall GNU/Linux(OWL) sebagai pengaman dari serangan buffer overflow.
3.4.3 Penggunaan library yang lebih aman
Library standar bahasa C yang memungkinkan terjadinya operasi pada strings merupakan celah untuk terjadinya buffer overflow. Untuk lebih meningkatkan keamanan aplikasi yang kita buat maka akan lebih baik jika kita menggunakan library yang labih baik dan mendukung perlindungan terhadap buffer overflow. Salah satu library yang dapat digunakan adalah SafeStr library. SafeStr menyediakan implementasi dari ukuran string yang dapat berubah-ubah dalam bahasa C. Library ini juga menyediakan mekanisme perhitungan alokasi dan ukuran sebenarnya dari setiap string. Jika terjadi hal-hal yang menyebabkan ukuran string bertambah melebihi alokasi memori untuk string tersebut maka library ini secara otomatis akan menaikkan pula alokasi memori untuk string sekurang-kurangnya sampai ukurannya menyamai ukuran string. Karena pengaturannya yang dinamis inilah maka penggunaan library SafeStr dianggap dapat mengurangi resiko terjadinya buffer overflow pada aplikasi.
4. Kesimpulan
Berdasarkan pembahasan terhadap buffer overflow tadi maka dapat diambil beberapa kesimpulan sebagai berikut:
1. Masalah buffer overflow merupakan masalah yang masih sering terjadi saat ini dan sampai saat ini masih dilakukan penelitian tentang cara yang efektif untuk menangani masalah ini
2. Buffer overflow dapat menyebabkan aplikasi atau program yang kita buat berkelakuan tidak semestinya. Hal ini sering dimanfaatkan oleh beberapa orang untuk menyerang sistem sehingga sistem dapat berkelakuan sesuai keinginan penyerang.
3. Bahasa pemrograman C dan turunannya merupakan bahasa pemrograman yang paling rentan terhadap ancaman buffer overflow terutama bila berkaitan dengan masalah operasi string
4. Terdapat beberapa pendekatan yang bisa digunakan untuk mengatasi masalah buffer overflow baik itu dari aplikasi itu sendiri, kompiler, library yang digunakan ataupun sistem operasi.
5. Meskipun demikian pendekatan-pendekatan yang digunakan tidak menjamin sistem aman 100 persen. Masih ada celah-celah lain yang mungkin belum tereksploitasi atau belum ditemukan solusi untuk mencegahnya.
Tidak ada komentar:
Posting Komentar