Konsep Buffer Overflow Vurnabilities dan Pencegahannya.


Kelemahan Buffer overflow adalah salah satu dari banyak kelemahan dari keamanan komputer.Kelemahan jenis ini dapat digunakan pada remote access atau local access, karena ini dapat memberikan si Attacker kesempatan untuk melanjarkan jurus-jurus dengan koding dikomputer target.

Serangan Buffer overflow terjadi ketika si Attacker memberikan input yang berlebihan pada program yang di jalankan, sehingga program mengalami kelebihan muatan dan memory tidak dapat mengalokasikannya. Ini memberikan kesempatan kepada Attacker untuk menindih data pada program dan men-takeover kontroll program yang dieksekusi attacker.

Buffee overflow hasil dari dari kelemahan bahasa pemrograman c, c++, fortran, dan assembly, yang tidak secara otomatis melakukan pengecekan batas input ketika program dieksekusi. Sebagai akibat dari Buffer overflow dapat menyebatkan crash pada program, atau mempersilahkan si Attacker untuk mengeksekusi perintah atau koding jahatnya untuk menguasai sistem target, seperti tujuan mengambil alih akun root menggunakan metode Buffer overflow.

ibaratnya seperti ini,,

si Attacker : Kamu akan saya hipnotis, tidur lebih dalam dan lebih lelap dari pada sebelumnya,,,

si Program  : monggo mas Attacker silahkan, diapakan saja, aku rela,,,,
Di dalam artikel ini, saya mencoba sedikit memberikan penjelasan bagaimana buffer overflow itu bekerja, dan bagaimana cara mengatisipasinya. Buffer overflow biasa terjadi karena sebagai berikut ;

  • Program yang begitu kompleks, sehinnga programmer sendiri tidak mengetahui kelemahan programnya
  • Relies on external data to control pada program

Buffer adalah alokasi yang disediakan di memory seperti array atau pointer di C. di bahasa C dan C++, tidak ada pembatasan otomatis pada buffernya, yang mana user dapat menulis input melewati buffer. Sebagai contoh :

int main () {
int buffer[10];
buffer[20] = 10;
}

Program bahasa C diatas adalah program yang valid, dan setiap compiler dapat mengkompil ini tanpa error. Tetapi, program ini dapat dijahili dengan menuliskan input melebihi batas buffer memory yang telah ditentukan, yang mana akan menghasilkan kesalahan pada program.

Sebuah proses adalah program dalam eksekusi. Program yang tereksekusi di dalam disk   mengandung beberapa set instruksi binary yang di kerjakan oleh prosessor; beberapa read-only data, seperti printf string format; global dan data statis yang output terakhir eksekusi program; and sebuah brk pointer yang menjaga jalur dari malloced memory. Fungsi local variabel adalah otomatisasi terbentuknya variabel dalam stack ketika fungsi di eksekusi.

bufferoverflow1

Ilustrasi di atas memperlihatkan layout memory di Linux. Sebuah proses dimulai dengan koding program-program dan data. Kode dan data berada dalam instruksi prgram dan inisialisasi dan uninialisasi statis dan global data secara berturut-turut. Setelah itu adalah run-time heap (Dibuat menggunakan malloc/calloc), dan di posisi atas adalah users stack. Stack ini digunakan ketika sebuah fungsi di panggil.

Bagian Stack.

