1.
Eksploitasi Buffer Overflow
Dari
sekian banyak penyebab masalah keamanan pada komputer, baik yang bersifat lokal
maupun jaringan, buffer overflow termasuk salah satu penyebab yang
paling banyak dilakukan. Menurut laporan CERT/CC, buffer overflow merupakan penyebab dari 50% semua bug keamanan yang dilaporkan
dan dijadikan advisori oleh CERT/CC. Lebih jauh lagi, riset yang dilakukan oleh
Crispin Cowan dan kawan-kawan, menganggap buffer overflow sebagai vulnerability
of the Decade.
Buffer overflow merupakan sebuah kelemahan yang mudah
untuk ditemukan dan dimanfaatkan oleh penyerang
dalam sebuah sistem. Aplikasi dan Operating System (OS) menyimpan untuk
sementara perintah yang mereka dapat di memori tertentu yang biasa disebut buffer
memory. Kalau OS atau program tidak bisa dikode secara sempurna maka
penyerang bisa membuat komputer korban jadi terganggu dengan mengirimkan
perintah yang dibuat khusus, membuat
gangguan jadi berlangsung lebih lama. Windows 95 paling rentan kalau sudah
berhadapan dengan serangan seperti “buffer overflow” yang banyak dilancarkan
lewat internet ini. Saat ini serangan serupa sudah jarang dilancarkan pada
sebuah komputer. Namun terkadang penyerang masih sering melakukannya untuk
memperlambat kinerja sebuah situs.
a. Deskripsi Buffer Overflow
Untuk
mengetahui apakah sebenarnya buffer overflow dan bagaimana cara kerja
untuk mengekploitasinya, maka diperlukan pemahaman tentang cara kerja sistem processor
di level bawah, seperti pemrograman assembly, manajemen memory text,
stack, data dan sebagainya. Selain itu bagi pengguna sistem operasi Linux,
pengalaman program debug gdb akan sangat membantu.
Manajemen memori pada proses
Sebuah proses jika dilihat dari sudut
manajemen memori, dapat dibedakan menjadi tiga bagian .
·
Text, memuat instruksi kode program.
Bagian ini biasanya hanya bisa dibaca dan setiap usaha untuk menuliskan data ke
bagian ini akan menyebabkan kesalahan segmentation violation.
·
Data,
memuat data, baik yang telah diinisialisasikan
maupun yang belum. Selain dapat dibaca, biasanya bagian ini juga dimanipulasi
suatu instruksi untuk melakukan penulisan padanya.
·
Stack, yang dapat dialokasikansecara
dinamis, biasanya dimanfaatkan untuk menyimpan
variabel
lokal maupun untuk melewatkan parameter fungsi. Pengaksesan data kebagian ini
menggunakan
metode yang disebut LIFO (Last In First Out) seperti yang nanti akan
diterangkan
secara lebih rinci. Jenis data yang juga patut diketahui adalah sebagai
buffer
yang
pada bahasa C diimplementasikan sebagai array. Array dapat dibedakan ke
dalam dua
jenis
berdasarkan metode pengalokasiannya, yaitu array statis dan array dinamis. Array
statis
dialokasikan dibagian data saat program dimuat ke memory, sedangkan array
dinamis
dialokasikan
di dalam stacj saat run time.
Stack
dapat dibayangkan sebagai sebuah blok dan memori yang dapat memuat data secara
dinamis. Beberapa hal yang patut diketahui pada processor Intel sehubungan
dengan stack adalah sebagai berikut.
q Penggunaan metode Big Endian dalam
mengorganisasikan sistem memori. Disini MSB (Most Significant Bit) terletak
pada alamat memori yang lebih kecil dibandingkan LSB (Low Significant Bit).
q Penambahan besar stack dilakukan
ke arah alamat memori yang lebih kecil. Disini posisi bawah dari stack
mempunyai alamat yang tetap. Posisi atas stack yang alamat memorinya
lebih kecil dari posisi bawah selalu berubah.
q Register stack pointer (SP)
selalu menunjuk keposisi atas dari stack.
q Untuk memindahkan data ke stack
digunakan instruksi PUSH yang secara otomatis akan menurunkan nilai SP sebesar
4 byte. Sedangkan untuk mengambil data dari stack digunakan
instruksi POP yang secara otomatis juga akan menaikkan nilai SP sebesar 4 byte.
Blok memori dari stack ini
biasanya dibagi lagi menjadi apa yang disebut dengan register stack frame. Setiap
register stack frame berisi data
yang berhubungan dengan pemanggilan suatu fungsi. Biasanya posisi awal dari frame
ini ditunjukkan oleh frame pointer (FT).
Dengan bantuan FP ini, maka pengaksesan
ke variabel lokal maupun parameter fungsi dapat dilakukan menggunakan sistem
pengalamatanm relatif. Pada CPU Intel, register EBP berfungsi sebagai frame
pointer.
Setelah bahasan di atas, sekarang akan
dijelaskan pengertian buffer overflow. Buffer overflow memiliki arti suatu keadaan di mana data yang
diisikan ke suatu buffer mempunyai ukuran yang lebih besar dari
dibandingkan ukuran buffer itu
sendiri. Untuk lebih memahami buffer overflow, mungkin dapat kita temukan padanannya dalam
kehidupan sehari-hari, yaitu saat ember diisi
dengan air, sehingga air yang dituangkan sampai meluap ( overflow).
Sedangkan pada eksploitasi buffer
overflow, secara prinsip ada dua hal penting yang harus dilakukan dalam
proses eksploitasi buffer overflow, yaitu sebagai berikut.
1. Pertama harus membuat instruksi yang kita
kehendaki agar dijalankan setelah buffer ter overflow. Instruksi
ini biasanya berupa kode assembly ini harus dikonversi ke data
heksadesimal.
2. Kedua, harus memperhitungkan alamat posisi
RET dalam stack dan alamat kode instruksi tersebut. Kemudian alamat kode
instruksi ini harus dimasukkan ke dalam nilai RET, sehingga jika buffer ter
overflow instruksi tersebut dijalankan .
a. Bahaya Buffer
Overflow
Dari
deskripsi di atas dapat disimpulkan bahaya yang bisa ditimbulkan oleh
eksploitasi buffer overflow adalah sebagai berikut.
·
Pemanipulasian
dan pengrusakan data stack dimemori sehingga suatu program yang
memerlukan data tersebut akan mengalami gangguan dalam prosesnya.
·
apabila
suatu program atau aplikasi dijalankan maka instruksi-insruksi dari program
tersebut akan disimpan dalam memori. Dengan memanfaatkan eksploitasi buffer
overflow seorang pengganggu dapat memanipulasi instruksi-instruksi pada
memori dengan instruksi yang diinginkannya.
d. Cara
Penanggulangan
Berikut adalah
tindakan yang bisa dilakukan untuk menghindari terjadinya eksploitasi buffer
overflow. Dari sisi seorang pemrogram.
Sebuah program yang berjalan dengan privilge
tinggi, mengharuskan untuk melindungi semua data dan harus menganggap semua
data yang masuk patut dicurigai. Yang membatasi string nama yang
dimaksukkan sebesar 255 karakter.
Selain memeriksa ukuran input yang
dimasukkan, program juga harus memeriksa bahwa data yang dimasukkan adalah data
yang valid. Misalnya, jika program meminta input berupa tipe data interger,
maka program harus memastikan bahwa input yang diberikan oleh user benar-benar bertipe integer,
bukan tipe lainnya.
Konsepnya
adalah membuat segment data sebuah program tidak dapat dieksekusi.
Dengan menjadikannya tidak dapat dieksekusi, maka tidaklah mungkin bagi
penyerang untuk mengeksekusi kode yang mereka masukkan ke buffer input program korban.
Cara ini digunakan pada sistem operasi
komputer lama, tetapi pada sistem operasi UNIX dan MS Windowsteknik ini tidak
digunakan, karena keduanya tergantung pada kemampuan memasukkan kode dinamis ke
dalam segment data program untuk mendukung berbagai optimisasi kinerja.
·
Array
Bounds Checking
Meskipun
memasukkan kode adalah sebuah tindakan pilihan bagi serangan buffer
overflow, pengkorupsian aliran kendali merupakan hal yang penting. Dengan
menggunakan metode array bound checking akan menghentikan
vunerability dan serangan buffer overflow.Jika sebuah array
tidak dapat di-overflow, maka array tidak dapat digunakan untuk
mengkorupsi program yang terletak di alamat memori berikutnya. Untuk
mengimplementasikan metode ini, semua pembacaan dan penulisan ke array
yang harus diperiksa untuk memastikan bahwa mereka tidak melampaui batasan array.
·
Code
Pointer Integrity Checking
Tujuan
dar metode ini agak berbeda dengan bounds cheking. Alih-alih berusaha
mencegah korupsi kode pointer, ia berusaha mendeteksi bahwa sebuah kode pointer
telah terkorupsi sebelum ia dideferensikan. Jadi meskipun penyerang sukses
dalam mengkorupsi kode pointer, kode pointer yang terkorupsi tidak akan
digunakan karena korupsi terdeteksi setiap saat sebelum digunakan.
Indeks
yang digunakan untuk memanipulasi sebuah array harus diperiksa dengan
teliti.