Anda di halaman 1dari 27

Keamanan Sistem Informasi

Program Security (Buffer Overflow)


Pertemuan 14
RPS
Pendahuluan

Buffer Overflow ?

Baper yang berlebihan ☺


Buffer dan register
Buffer dan register
• register adalah area
penyimpanan sementara
dalam prosesor yang
memungkinkan transfer
data lebih cepat
• buffer adalah area
penyimpanan sementara
di memori utama yang
menyimpan data sebelum
menggunakannya.
Pendahuluan
• Eksploitasi security, yang sering digunakan oleh para attacker,
yang digabungkan dengan virus komputer, dapat menyebabkan
serangan yang sangat kompleks terhadap sistem dan aplikasi
berbasis software.
• Dalam kasus tertentu, serangan semacam ini jauh melebihi
kemampuan software antivirus.
• Salah satu masalah keamanan yang sudah lama muncul dan
sangat mengganggu adalah serangan dengan Buffer Overflow
(BO).
Buffer Overflow
• Buffer adalah area penyimpanan data yang mempunyai
kapasistas/ukuran tertentu. Buffer overflow (BO) terjadi jika suatu
program berusaha menyimpan data ke buffer, sebuah kejadian
anomaly dimana ukuran data lebih besar dari ukuran buffer
melakuakan overruns batas buffer dan menimpa memori yang
berdekatan..
• BO terjadi karena pembuat program komputer menulis baris kode
tanpa mengecek ukuran dari buffer yang dituju untuk mengetahui
apakah cukup untuk menerima data baru.
• Ini adalah kasus yang khusus dalam pelanggaran keamanan
memori.
• Akibat : hilangnya availability aplikasi
Contoh Illustrasi

• Saat jumlah data melebihi ukuran buffer, kelebihan data dapat melimpah ke
lokasi memory terdekat, merusak data dan bisa merubah path dan perintah
eksekusi. Diantara informasi yang rusak
• Mungkin terdapat informasi yang berisi subroutine dari suatu
program, sehingga program tidak dapat menemukan subroutine dan tidak
dapat menyelesaikan programnya
• Buffer overflow biasa terjadi karena sebagai berikut ;
– Program yang begitu kompleks, sehigga programmer sendiri tidak mengetahui kelemahan
programnya
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.
Proses terjadinya Buffer Overflow
• Dalam program yang menggunakan bahasa C ,
buffer dialokasikan dengan array atau pointer.
• C atau C + + tidak mempunyai pengecekan otomatis
(automatic bounds checking) batasan suatu buffer,
sehingga pengguna dapat menulis kode untuk
memberikan data melebihi ukuran buffer .
Contoh scipt Bahasa C;
https://www.onlinegdb.com/
#include <stdio.h>
#include <string.h>

int main(void)
{
char buff[15];
int pass = 0;

printf("\n Enter the password : \n");


gets(buff);

if(strcmp(buff, "stmikplk"))
{
printf ("\n Wrong Password \n");
}
else
{
printf ("\n Correct Password \n");
pass = 1;
}

if(pass)
{
/* Now Give root or admin rights to user*/
printf ("\n Root privileges given to the user \n");
}
return 0;
}
Output masukan benar
script Bahasa C;
Output masukan salah
script Bahasa C;
Output buffer overflow
script Bahasa C;
Contoh lain;
• 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.
Buffer Overflow : Example
void function (char *str) { char
buffer[16];
strcpy (buffer, str);
}
int main () {
char *str = “I am greater than 16 bytes”; //
panjang dari str = 26 bytes function (str);
}
Hindari fungsi berikut
Keterangan;
• Program ini dijamin setelah di kompile, akan menghasilkan error,
karena string (str) sebesar 26 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.
• Fungsi yang digunakan untuk kopi string adalah strcpy, yang
tidak memeriksa batasan inputnya. Menggunakan strncpy akan
menghindari kejadian ini di dalam stack.
• Hal ini menunjukkan bagaimana konsep buffer overflow dalam
menimpa sebuah fungsi return address, dan dilanjutkan dengan
menjalankan beberapa malicious code.
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.
stack heap
1. Eksploitasi berbasis Stack
• beberapa cara yang dapat dilakukan :
– Dengan menimpa variabel lokal yang dekat buffer di memori pada stack
untuk mengubah perilaku program yang dapat mengambil manfaat
penyerang.
– Dengan menimpa alamat pengirim dalam stack frame. Setelah fungsi
kembali, eksekusi akan dilanjutkan pada alamat sebagaimana ditentukan
oleh penyerang, biasanya input pengguna buffer terisi.
– Dengan menimpa fungsi pointer, atau handler axception, yang kemudian
dieksekusi.
2. Eksploitasi berbasis Heap
• 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.
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.
Mencegah Terjadinya Buffer Overflow

• Menulis kode yang aman : Buffer overflow adalah hasil dari


input yang berlebihan ke dalam buffer.
• 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.
• Compiler tools : Beberapa tahun terakhir, compiler mempunyai
kemampuan lebih. Beberapa compiler dilengkapi peringatan
dalam penggunakan konstruk yang tidak aman seperti gets(),
strcpy() dan sejenisnya.
• Penggunaan Library yang aman
Kesimpulan
• Tidak ada satupun metode yang telah dijelaskan
sebelumnya yang benar-benar dapat mencegah
kemungkinan serangan Buffer Oveflows.
• Tetapi metode pencegahan yang sudah dijelaskan,
dapat meminimalisir dari kegiatan buffer overflows
yang mengakibatkan kerusakan stack.

Anda mungkin juga menyukai