Stack adalah beberapa blok dari memory yang berisi data. Sebuah stack pointer (SP) menunjuk paling atas dalam stack. Ketika pemanggilan fungsi terbentuk, parameter fungsi masuk ke dalam stack dari kanan ke kiri. Kemudian alamat pengembalian nilai (alamat yang akan dieksekusi setelah pengembalian nilai fungsi yang ditunjuk oleh frame pointer (FP), masuk ke dalam stack. Frame pointer digunakan sebagai referensi variabel lokal dan parameter fungsi, karena itu semua adalah kesatuan dari FP. otomatisasi lokal variabel masuk ke dalam stack setelah FP. Dalam Implementasinya,
stack terpenuhi dari alamat memory yang besar ke yang kecil.

bufferoverflow2

Ilustrasi di atas adalah bagian-bagian dari stack ketika sebuah fungsi dieksekusi. Perhatikan FP berada di antar local dan return addresses. Sebuah contoh dalam bahasa C,

void function (int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
int main() {
function(1,2,3);
}

function stack seperti di bawah ini;

bufferoverflow3
Seperti yang anda lihat, buffer1 menggunakan 8 bytes dan buffer2 12 byter,
di memory dapat dialamatkan hanya dalam beberapa bytes (4 byters). Sebagai
tambahan, FP digunakan untuk mengakses variabel a,b,c, buffer1 dan buffer2.
Semua variabel di bersihkan dalam stack sebagai function terminates. Variabel
tersebut tidak mengambil space dalam disk copy eksekusi.

Buffer Overflow : Detailnya

Contoh lain dalam bahasa C:

void function (char *str) {
char buffer[16];
strcpy (buffer, str);
}
int main () {
char *str = “I am greater than 16 bytes”; // panjang dari str = 27 bytes
function (str);
}

Program ini dijamin setelah di kompil, akan menghasilkan error, karena string (str) sebesar 27 bytes terkopi ke dalam lokasi (buffer) yang hanya dialokasikan sebesar 16 bytes. Ekstra bytes melewati buffer dan menimpa ruang yang dialokasikan untuk FP, return address juga terkena. Hal ini, menyebabkan corrupt dalam proses stack. Funsi yang digunakan untuk kopi string adalah strcpy, yang tidak memeriksa batasan inputnya. Menggunakan strncpy akan menghindari kejadian ini di dalam stack. Bagaimanapun, contoh klasik ini, menunjukkan bagaimana konsep buffer overflow dalam menimpa sebua fungsi return address, dan dilanjutkan dengan menjalankan beberapa malicious code.

Overwriting Function’s Return Addresses

Seperti yang kita tahu, sangat mudah untuk melakukan overwriting function’s return addresses, Attacker menggunakan teknik buffer overflow untuk mendapatkan akses root. Attacker mencoba mengeksekusi buffer overflowwing area, menimpa nilai dari return address yang mengisi nilai ke buffer dan mengeksekusi kode jahatnya. Seperti kode yang bisa dimasukkan ke dalam program menggunakan
environment variables atau program input parameters. Sebagai contoh koding yang bisa mendapatkan shell akun root pada paper yang ditulis oleh Aleph One untu Phrack Magazine di http://destroy.net/machines/security/P49-14-Aleph-One males juga untuk diceritakan lagi.

Tindakan Untuk Mencegah Buffer Overflow.

Tidak ada satupun metode yang dijelaskan di bawah yang benar-benar bisa mencegah kemungkinan serangan, namanya juga manusia tempatnya salah dan lupa. Tetapi metode di bawah ini, dapat meminimalisir dari kegiatan buffer overflows yang mengakibatkan kerusakan stack.

1. Menulis kode yang aman : Buffer overflow adalah hasil dari input yang berlebihan ke dalam buffer. C library seperti strcpy(), strcat(), sprintf() dan vsprintf() beroperasi pada null terminated strings dan tidak mengecek batasan input. gets() juga fungsi  lainnya yang memasukkan input ke dalam buffer dari stdin. Pada scanf() juga bisa mengakibatkan buffer overflows.

2. Stack execute invalidation : Karena koding jahat (contoh, instruksi assembly untuk mengambil alih root shell) merupakan input argument ke dalam program, ini tersimpan ke dalam stack dan bukan dalam code segment. Oleh karena itu, solusi mudahnya adalah tidak mempebolehkan stack mengeksekusi instruksi apapun. Kode apapun yang dieksekusi dengan kode lainnya di dalam stack dapat mengakibatkan segmentation violation.

3. Compiler tools : Beberapa tahun terakhir, compiler mempunyai kemampuan lebih. Beberapa compiler dilengkapi peringatan dalam penggunakan konstruk yang tidak aman seperti gets(), strcpy() dan sejenisnya, sebagai contoh :

int main () {
char *str = (char *)malloc(10);// mengalokasikan 10 bytes untuk str
gets (str); // membaca input dari stdin dan disimpan ke str
}

setelah di kompile, makan muncul warning:

/tmp/cc203ViF.o: In function “main”:
/tmp/cc203ViF.o(.text+0x1f): the “gets” function is dangerous and should not be used.

Modern compilers tool mempunayi fitur untuk bounds checking, jadi meng-generate kode yang built-in tanpa mengubah struktur kode yang dapat menghindarkan penggunaan ilegal addressess. Kode apapun yang dicoba untuk mengakses illegal address tidak diperbolehkan untuk dieksekusi. gunakanlah
patch GCC untuk mendapatkan fitur bounds checking, dapat anda temui di http://web.inter.nl.net/hcc/Haj.Ten.Brugge patch ini juga mencegah tindakan penimpaan return address, seperti yang banyak terjadi. dan juga gunakan tools StackShield di http://www.angelfire.com/sk/stackshield/index.html

references :

– en.wikipedia.org/wiki/Buffer_overflow
http://www.linuxjournal.com/article/6701
http://www.owasp.org/index.php/Buffer_Overflow
http://www.securiteam.com/securityreviews/5OP0B006UQ.html

14 thoughts on “Konsep Buffer Overflow Vurnabilities dan Pencegahannya.

  1. gw pernah nyoba

    void function (char *str) {
    char buffer[16];
    strcpy (buffer, str);
    }

    seharusnya logikanya kalo lebih dari 16 kan langsung
    Segmentation fault
    tapi sudah dikasih 17/18 input kok tetap exit normally
    bisa jelaskan kenapa??

  2. Penjelasan yg simpel dan padat..
    mudah di mengerti…
    beda dari blog2 lainnyan, cara menjelaskan menggambarkan kepintaran yg anda miliki.

    maaf saya comment d sini..(kurang mengerti seluk beluk post)

    apakah mas bisa menjelaskan tentang topik yg lain, saya di berikan tugas tentang “Metasploit”, saya telah mencari2 di semua web, blog tp tidak ad satu pun yg menjelaskan secara rinci dan mudah d pahami.

    apakah mas bisa membantu saya untuk menjelaskan tentang hal tersebut?
    maaf jika kata2 yg saya gunakan tidak berkenan d hati mas..

    mohon bantuannya mas, kl bisa kirim ke email saya yg saya sertakan diatas,

    terima kasih sebelumnya..^^

    • Hallo mas terima kasih sudah berkunjung,,, tentang metasploit sebenernya sudah banyak bertebaran di Internet, niat saya juga mau nambah postingan tentang metasploit, mungkin karena keterbatasan waktu saya blum sempat untuk utak-atik itu metasploit karena kesibukan.. mungkin di lain waktu saya akan mencoba untuk membahasnya di postingan berikutnya…😀

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s