SECURE PROGRAMMING UNTUK MENCEGAH BUFFER OVERFLOW
SKRIPSI
Diajukan Untuk Memenuhi Salah Satu Syarat Meraih Gelar
Sarjana Komputer Jurusan Teknik Informatika
Pada Fakultas Sains dan Teknologi
UIN Alauddin Makassar
Oleh SUHERMAN NIM. 60200106067
JURUSAN TEKNIK INFORMATIKA
FAKULTAS SAINS DAN TEKNOLOGI
UNIVERSITAS ISLAM NEGERI (UIN) ALAUDDIN
MAKASSAR
ii ABSTRAK Nama : Suherman
Nim : 60200106067
Judul : Secure Programming untuk Mencegah Buffer Overflow
Salah satu masalah yang berkaitan dengan kesalahan dalam perangkat lunak yaitu Buffer overflow. Buffer overflow dapat dieksploitasi dengan mengirimkan input-input yang
sengaja dirancang untuk memicu keadaan buffer overflow tersebut. Input-input tersebut juga
dirancang sedemikian rupa sehingga saat terjadi buffer overflow, maka proses tersebut akan
berkelakuan seperti yang diinginkan oleh 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 penyerang. Pada penelitian ini dibahas metode
pencegahan buffer overflow dengan pendekatan secure programming yang diterapkan
dalam alat analisis kode sumber program ,analsis kode sumber program berbentuk teks editor
yang dilengkapi dengan pendeteksi kemungkinan terjadinya buffer overflow. Buffer overflow
terjadi karena beberapa fungsi dalam bahasa C/ C++ memiliki kerentanan untuk terjadinya buffer overflow serta C/ C++ tidak memeriksa batasan array dan referensi pointer secara otomatis, kerentanan tersebut dapat dicegah dengan review kode pada saat penulisan kode program yaitu membatasi input yang datangnya dari user. Kerentanan ini dapat dicegah dan perlindungan dapat ditingkatkan dengan menekankan solusi lebih pada saat penulisan kode program.
iii
PERSEETUJUAN PEMBIMBING
Pembimbing penulisan skripsi Saudara Suherman, Nim : 60200106067,
Mahasiswa Jurusan Teknik Informatika pada Fakultas Sains dan Teknologi UIN
Alauddin Makassar, setelah dengan seksama meneliti dan mengoreksi skripsi yang
bersangkutan dengan judul “Secure Programming untuk Mencegah Buffer
Overflow”, memandang bahwa skripsi tersebut telah memenuhi syarat-syarat ilmiah
dan dapat disetujui untuk diajukan ke sidang munaqasyah.
Demikian persetujuan ini diberikan untuk proses selanjutnya.
Makassar, 11 April 2011
Pembimbing I Pembimbing II
iv
PERNYATAAN KEASLIAN SKRIPSI
Dengan penuh kesadaran, penyusun yang bertanda tangan di bawah ini
menyatakan bahwa skripsi ini benar bahwa hasil karya penyusun sendiri. Jika di
kemudian hari terbukti bahwa ia merupakan duplikat, tiruan, plagiat, atau dibuat oleh
orang lain, sebagian atau seluruhnya, maka skripsi dan gelar yang diperoleh
karenanya batal demi hukum.
Makassar, 21 April 2011
Penyusun,
v
21 April 2011 M 17 Jumadil Awal 1432 H
PENGESAHAN SKRIPSI
Skripsi yang berjudul “Secure Programming untuk Mencegah Buffer Overflow” yang disusun oleh Suherman, NIM: 60200106067, telah diuji dan dipertahankan dalam sidang munaqasyah yang diselenggarakan pada hari Jum’at, 15 April 2011, dinyatakan telah dapat diterima sebagai salah satu syarat untuk memperoleh gelar Sarjana Komputer pada Jurusan Teknik Informatika Fakultas Sains dan Teknologi , dengan beberapa perbaikan.
Makassar,
DEWAN PENGUJI
Ketua : Ridwan A.Kambau, S.T.,M.Kom ( ... )
Sekretaris : Nur Afif, S.T., M.T ( ... )
Munaqisy I : Mustikasari, S.Kom., M.Kom ( ... )
Munaqisy II : Abdul Wahid, S.T.,M.Kom ( ... )
Munaqisy III : Drs. M. Arif Alim, M.Ag ( ... )
Pembimbing I : Faisal, S.Kom., M.Kom ( ... )
Pembimbing II : Yusran Bobihu, S.Kom., M.Si ( ... )
Diketahui Oleh :
Dekan Fakultas Sains dan Teknologi
UIN Alauddin Makassar
vi
KATA PENGANTAR
Alhamdulillahirobbil a’lamin penulis bersyukur kepada Allah SWT. Karena
atas berkat, rahmat dan karunia yang telah diberikannya sehingga penulis bisa
menyelesaikan tugas akhir ini.
Tugas akhir ini merupakan syarat wajib kelulusan pada program sarjana
strata satu di Jurusan Teknik Informatika Fakultas Sains dan Teknologi Universitas
Islam Negeri Alauddin Makassar. Berbagai kemudahan dan hambatan yang dihadapi
penulis dalam proses pengerjaan tugas akhir ini semoga dapat memberikan
pengalaman kepada penulis di masa mendatang.
Tugas akhir ini kupersembahkan kepada kedua orang tua penulis yang selalu
mencintai dan mendidik penulis semenjak penulis lahir di dunia,dan selalu
mendoakan penulis di dalam menyelesaikan tugas akhir ini.
Perkenankan penulis menyampaikan terima kasih kepada:
1. Rektor UIN Alauddin Makassar, Bapak Prof. Dr. H. A. Qadir Gassing, H. T, MS.
2. Dekan Fakultas Sains dan Teknologi, Bapak Prof. Dr.H. Bahaking Rama, M.S.
3. Pembantu Dekan I, II, dan III Fakultas Sains dan Teknologi.
4. Bapak Faisal, S.Kom.,M.Kom dan Ibu Mustikasari, S.Kom.,M.Kom selaku ketua
Jurusan dan sekretaris Jurusan Teknik Informatika Fakultas Sains dan Teknologi
Universitas Islam Negeri Alauddin Makassar beserta seluruh stafnya yang telah
memberikan bimbingan selama masa pendidikan.
5. Seluruh pegawai dan staf akademik Fakultas Sains dan Teknologi yang telah
vii
6. Bapak Faisal, S.Kom.,M.Kom dan Bapak Yusran Bobihu, S.Kom.,M.Si selaku
dosen pembimbing yang dengan kerelaan dan keikhlasannya memberikan
bimbingan dari awal hingga peyelesaian skripsi ini.
7. Semua dosen Teknik Informatika UIN Alauddin Makassar, terima kasih atas
segala ilmunya.
8. Ibunda dan Ayahanda tercinta atas segala doa dan pengorbanannya kepada
penulis.
9. Teman-teman Teknik Informatika Angkatan 2006, senior-senior angkatan 2004,
2005 dan adik-adik angkatan 2007 terima kasih atas bantuan dan dorongan
semangatnya selama ini.
10. Dan Semua yang telah membantu penulis dalam menyelesaikan tugas akhir ini
yang tidak bisa disebutkan satu persatu.
Semoga Allah SWT memberikan imbalan yang setimpal atas segala bantuan
yang diberikan kepada penulis.
Penulis sadar bahwa tugas akhir ini masih jauh dari harapan dan masih
terdapat banyak kekurangan, olehnya itu penulis butuh saran dan kritikan dari
berbagai pihak demi kesempurnaan tugas akhir ini..
Wassalamualaikum warahmatullahi wabarakatuh
Makassar, 11 April 2011
viii DAFTAR ISI
HALAMAN JUDUL ... i
ABSTRAK ... ii
PERSETUJUAN PEMBIMBING ... iii
HALAMAN PERNYATAAN KEASLIAN SKRIPSI ... iv
HALAMAN PENGESAHAN ... v
KATA PENGANTAR ... vi
DAFTAR ISI ... ix
DAFTAR TABEL ... xii
DAFTAR GAMBAR ... xiii
BAB I PENDAHULUAN A. Latar Belakang ... 1
B. Rumusan Masalah ... 3
C. Batasan Masalah ... 3
D. Pengertian Judul ... 3
E. Tujuan dan Manfaat Penelitian. ... 4
F. Sistematika Pembahasan ... 5
BAB II TINJAUAN PUSTAKA A. Memori ... 6
1. Model Memori ... 6
2. Memori dan Pengalamatan ... 7
3. Segmentasi Memori Program ... 8
4. Operasi Stack ... 12
B. Buffer Overflow ... 13
ix
2. Heap Over Flow. ... 16
3. Format String Attack. ... 17
4. Array Index Error ... 19
C. Secure Programming ... 20
1. Menetapkan Gaya Pengkodean ... 20
2. Input Validation ... 20
3. Buffer Non Executable ... 21
4. Array Bounds Checking ... 21
5. Code Pointer Integrity Checking ... 21
D. Kajian Pustaka ... 22
BAB III METODE PENELITIAN A. Gambaran Umum Penelitian. ... 24
B. Metode Penelitian... 24
C. Jenis Penelitian. ... 24
D. Tahapan Penelitian. ... 25
BAB IV PERANCANGAN SISTEM A. Rancangan Pendeteksi Buffer Overflow ... 26
B. Rancangan Aplikasi ... 27
C. Rancangan Input ... 37
D. Rancangan Output ... 40
BAB V IMPLEMENTASI DAN PENGUJIAN SISTEM A. Implementasi Pendeteksian Buffer Overflow ... 41
B. Pengujian Pendeteksi Buffer Overflow ... 49
BAB VI PENUTUP A. Kesimpulan ... 58
x
DAFTAR PUSTAKA ... 59 LAMPIRAN-LAMPIRAN
xi
DAFTAR TABEL
Tabel 2.1 Parameter yang umumnya digunakan untuk format string attack... 18
xii
DAFTAR GAMBAR
Gambar 2.1 Tiga model manajemen memori ... 7
Gambar 2.2 Proses memori ... 10
Gambar 2.3 Penempatan souce code kedalam memori pada waktu eksekusi... 11
Gambar 2.4 Stack layout ... 13
Gambar 2.5 Stack frame ... 15
Gambar 2.6 Stack buffer overflow untuk menjalankan shellcode ... 16
Gambar 2.7 Heap sebelum overflow ... 17
Gambar 2.8 Heap setelahoverflow ... 17
Gambar 4.1 Flowchart perancangan pendeteksi buffer overflow ... 26
Gambar 4.2 Proses kompilasi kode program ... 28
Gambar 4.3 Flowchart form utama ... 29
Gambar 4.4 Flowchart menu file ... 31
Gambar 4.5 Flowchart menu edit ... 32
Gambar 4.6 Flowchart menu view ... 33
Gambar 4.7 Flowchart menu search ... 35
Gambar 4.8 Flowchart menu tools ... 36
Gambar 4.9 Flowchart menu documents ... 37
Gambar 4.10 Flowchart menu help ... 38
Gambar 4.11 Rancangan text editor pendteksi buffer overflow ... 39
Gambar 5.1 Tampilan pendeteksian untuk file abo1.c ... 44
Gambar 5.2 Input data 264 byte ke abo1.c ... 45
xiii
Gamabr 5.4 Exploit untuk abo1 ... 46
Gambar 5.5 Tampilan pendeteksian untuk file abo2.c ... 47
Gambar 5.6 Input data 264 byte ke abo2 ... 48
Gambar 5.7 Tampilan pendeteksian untuk file abo3.c ... 49
Gambar 5.8 Input data 264 byte ke abo3 ... 49
Gambar 5.9 Letak address fungsi fn() ... 50
Gambar 5.10 Tampilan pendeteksian untuk file abo4.c ... 51
Gambar 5.11 Letak fn() dalam stack ... 51
Gambar 5.12 Tampilan pendeteksian untuk file vulnerable_1.c ... 52
Gambar 5.13 Tampilan pendeteksian untuk file notvulnerable_1.c ... 53
Gambar 5.14 Input data 1008 byte ke vulnerable_1 ... 54
Gambar 5.15 Input data 1008 byte ke notvulnerable_1 ... 54
Gambar 5.16 Disassembler main ... 55
Gambar 5.17 Disassembler evilfunction ... 56
Gambar 5.18 Input data 1008 byte kedalam program vulnerable_1 ... 56
Gambar 5.19 Tampilan return address yang tertimpa ... 57
Gambar 5.20 Tampilan letak register EAX ... 57
Gambar 5.21 Object dump vulnerable_1 ... 58
Gambar 5.22 Buffer sebelum dieksploitasi ... 59
Gambar 5.23 Buffer setelah dieksploitasi ... 59
1 BAB I PENDAHULUAN
A. Latar Belakang
Memori adalah pusat kegiatan pada sebuah komputer, karena setiap proses
yang akan dijalankan harus melalui memori terlebih dahulu. CPU mengambil
instruksi dari memori sesuai yang ada pada program counter.1 Pada saat program
dijalankan, variabel datanya disimpan di dalam memori yang disebut buffer, buffer ini jika terisi dengan data yang ukurannya melebihi kapasitasnya, akan mengisi
alamat memori lain yang bukan milik variabel tersebut, keadaan inilah yang
dinamakan buffer overflow.
Buffer overflow umumnya terjadi karena cacat pemrograman yang memungkinkan lebih banyak data ditulis kedalam buffer melebihi dari buffer yang didesain. Buffer overflow seringkali dieksploitasi dengan mengirimkan input-input yang sengaja dirancang untuk memicu keadaan buffer overflow tersebut. Akibatnya,
memori disekitar buffer tertimpa, tetapi yang membuat ini merusak adalah input-input tersebut juga dirancang sedemikian rupa sehingga saat terjadi buffer overflow,
maka proses tersebut akan berkelakuan seperti yang diinginkan oleh 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 penyerang.
1 Masyarakat Digital Gotong Royong. 2006.
2
Perkembangan perangkat lunak yang semakin pesat ternyata juga
menimbulkan resiko keamanan yang besar, hal tersebut dapat dilihat dari kerentanan
yang terus muncul dalam perangkat lunak. Menurut laporan CERT/CC, buffer overflow merupakan penyebab dari 50% bug keamanan yang dilaporkan dan dijadikan advisori oleh CERT/CC. Lebih jauh lagi, riset yang dilakukan oleh Crispin
Cowan dan kawan-kawan, menemukan bahwa buffer overflow merupakan vulnerability of the decade.2
Bahasa pemrograman yang rentan dengan masalah ini adalah bahasa C/ C++,
hal itu disebabkan karena C/ C++ mengakses memori secara langsung sehingga
rentan terhadap buffer overflow dan serangan string. Dalam bahasa C/ C++ mekanisme cek batas buffer tidak dibuilt-in, sehingga tugas tersebut menjadi tugas
dari programmer.
Dengan adanya kerentanan tersebut serta bahaya yang ditimbulkan maka
seharusnya ada pencegahan sebelum terjadinya kerentanan tersebut, sebagaimana
firman Allah dalam Al-qur’an surah Ali Imran ayat 104 :
Terjemahnya:Dan hendaklah ada di antara kamu segolongan umat yang menyeru kepada kebajikan, menyuruh kepada yang ma'ruf dan mencegah dari yang munkar, merekalah orang-orang yang beruntung (Q.S Ali Imran (3);104).3
2
Janner Simarmata. 2006. Pengamanan Sistem Komputer. (Ed. I, Yogyakarta: ANDI), h. 162
3
Ayat tersebut menegaskan untuk menyeru kepada kebaikan dan mencegah
dari kemungkaran atau kehancuran, Ayat tersebut berkaitan dengan tulisan ini untuk
melakukan pencegahan terhadap kerentanan dalam kode program, serta memberikan
alternatif untuk mencegah terjadinya buffer overflow.
Beberapa pendekatan telah dilakukan untuk mencegah masalah buffer overflow, salah satunya dengan menggunakan pendekatan dari sudut pandang kompiler yang merubah cara kompile program, sehingga perlindungan terhadap
buffer overflow dilakukan secara otomatis yaitu kompiler menambahkan kode untuk melacak ukuran buffer dan memeriksa setiap akses buffer sesuai dengan ukuran yang
dialokasikan, namun hal itu membuat ukuran kode dan waktu eksekusi meningkat.
Berdasarkan masalah tersebut diatas, tulisan ini akan membahas metode
pencegahan buffer overflow dengan pendekatan secure programming yang diterapkan dalam alat analisis kode sumber program yang dirancang untuk
mendeteksi kemungkinan terjadinya buffer overflow.
B. Rumusan Masalah
Berdasar latar belakang yang dimaksudkan di atas, maka dapat dirumuskan
permasalahan yaitu bagaimana mencegah Buffer Overflow dengan menggunakan pendekatan secure programming ?
C. Batasan masalah
Pembahasan dalam penulisan ini memiliki batasan-batasan sebagai berikut:
4
2. File yang dianalisa dalam bentuk format .c, .cpp, dan .h
D. Pengertian judul
Untuk menghindari salah pengertian atas judul ataupun makna yang
terkandung pada judul skripsi ini, maka dijelaskan beberapa istilah dalam judul
skripsi ini.
1. Secure programming adalah praktek pengembangan software dimana
perhatian dan perencanaan diberikan untuk memproduksi aplikasi handal dan kuat
yang beroperasi dengan aman.4
2. Mencegah adalah menegahkan; menahan (menolak dsb); merintangi
(melarang dsb); mengikhtiarkan supaya jangan (terjadi dsb).5
3. Buffer overflow adalah sebuah kondisi yang terjadi ketika sebuah program sedang dipaksa untuk menulis data di luar akhir alokasi buffer memori.6
E. Tujuan dan Manfaat Penelitian 1. Tujuan penelitian
Mengembangkan sistem untuk menampilkan informasi mengenai kesalahan
kode program yang memungkinkan terjadinya buffer overflow.
4
Secure Programming Techniques Workshop. 2002. http://www.iaps.com/secure-programming.html
5
W.J.S Poerwadarminta. 2003. Kamus Umum Bahasa Indonesia.(Ed. III Jakarta: Balai Pustaka). h. 220
6
2. Manfaat penelitian
Hasil dari penelitian ini diharapkan dapat bermanfaat bagi programmer agar
lebih berhati-hati dalam menulis source code program serta memahami karakteristik
bahasa pemrograman yang digunakan.
F. Sistematika Penulisan
1. BAB I PENDAHULUAN merupakan pendahuluan yang membahas latar belakang, tujuan, rumusan dan batasan masalah, pengertian judul serta sistematika
penulisan.
2. BAB II TINJAUAN PUSTAKA berisi pembahasan yang memuat landasan teori dan tinjauan pustaka yang digunakan untuk membangun sistem ini.
3. BAB III METODE PENELITIAN membahas tentang gambaran umum penelitian, metode penelitian, jadwal penelitian.
4. BAB IV PERANCANGAN SISTEM membahas perancangan sistem. Pada bab ini dibahas tentang rancangan input, analisis, serta rancangan output.
5. BAB V IMPLEMENTASI Dan PENGUJIAN SISTEM berisi tentang implementasi dan pengujian program. Dalam hal ini akan dibahas metode pengujian
program serta hasil dari pengujian sistem.
6 BAB II
TINJAUAN PUSTAKA
A. Memori
Memori merupakan bagian komputer yang bertugas untuk menyimpan data,
memori komputer berisi milyaran sirkuit memori yang bertindak sebagai 0 dan 1,
program dapat memerintahkan komputer untuk menyatakan 0 dan 1 pada sirkuit
tersebut dan dapat pula meminta data yang berada di sirkuit-sirkuit tersebut. Dari
sirkuit-sirkuit memori tersebut dikodekan menjadi beragam tipe data.
1. Model Memori
Prosesor dalam mengakses memori menggunakan salah satu dari tiga
model memori berikut:
a. Flat Memory, dalam model ini, memori dilihat oleh program sebagai alamat, yang disebut ruang alamat linier. Semua kode, data, dan stack yang
terkandung dalam ruang alamat tunggal serta setiap lokasi beralamat di ruang
memori yang disebut alamat linear.
b. Segmented Memory, memori dilihat oleh program sebagai kelompok ruang alamat independen yang disebut segmen. Biasanya, kode, data dan stack yang
terkandung dalam segmen terpisah. Untuk mengatasi byte dalam segmen, program
akan menggunakan alamat logis. Alamat logis terdiri dari pemilih segmen dan
offset. Pemilih segmen mengidentifikasi segmen yang akan diakses sementara
dipetakan ke ruang alamat linier prosesor dan itu adalah tanggung jawab prosesor
untuk menerjemahkan setiap alamat logis ke alamat linier masing-masing.
c. Real-Address Memory Model, Ini adalah memori prosesor Intel model 8086 disediakan untuk mendukung kompatibilitas dengan program yang ada
yang ditulis untuk berjalan di prosesor Intel 8086.
Gambar 2.1 Tiga model manajemen memori7
2. Memori dan Pengalamatan
Bahasa C menyediakan tiga cara yang berbeda dalam mengalokasikan
memori untuk objek yaitu:
8
a. Alokasi memori statis yaitu ruang untuk objek disediakan dalam biner pada saat kompilasi program, objek tersimpan di dalam memori selama objek
yang mengandung biner masih tersimpan di dalamnya.
b. Alokasi memori otomatis yaitu objek sementara dapat disimpan di dalam stack, dan ruang ini secara otomatis dibebaskan sehingga dapat digunakan
kembali setelah blok dimana objek dideklarasikan telah digunakan.
c. Alokasi memori dinamis yaitu blok memori dengan ukuran bebas dapat diminta saat run time dengan menggunakan fungsi pustaka seperti malloc dari daerah memori yang disebut tumpukan, blok ini bertahan sampai dibebaskan untuk
digunakan kembali dengan memanggil fungsi library free .
3. Segmentasi Memori Program
Proses dipandang dari sudut manajemen memori terbagi tiga yaitu:
a. Text, segmen ini sifatnya read only karena tidak digunakan untuk menyimpan variabel tetapi kode program, Sehingga untuk menuliskan data ke
bagian ini dapat menyebabkan kesalahan. Keuntungan dari segmen ini menjadi read
only adalah bahwa hal itu dapat dibagi antara salinan yang berbeda dari program, yang memungkinkan eksekusi beberapa program pada saat yang sama tanpa masalah.
Segmen memori ini memiliki ukuran tetap, karena tidak pernah ada perubahan di
dalamnya.
b. Data, digunakan untuk menyimpan program variabel statis dan variabel global, baik yang telah diinisialisasi maupun yang belum. Segmen data diisi
program, meskipun segmen tersebut dapat ditulis, namun memiliki ukuran yang
tetap.
c. Stack, yang dapat dialokasikan secara dinamis, biasanya dimanfaatkan untuk menyimpan variabel lokal maupun untuk melewatkan parameter
fungsi. Pengaksesan data kebagian stack menggunakan metode LIFO (Last In First
Out), buffer yang ada dalam bahasa C diimplementasikan sebagai array. Array dapat dibedakan kedalam dua jenis berdasarkan metode pengalokasiannya, yaitu array
statis dan array dinamis. Array statis dialokasikan dibagian data saat program dimuat
ke memori, sedangkan array dinamis dialokasikan di dalam stack saat runtime.
Beberapa hal yang berkaitan dengan stack pada prosesor Intel adalah :
1) Penggunaan metode big endian dalam mengorganisasikan sistem memori. Di sini MSB (Most Significant Bit) terletak pada alamat memori yang lebih
kecil dibandingkan LSB (Least Significant Bit).
2) Penambahan besar stack dilakukan kearah alamat memori yang lebih
kecil. Di sini posisi bawah dari stack mempunyai alamat yang tetap. Posisi atas stack
yang alamat memorinya lebih kecil dari posisi bawah selalu berubah.
3) Register stack pointer (SP) selalu menunjuk ke posisi atas dari stack.
4) 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
10
Text (code) segment
Data segment
bss segment Low addresses
High addresses
Heap segment
the heap grows down toward higher memory addresses
the stack grows up toward lower memory addresses
Stack segment
Gambar 2.2 proses memori.8
Stackframe merupakan kondisi yang terjadi jika prosedur dipanggil
pada saat proses di memori. Stackframe ini dibuat ketika prosedur dipanggil
dan akan dihapus dari stack setelah prosedur telah selesai, stackframe berisi
variabel lokal dari prosedur dan semua informasi yang diperlukan untuk
mengembalikan stackframe sebelumnya. Eksekusi program kedalam memori
terlihat seperti gambar 2.3.
8
int a[10]={0,1,2,3,4,5,6,7,8,9}; int b[10];
void main() {
int i;
static int k=3; for(i=0;i<10;i++) { printf(“%d\n”,a[i]); b[i]=k*a[i];
} }
Source Code Program
Physical Memory
Code for printf()
Code for top of for loop
Code for call to printf() Code for b[i]=k*a[i]
Array a[]
Array b[]
Variabel k
Gambar 2.3 penempatan source code kedalam memori pada waktu dieksekusi 9 4. Operasi Stack
Stack merupakan bagian memori yang digunakan sebagai tempat
penyimpanan sementara sebuah nilai oleh register.
Tujuan utama stack adalah membuat penggunaan fungsi lebih efisien. Dari
perspektif tingkat rendah, fungsi merubah aliran kontrol program, sehingga instruksi
atau sekelompok instruksi dapat dieksekusi secara independen dari sisa program.
Lebih penting lagi ketika sebuah fungsi telah selesai melaksanakan instruksi, fungsi
9Fransitek Franek,
12
tersebut kembali ke kontrol fungsi asli pemanggilnya. Register yang terkait dalam
operasi stack yaitu:
a. Stack segmen (SS), stack ini diimplementasikan dalam memori, sebuah sistem dapat mempunyai sejumlah stack yang hanya dibatasi oleh jumlah
maksimum segmen.
b. Stack pointer (SP), register ini berisi alamat data yang akan dipindahkan dari stack, register ini menunjuk bagian teratas dari stack yang diproses
dengan operasi push untuk memasukkan nilai kedalam stack dan pop untuk mengambil nilai dari stack, subrutin call dan return, serta operasi interupt.
c. Base pointer (BP), register ini digunakan untuk mengakses elemen pada stack yang berhubungan dengan fixed point stack (point tertentu pada stack).
Gambar 2.4 stack layout10
B. Buffer Overflow
Salah satu masalah keamanan terbesar dalam program C/C++ adalah buffer overflow, masalah lain dengan C/C++ adalah bahwa programmer harus melakukan sendiri manajemen memori seperti penggunaan malloc(), alloc(), free(), new dan
delete. Jika berhasil melakukan perbaikan cacat keamanan, masalah dapat bertambah
serius ketika program tidak menentu yang menyebabkan penggunaan memori
berlebih sehingga dapat terjadi crash atau eksploitasi.
Pada bulan November 1988, worm Morris menyerang mesin VAX dan Sun
dan mencegah sejumlah besar pengguna untuk mengakses internet, pada bulan Juli
2001 worm Code Red berhasil mengeksploit lebih dari 300.000 komputer yang
menggunakan Microsoft IIS Web Server. Pada bulan Januari 2003 worm lain yaitu
Slammer menyerang Microsoft SQL Server 2000 melumpuhkan bagian internet di
Korea Selatan dan Jepang, memutuskan sistem telepon di Finlandia, dan
memperlambat jaringan AS untuk reservasi maskapai penerbangan, serta transaksi
kartu kredit.
Masalah buffer overflow terjadi pada sejumlah besar aplikasi dan mempengaruhi semua sistem operasi. Satu-satunya cara untuk mengetahui dengan
pasti apakah sebuah aplikasi akan bisa tahan terhadap serangan buffer overflow adalah dengan melakukan review terhadap source code.11
11 Chris brenton, cameron hunt. 2005. Diterjemahkan oleh Jhoni hidayat.
14
1. Stack buffer overflow
Ketika sebuah program dijalankan, alamat instruksi selanjutnya disimpan di
dalam stack. Stack buffer overflow terjadi ketika sebuah buffer yang dideklarasikan pada stack tertimpa oleh data yang lebih besar dari buffer, variabel yang dideklarasikan pada stack terletak di sebelah alamat kembali untuk fungsi yang di
panggil.
Pada saat pemanggilan fungsi untuk pertama kali, stack frame akan terlihat
seperti gambar 2.5.
Gambar 2.5 stack frame12
Stack buffer overflow dieksploitasi oleh penyerang untuk mengeksekusi beberapa kode dalam proses yang berjalan di memori, hal itu dilakukan dengan
menempatkan kode di buffer untuk memodifikasi return address (ret) agar menunjuk
ke awal area dimana kode eksploit tersebut di letakkan, seperti yang terlihat pada
gambar 2.6.
12
Pada saat return address dirubah penyerang, biasanya kode diarahkan untuk
mengeksekusi shell di dalam memori, kode kemudian dieksekusi di dalam
pemanggilan proses dan akan mewarisi seluruh struktur proses (pid,uid), inilah yang
menjadi alasan mengapa program yang pemiliknya adalah root pengaturan set uid bit
sangat penting, karena kode disisipkan kemudian akan dieksekusi dengan uid set ke
root, maka penyerang akan mendapatkan root shell dan ini berarti bahwa penyerang
akan mendapatkan kontrol penuh dari mesin target.
Gambar 2.6 stack buffer overflow untuk menjalankan shell code13
16
2. Heap overflow
Ketika sebuah program mendapatkan jumlah data yang besar untuk diproses,
bagian dari memori yaitu heap dialokasikan untuk menghandle data yang diload, jika
data yang diload lebih besar dari heap memori, maka sistem dapat crash.
Heap overflow merupakan jenis buffer overflow yang terjadi pada tumpukan area data, heap overflow dieksploitasi dengan cara yang berbeda dengan stack buffer overflow. Memori di heap dialokasikan secara dinamis oleh aplikasi pada saat run-time.
Eksploitasi dilakukan dengan merusak data ini dalam cara yang spesifik
untuk menyebabkan aplikasi untuk menimpa struktur internal seperti pointer linked
list. Teknik tumpukan kanonik overflow menimpa keterkaitan alokasi memori dinamis (seperti metadata malloc) dan menggunakan pertukaran pointer untuk
menimpa pointer fungsi program, gambar 2.7 dan gambar 2.8, merupakan contoh
sebelum dan sesudah terjadinya heap overflow.14
Gambar 2.7 heap sebelum overflow
14
Gambar 2.8 heap setelah overflow
3. Format string attack
Format string attack terjadi ketika input string dianggap perintah oleh program, dengan cara tersebut penyerang dapat mengeksekusi kode, membaca stack atau menyebabkan segmentation fault pada aplikasi yang dijalankan. Jika parameter format fungsi seperti %x digunakan dengan tidak tepat, String dibaca dari sebuah
sumber yang tidak dipercaya dan isinya dikendalikan oleh penyerang. Dengan
termasuk format khusus seperti "n%" dalam format string, penyerang dapat
memodifikasi isi printf () untuk menulis ke lokasi memori sewenang-wenang.
Dibawah ini beberapa format parameter yang dapat digunakan dan
konsekuensinya:
a. "%x" membaca data dari stack
b. "%s" membaca karakter string dari proses memori
c. "%n" menulis sebuah integer ke lokasi di dalam proses memori
Untuk menjaga aplikasi tersebut tidak rentan terhadap jenis serangan ini,
18
Tabel 2.1 Parameter yang umumnya digunakan untuk format string attack15
Parameters Output Passed as
%% % character (literal) Reference
%p External representation of a pointer to void Reference
%d Decimal Value
%c Character
%u Unsigned decimal Value
%x Hexadecimal Value
%s String References
%n Writes the number of characters into a pointer References
Kerentanan ini berbeda dari kebanyakan yang ditemui, karena tidak
diidentifikasi sebagai kerentanan sampai akhir 2000. Jenis kode ini sangat umum
dalam program C, termasuk yang dengan catatan keamanan yang dinyatakan baik.
Generasi programmer telah menggunakan sebagian kecil cara seperti ini, bukan yang
tepat printf ("% s", s). Ini dianggap sebuah trik berbahaya untuk menghindari
mengetik l karakter tambahan.
Bug ini relatif mudah untuk ditemukan, bahkan melalui pemeriksaan manual
pada kode sumber. Kasus yang membuat deteksi lebih rumit adalah ketika program
menggunakan fungsi format kustom sebagai pembungkus sekitar printf(). Hal ini
sering dilakukan dalam fungsi debugging dan logging, yang perlu mencetak
15
informasi tambahan sebelum peringatan atau pesan kesalahan. Setiap panggilan ke
fungsi kustom ini harus diperiksa seperti panggilan ke fungsi printf .
4. Array index error
Integer dibaca dari sebuah sumber yang tidak dipercaya dan nilainya
dikendalikan oleh penyerang. Program ini memvalidasi integer dengan memastikan
itu kurang dari ukuran array dan kemudian menggunakannya sebagai indeks array.
Penyerang dapat memasukkan nilai negatif, sebuah indeks array negatif memberikan
penyerang kemampuan untuk menulis ke lokasi memori yang sewenang-wenang,
asalkan memiliki alamat memori lebih rendah dari array.
C. Secure Programming
Karena buffer overflow merupakan kerentanan yang serius dalam keamanan komputer, banyak ilmuwan komputer telah bekerja untuk memcahkan masalah
tersebut. Beberapa cara untuk mengantisipasi kerentanan buffer overflow yaitu:
1. Menetapkan Gaya Pengkodean
Pada pengembangan perangkat lunak yang dikerjakan secara berkelompok,
perlu adanya penetapan gaya koding untuk mendapatkan kode akhir yang konsisten
dan sederhana, sehingga memudahkan pada saat pengecekan kesalahan koding.
2. Input Validation
Beberapa input datangnya dari user, sehingga input tersebut harus divalidasi
sebelum digunakan yaitu menolak input yang tidak sesuai dengan yang didefinisikan.
20
a. Mengasumsikan Semua Input Tidak Aman
Input yang datang dari luar tidak dipercaya aman,sehingga perlu dilakukan
otentikasi sebelum input diterima.
b. Membatasi Nilai Maksimum dan Minimum.
Ketika input data tidak dibatasi maksimum dan minimumnya, maka dapat
menyebabkan kesalahan dalam proses nilai yang diinputkan, nilai yang didefinisikan
sebagai bilangan bulat positif dapat menjadi negatif ketika melewati batas
maksimum tipe datanya.
3. Buffer Non-Executable
Konsepnya adalah membuat segmen data sebuah program tidak dapat
dieksekusi (non-executable). Dengan menjadikannya tidak dapat dieksekusi maka
dapat menyulitkan 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 Windows teknik ini tidak digunakan, karena keduanya
tergantung pada kemampuan memasukkan kode dinamis ke dalam segemen data
program untuk mendukung berbagai optimisasi kinerja.
4. Array Bounds Checking
Meskipun memasukkan kode adalah sebuah tindakan opsional bagi serangan
buffer overflow, pengkorupsian aliran kendali merupakan hal yang penting. Dengan menggunkan metode array bound checking akan menghentikan vulnerability dan
tersebut tidak dapat digunkan untuk merubah program yang terletak di alamat
memori berikutnya.
Untuk mengimplementasikan metode ini, semua pembacaan dan penulisan ke
array harus diperiksa untuk memastikan bahwa mereka tidak melampaui batasan
array.
5. Code Pointer Integrity Checking
Tujuan dari metode ini agak berbeda dengan bounds checking. Code pointer
integrity checking berusaha mencegah perubahan kode pointer, metode tersebut berusaha mendeteksi bahwa sebuah kode pointer telah dirubah sebelum ia
dideferensikan. Jadi meskipun penyerang sukses dalam merubah kode pointer, kode
pointer yang terubah tidak akan digunakan karena perubahan terdeteksi setiap saat
sebelum digunakan.
D. Kajian Pustaka
Pendeteksian buffer overflow dapat dilakukan dengan metode binary scanning yaitu dengan mengkompile kode program menjadi binary kemudian mendissassembler binary untuk selanjutnya memeriksa hasil dissassembler tersebut16. Pendeteksian dengan metode tersebut melakukan pendeteksian pada kode
biner dan digunakan pada saat kode program selesai dikompile.
Jiang Zheng dari Universitas Pittsburgh membahas teknik pencegahan buffer
overflow dengan menggunakan analisis kode statis dan analisis kode dinamis melalui pendekatan automatic signature generation dan pendekatan automatic patch
22
generation17. Dalam penelitiannya diterapkan tiga langkah analisis yang meliputi analisis perulangan, analisis batas, dan analisis input. Analisis batas digunakan untuk
memberikan informasi mengenai ukuran buffer tujuan, analisis perulangan digunakan untuk menginformasikan jumlah data yang diimplementasikan
programmer kedalam prosedur, analisis input digunakan untuk mengetahui
bagaimana keterkaitan antara input dari pengguna dengan ukuran buffer tujuan dan jumlah data yang ditulis.
Dalam penelitian ini dibahas pencegahan buffer overflow dengan menggunakan analisis kode statis, pendeteksi buffer overflow dalam bentuk text editor yang menampilkan informasi jika terdapat kerentanan yang memungkinkan
terjadinya buffer overflow dalam kode program.
23 BAB III
METODE PENELITIAN
A. Gambaran Umum Penelitian
Pada penelitian ini yang diteliti adalah kerentanan source code program yang dapat mengakibatkan terjadinya buffer overflow.
B. Metode Penelitian
1. Library research atau penelitian kepustakaan yaitu cara mengumpulkan data dengan jalan mempelajari literatur, artikel, buku ataupun kepustakaan lainnya serta
mengutip pendapat-pendapat para ahli dari buku-buku bacaan yang ada kaitannya
dengan pembahasan penelitian ini.
2. Field research atau penelitian lapangan yaitu mengumpulkan data dengan melakukan penelitian secara langsung untuk memperoleh data yang di butuhkan.
Dalam hal ini penulis menggunakan metode observasi , yaitu pengamatan langsung
ke objek penelitian guna memperoleh data atau gambaran serta keterangan yang
terkait dengan penelitian ini.
C. Jenis Penelitian
Dalam penelitian ini, jenis penelitian yang digunakan adalah penelitian
kualitatif. Penelitian kualitatif dilakukan untuk mengetahui apakah sistem yang
24
D. Tahapan Penelitian
Tahapan yang dilakukan dalam kegiatan penelitian :
1. Pengumpulan Data
Mengumpulkan data-data yang diperlukan untuk merancang dan membangun
sistem dengan menggunakan teknik pengumpulan data yang telah dijelaskan
sebelumnya.
2. Pengolahan dan analisis data
Pengolahan dan analisis data yang dilakukan dengan menggunakan data-data
yang diperoleh dari proses pengumpulan data.
3. Perancangan
Dilakukan perancangan aplikasi, perancangan input, perancangan output.
4. Implementasi dan pengujian
Setelah dilakukan perancangan sistem, kemudian dilakukan
pengimplementasian, kemudian program akan dicoba dengan teknik black box yaitu
dengan menguji kebenaran sistem pendeteksi, cara pengujiannya yaitu memasukkan
rancangan input yang terdiri dari source code aman dan source code yang rentan kedalam program kemudian akan ditampilkan informasi dari kode sumber yang
25 BAB IV
PERANCANGAN SISTEM
A. Rancangan Pendeteksi Buffer Overflow
Dalam proses pembuatan perangkat lunak, perancangan ini menambahkan security knowledge di dalamnya yaitu metode untuk menghindari beberapa kesalahan dalam penulisan kode program serta penggunaan library, flowchart perancangan pendeteksi buffer overflow tersebut terlihat pada gambar 4.1.
start
Source code program
If terdeteksi memungkinkan buffer
overflow
stop
Peringatan buffer overflow
Y
T
Gambar 4.1 Flowchart perancangan pendeteksi buffer overflow
Perancangan pendeteksi buffer overflow pada gambar 4.1 terdiri dari tiga bagian
26
1. Source code
Source code berupa kode program C/C++ yang dijadikan sebagai data untuk dideteksi dengan menggunakan pendeteksi ini, selanjutnya source code kemudian diproses oleh pendeteksi buffer overflow.
2. Pendeteksi Buffer Overflow
Pendeteksi ini bekerja dengan menggunakan metode analisis leksikal untuk
mendeteksi buffer overflow yaitu dengan mencari fungsi-fungsi berbahaya yang terdapat dalam source code, pendeteksi ini juga mendeteksi kerentanan dalam penggunaan array yang dapat melewati batas ukuran array.
3. Peringatan Buffer Overflow
Peringatan ini merupakan hasil dari pendeteksi buffer overflow yang akan muncul jika kode program rentan terhadap buffer overflow, selain menampilkan peringatan letak kode program yang rawan buffer overflow, akan ditampilkan juga solusi yang berupa fungsi-fungsi alternatif yang tidak rentan buffer overflow dalam bahasa C/C++.
B. Rancangan Aplikasi
Beberapa kompiler C/C++ menyediakan teks editor sebagai tempat
untuk menulis kode program yang akan dikompile dan dieksekusi. Pada saat
kode program dikompile, maka akan muncul peringatan jika di dalam kode
program masih ada kesalahan sintaks, proses kompiler tersebut terlihat pada
start
Source code program
Kompiler (pendeteksi sintaks error)
stop
Peringatan error
Y
T
run
Gambar 4.2 Proses kompilasi kode program
Perbandingan cara kerja pendeteksi buffer overflow dengan cara kerja kompiler yaitu kompiler mendeteksi kesalahan sintaks kemudian menampilkan pesan
dan letak error dari source code, sedangkan pendeteksi buffer overflow bekerja dengan cara mendeteksi kerentanan yang memungkinkan terjadinya buffer overflow dengan menampilkan pesan atau solusi dari source code.
Flowchart aplikasi text editor yang dirancang terdiri dari beberapa
menu dalam form utama. Form utama merupakan form yang pertama muncul
pada saat aplikasi dibuka, rancangan form utama terlihat pada gambar 4.3,
form utama terdiri dari:
1. Menubar
Menu dalam menubar merupakan kumpulan perintah yang dapat
28
2. Toolbar
Toolbar berisi subset dari perintah yang ada dalam menubar
3. Display area
Display area berisi file yang akan diedit
4. Statusbar
Statusbar berisi tentang informasi serta posisi kursor dari file yang
sedang aktif.
5. Side pane
Side pane berisi list dari dokumen dalam direktori yang aktif.
6. Bottom pane
Bottom pane berisi informasi hasil dari aksi terhadap file yang aktif.
Menubar yang merupakan kumpulan perintah terdiri dari beberapa menu
yaitu:
a. Menu file
Untuk membuat dokumen baru dipilih new, sehingga aplikasi
menampilkan dokumen baru di window teks editor. Untuk membuka file
dipilih open sehingga menampilkan open dialog yang berisi list file dalam
path yang dibuka. Aplikasi merekam path dan nama file dari lima file yang
terakhir dibuka untuk disimpan dalam recent document. Rancangan menu file
start File Edit View Search Tools Documents Help If file If edit If view If search If tools If documents Y T Y T T T T Y Y Y Stop T Y Menu file Menu search Menu tools If exit Menu edit Menu view Y T If help Menu documents Menu help Y T
30 start Menu file New file If new If open If save If close Exit Stop Open file Save
If save as Save as
Revert Y Y T T Close Y Y T T Y Y Y T T T If revert
If print preview Print preview
If print If recent document Print Recent document Y T Y T Y T
b. Menu edit
Menu edit yaitu menu yang terdiri dari beberapa perintah yang
berkaitan dengan perubahan file. Rancangan menu edit terlihat pada gambar
4.5 yang terdiri dari perintah undo, redo, cut, copy, paste, select all, dan
preferences. Preferences merupakan perintah yang mengatur tab, auto save,
dan auto indent.
start Menu edit Undo If undo If redo If cut Return Redo Cut
If copy Copy
Paste Y Y T T Y Y T T Y Y Y T T T If paste
If delete Delete
If select all
If preferences Select all preferences Y T Y T
32
c. Menu view
Menu view berisi perintah yang berkaitan dengan tampilan dalam
aplikasi, yang terdiri dari toolbar, statusbar, sidepane, buttonpane, full screen,
dan highlight mode. Sintaks dengan mode highlight membuat kode program
lebih gampang dibaca yaitu dengan warna yang berbeda pada kode program
yang terlihat berbeda antara komentar, variabel, dengan pemilihan warna
yang dapat disesuaikan dengan daftar warna yang disediakan aplikasi.
Rancangan menu view terlihat pada gambar 4.6.
start Menu view Toolbar If toolbar If statusbar If sidepane Return Statusbar Sidepane
If buttonpane Buttonpane
fullscreen Y Y T T Y T Y Y Y T T T If fullscreen If highlight
mode Highlight mode
d. Menu search
Menu search berisi perintah yang berkaitan dengan proses pencarian teks
dalam dokumen, isi menu search yaitu: find, find next, find previous,
incremental search, replace, clear highlight, dan goto line. Dalam menu ini
terdapat dua cara untuk melakukan pencarian yaitu dengan mengetikkan teks
yang akan dicari didalam form dialog, atau dengan melakukan pencarian
incremental yang mencocokkan highlight teks yang diketikkan. Rancangan
menu search terlihat pada gambar 4.7.
start
Menu search
Find If find
If find next
If find previous
Return
Find next
Find previous
If incremental
search Incremental search
Replace Y Y T T Y T Y Y Y T T T If replace If clear
highlight Clear highlight
If goto line Goto line
Y T
Y T
34
e. Menu tools
Menu tools berisi perintah untuk mendeteksi kemungkinan terjadinya
buffer overflow dalam kode program, pendeteksian dapat dilakukan pada file yang sedang aktif atau untuk mendeteksi seluruh isi directori dari file yang
sedang aktif. Menu tools juga berisi perintah untuk mengkompile kode
program dengan menggunakan gcc sebagai kompilernya. Rancangan menu
tools terlihat pada gambar 4.8.
start
Menu tools
If external tools If detect current file
If detect all file
Return
Detect current file
Detect all file
If compile Compile
Run Y Y T T Y T Y Y T T If run If manage external tools Manage external tools Y T T Y
f. Menu documents
Dalam menu ini terdapat perintah yang dapat digunakan untuk
menyimpan seluruh dokumen yang terbuka, ataupun dapat digunakan untuk
menutup seluruh dokumen yang ada dalam editor. Rancangan menu
documents terlihat pada gambar 4.9.
start
Menu documents
Save all If save all
If close all
If previous document Return Close all Previous document If next
document Next document
Move to new window Y Y T T Y T Y Y Y T T T
If move to new window
If opened
document Opened document
36
g. Menu help
Menu help berisi perintah contents dan about, perintah contents
merupakan perintah yang menampilkan perintah dasar bahasa C, rancangan
menu help terlihat pada gambar 4.10.
start
Menu help
If contents Contents
Return
Y
T
If about About
Y
T
Gambar 4.10 flowchart menu help
Aplikasi yang dirancang berupa teks editor yang memiliki
Gambar 4.11 Rancangan teks editor pendeteksi buffer overflow
C. Rancangan Input
Input dirancang dengan menyiapkan source code yang rentan dan tidak rentan
terhadap buffer overflow.
1. abo1.c
/* abo1.c * * specially crafted to feed your brain by gera */
/* Dumb example to let you get introduced... */
int main(int argv,char **argc) { char buf[256];
strcpy(buf,argc[1]); }
Pada kode program abo1.c dideklarasikan buffer sebesar 256 byte dengan tipe
data char, kemudian perintah strcpy melakukan pengkopian string dari system
38
2. abo2.c
/* abo2.c * * specially crafted to feed your brain by [email protected] */
/* This is a tricky example to make you think * * and give you some help on the next one */
int main(int argv,char **argc) { char buf[256];
strcpy(buf,argc[1]); exit(1);
}
Pada kode program abo2.c dideklarasikan buffer sebesar 256 byte dengan tipe
data char, kemudian perintah strcpy melakukan pengkopian string dari system
kedalam buffer yang sebesar 256 byte, perintah selanjutnya yaitu exit(1), yang
merupakan perintah untuk keluar dari program.
3. abo3.c
/* abo3.c * * specially crafted to feed your brain by [email protected] */
/* This'll prepare you for The Next Step */
int main(int argv,char **argc) { extern system,puts; void (*fn)(char*)=(void(*)(char*))&system; char buf[256]; fn=(void(*)(char*))&puts; strcpy(buf,argc[1]); fn(argc[2]); exit(1); }
Pada kode program abo3.c digunakan dua string sebagai argumen, string
pertama mengkopi kedalam buffer sedangkan string kedua melakukan pencetakan ke
4. abo4.c
/* abo4.c * * specially crafted to feed your brain by [email protected] */
/* After this one, the next is just an Eureka! away */
extern system,puts;
void (*fn)(char*)=(void(*)(char*))&system;
int main(int argv,char **argc) {
char *pbuf=malloc(strlen(argc[2])+1); char buf[256]; fn=(void(*)(char*))&puts; strcpy(buf,argc[1]); strcpy(pbuf,argc[2]); fn(argc[3]); while(1); }
Pada kode program abo4.c dideklarasikan fungsi system dan puts, kemudian
pendeklarasian *pbuf sebagai buffer dinamis, dan buf dengan data sebesar 256 byte.
Selanjutnya dilakukan pengkopian data dari argc[1] ke variabel buf, kemudian
pengkopian isi argc[2] ke variabel pbuf.
5. vulnerable_1.c
// I am a vulnerable thing. #include <stdio.h>
#include <string.h>
void evilfunction(char* input) {
char buffer[1000];
strcpy(buffer, input); // Vulnerable function. }
int main(int argc, char** argv) {
evilfunction(argv[1]); return 0;
}
Pada kode program vulnerable_1.c dideklarasikan buffer sebesar 1000 byte
40
variabel input kedalam buffer yang sebesar 1000 byte, selanjutnya pada fungsi main
dilakukan pemanggilan fungsi evilfunction dengan parameter berupa input dari
sistem.
6. notvulnerable_1.c
// I am a vulnerable thing. #include <stdio.h>
#include <string.h>
void evilfunction(char* input) {
char buffer[1000];
strncpy(buffer, input, sizeof(buffer)); // Notvulnerable function.
}
int main(int argc, char** argv) {
evilfunction(argv[1]); return 0;
}
Pada kode program vulnerable_1.c dideklarasikan buffer sebesar 1000 byte
dengan tipe data char, kemudian perintah strncpy melakukan pengkopian string dari
variabel input yang disesuaikan dengan besar buffer kedalam buffer yang sebesar
1000 byte, selanjutnya pada fungsi main dilakukan pemanggilan fungsi evilfunction
dengan parameter berupa input dari sistem.
D. Rancangan Output
Setelah penginputan, maka input akan diproses untuk menampilkan
output berupa pesan peringatan yang akan menampilkan sebagai berikut:
1. Nomor kode program
2. Pesan peringatan
4. Jumlah kode program
5. Waktu yang digunakan untuk pendeteksian
6. Level kerentanan (rentang nilai 1-5)
42 BAB V
IMPLEMENTASI DAN PENGUJIAN SISTEM
Pada bab ini dibahas mengenai implementasi dan pengujian sistem,
implementasi sistem dilakukan dengan memasukkan kode rentan untuk
pendeteksian buffer overflow, setelah diimplementasikan, sistem akan diuji yaitu dengan melakukan tes terhadap source code yang diinputkan.
A. Implementasi Pendeteksi Buffer Overflow
Sistem diimplementasikan dengan menggunakan rancangan input
yang telah di rancang pada bab IV.
1. abo1.c
Pada kode program abo1.c, kerentanan terletak pada baris kode ke 9
yaitu pada penggunaan fungsi strcpy, fungsi ini tidak membatasi input
pengguna yaitu melewatkan semua data dari string sumber ke string tujuan.
Jika data melebihi dari 256 maka akan menimpa register disebelahnya,
bahkan bisa menimpa alamat kembali dari fungsi pada stack.
Gambar 5.2 Input data 264 byte ke abo1
Pada gambar 5.2 terlihat bahwa jika program diinputkan dengan data
lebih besar 256 maka menyebabkan register disebelahnya tertimpa, dan pada
saat diinputkan data sebesar 264, maka akan menimpa alamat kembali dari
fungsi. Pada saat diinputkan A sebanyak 264, dan pada gambar 5.3 terlihat
44
Gambar 5.3 Tampilan di register abo1
Gambar 5.4 Eksploit untuk abo1
Jadi penyerang dapat memasukkan shellcode kedalam program
seperti terlihat pada gambar 5.4, stack pertama dimasukkan ke return address, selanjutnya esp, dan kemudian variabel lokal buf[256]. Untuk merubah return address, buffer yang dimasukkan sebesar 256+4+4=264 byte.
Karakter terakhir yang sebesar 4 byte merupakan return address yang dapat dirubah untuk menunjuk ke shellcode.
2. abo2.c
Gambar 5.5 Tampilan pendeteksian untuk file abo2.c
Ketika program diinput data sebesar 264 byte yang menimpa return address, tidak ada pesan segmentation fault yang muncul, hal itu disebabkan karena setelah fungsi strcpy ada fungsi exit yang dipanggil seperti terlihat
46
Gambar 5.6 Input data 264 byte ke abo2
walaupun tidak ada instruksi setelah fungsi exit dipanggil, namun
penyerang dapat memasukkan panjang string yang dapat memenuhi seluruh
stack.
Pada abo3.c terdapat 2 string sebagai argumen, yang pertama
mengkopi kedalam buffer dan yang kedua menampilkan ke standar output. Pada program abo2 jika data lebih besar dari 256 byte, maka program tetap
keluar karena adanya fungsi exit, namun pada program abo3 muncul pesan
3. abo3.c
Gambar 5.7 Tampilan pendeteksian untuk file abo3.c
48
Gambar 5.9 Letak address fungsi fn()
Segementation fault muncul disebabkan karena alamat fungsi fn() dimasukkan kedalam stack sebelum buf[256] dapat ditimpa dan dieksekusi
pada alamat 0x08048493 sebelum exit(). Seperti terlihat pada gambar 5.9
letak buf[256] yang berdekatan dengan letak alamat fungsi fn().
Program abo4 hampir sama dengan abo3, yang membedakan adalah
alamat fungsi fn() tidak terletak pada stack, tetapi alamat terletak pada bagian
4. abo4.c
Gambar 5.10 Tampilan pendeteksian untuk file abo4.c
50
B. Pengujian Pendeteksi Buffer Overflow
Pengujian pendeteksi buffer overflow dilakukan dengan membandingkan
kode aman dengan kode yang tidak aman terhadap buffer overflow yaitu vulnerable_1.c dengan notvulnerable_1.c, sebelum dilakukan pengujian
terhadap program yang aman dan tidak aman, terlebih dahulu dimasukkan ke
dalam pendeteksi buffer overflow.
Gambar 5.12 Tampilan pendeteksian untuk file vulneracle_1.c
Pada gambar 5.12, terlihat pendeteksi buffer overflow mendeteksi kerentanan
pada baris ke 7 dari vulnerable_1.c yaitu penggunaan fungsi strcpy yang merupakan
fungsi dengan tidak memeriksa batas input dari string sumber ke string tujuan,
sehingga untuk menggunakannya perlu dilakukan pemeriksaan antara panjang string
sumber dengan panjang string tujuan atau dengan menggunakan fungsi lain yaitu
tujuan. Pada gambar 5.13 dilakukan pendeteksian terhadap notvulnerable_1.c yang
dirubah dari vulnerable_1.c dengan mengganti fungsi strcpy dengan fungsi strncpy.
Gambar 5.13 Tampilan pendeteksian untuk file notvulnerable.c Setelah dideteksi dengan pendeteksi buffer overflow, kode program kemudian dites dengan diinputkan data berlebih kedalam buffer. Pada vulnerable_1.c data dimasukkan sebesar 1008 byte, terlihat pada gambar 5.14
terjadi segmentation fault dan isi dari eip tertimpa dengan data 0x41414141 yang merupakan karakter A yang diinputkan berlebih kedalam buffer, sedangkan pada notvulnerable_1.c saat dimasukkan data sebesar 1008 byte
program tetap berjalan normal seperti terlihat pada gambar 5.15, hal itu
disebabkan karena pada saat menyalin data dari string sumber ke string tujuan
52
Gambar 5.14 Input data 1008 byte ke vulnerable_1
Gambar 5.15 data 1008 byte ke notvulnerable_1
Pengujian selanjutnya yaitu pengeksekusian shell melalui program
vulnerable_1 dan notvulnerable_1, karena program notvulnerable_1 return addressnya tidak tertimpa maka return address tidak mengeksekusi shell, sedangkan program vulnerable_1 dapat tertimpa return addressnya maka dapat digunakan untuk
mengeksekusi shell.
Untuk mengeksekusi shell melalui program vulnerable_1, maka dilakukan
gambar 5.16, kemudian dilakukan break point pada 0x080483f5 dan break point pada 0x08048400.
Gambar 5.16 Disassembler main
Kemudian dilakukan disassembler pada fungsi evilfunction dan menempatkan break point pada 0x080483e3 seperti pada gambar 5.17.
54
Setelah disetting semua break point, selanjutnya program dijalankan dengan input 1004 karakter A dan 4 karakter B, pada gambar 5.18. Terlihat
esp berada pada 0x080483fa.
Gambar 5.18 Input data 1008 byte ke dalam program vulnerable_1
Pada gambar 5.19, return address tertimpa, kemudian program
dilanjutkan dan terlihat eip telah tertimpa dengan karakter A (0x42).
Gambar 5.19 Tampilan return address yang tertimpa
Pada gambar 5.20, terlihat bahwa register EAX menunjuk keawal
Gambar 5.20 Tampilan letak register EAX
Pada gambar 5.21 dilakukan objek dump pada vulnerable_1, yaitu mencari
alamat dari register EAX. Dari proses objek dump terlihat pemanggilan register EAX
56
Gambar 5.21 Objek dump vulnerable_1
Setelah didapatkan return address, kemudian dibuat struktur untuk eksploitasi yaitu: NOPS*400+SC(24 byte)+NOPS*588+0x080483bf (call EAX), struktur tersebut dapat digambarkan pada gambar 5.23 yang merupakan perubahan dari struktur normalnya yaitu pada gambar 5.22.
Ket:
NOPS = Nooperation
Buffer [1000] ebp ret
Gambar 5.22 Buffer sebelum dieksploitasi
NOP[400] SC[24] NOP[588] ptr
Pointer menunjuk ke shellcode
Gambar 5.23 Buffer setelah dieksploitasi
Pada gambar 5.24, terlihat program vulnerable_1 telah dieksploitasi untuk
mengakses shell.
58
Pada tabel 5.1 terlihat hasil dari pengujian yang telah dilakukan.
Tabel 5.1 Hasil Pendeteksi Buffer Overflow
No Nama File
Level Kerentanan
Total
1 2 3 4 5
1 abo1.c 0 0 0 1 0 1
2 abo2.c 0 0 0 1 0 1
3 abo3.c 0 0 0 3 0 3
4 abo4.c 1 0 0 4 0 5
5 vulnerable_1.c 0 0 0 1 0 1
6 notvulnerable_1.c 0 0 0 0 0 0
Jumlah 1 0 0 10 0 11
Ket :
Level kerentanan yaitu tingkat kerentanan dari yang dideteksi
Jumlah kerentanan dari tiap level kerentanan
Total kerentanan pada file yang dideteksi
Pada tabel 5.1 terdapat 6 nama file yang diuji coba dengan pendeteksi buffer overflow, kemudian level kerentanan yaitu level kerentanan yang terdeteksi dengan rentang nilai 1-5, nilai tersebut berdasarkan kemungkinan terjadinya eksploitasi. File
memiliki 1 total kerentanan yaitu 1 kerentanan pada level 4, file abo3.c memiliki 3
total kerentanan yaitu 3 kerentanan pada level 4, file abo4.c memiliki 5 total
kerentanan yaitu 1 kerentanan di level 1 dan 4 kerentanan di level 4, file
vulnerable_1.c memiliki 1 total kerentanan yaitu pada level 4, dan file
60 BAB VI PENUTUP
A.Kesimpulan
Dalam penelitian ini beberapa kode program diidentifikasi, dianalisis, dan
dideteksi terhadap kerentanan buffer overflow, maka dapat disimpulkan bahwa:
1. Beberapa fungsi dalam bahasa C/C++ memiliki kerentanan untuk terjadinya
buffer overflow, kerentanan ini dapat dicegah dan perlindungan dapat ditingkatkan dengan menekankan solusi lebih pada saat penulisan kode
program.
2. Buffer overflow dapat menyebabkan aplikasi atau program yang kita buat
berkelakuan tidak semestinya, sehingga dapat dimanfaatkan untuk
menyerang sistem sehingga sistem dapat berkelakuan sesuai keinginan
penyerang.
B.Saran
Penelitian ini terfokus pada analisis leksikal yang diimplementasiakan dalam
teks editor. Penelitian selanjutnya dapat meningkatkan C / C + + editor untuk
menghindari buffer overflow sedini mungkin yaitu dengan meningkatkan fitur
DAFTAR PUSTAKA
Anley chris et al. The Shellcoder’s Handbook, Second Edition: Discovering and Exploiting Security Holes, Indiana: Wiley Publishing, Inc, 2007.
Brenton, Chris dan Cameron Hunt. Diterjemahkan oleh Jhoni Hidayat dengan Judul. Network Security. Jakarta: Elex Media Komputindo, 2005
Clark , Anthony S. Finding and Exploiting Simple Local Buffer Overflow, 2005.
Eko, Richardus Indrajit., et al. Buku Pintar Linux Pemrograman GCC, Jakarta: Elex Media Komputindo, 2002
Erickson, Jon. Hacking: The Art of Exploitation, San Francisco: No Starch Press, Inc, 2003.
Forristal, Jef dan Julie Traxler. Hack Proofing: Your Web Applications. USA: Syngress Publishing, Inc, 2001.
Foster, James C., et al. Buffer Overflow Attacks: Detect, Exploit, Prevent, USA: Syngress Publishing, Inc, 2005.
_______.Sockets, Shellcode, Porting & Coding, USA: Syngress Publishing, Inc, 2005.
_______. Writing Security Tools and Exploits, USA: Syngress Publishing, Inc, 2006.
Franek Fransitek. Memory as a Programming Concept in C and C++ . Cambridge University Press, 2004.
Hariyanto, Bambang. Struktur Data: Pondasi Membuat Program Yang Elegan dan Efisien, Bandung: Informatika, 2008.
Koziol Jack et al. The shellcoder's handbook : discovering and exploiting security holes, Indiana: Wiley Publishing, Inc.2004.
Messier, Matt dan John Viega. Secure Programming Cookbook. USA: O'Reilly & Associates, Inc, 2003.
Simarmata, Janner. Pengamanan Sistem Komputer. Yogyakarta: Andi, 2006.
Vamosi Robert. Ethical Hacking and Countermeasures. E-Council, 2008.
Wheleer, David A. Secure Programming for Linux and Unix HOWTO,
62
RIWAYAT HIDUP
Nama lengkap penulis : Suherman, lahir dan besar di
kota Soppeng Propinsi Sulawesi Selatan pada tanggal 4 Juni
1987. Anak dari Juhari. dan Harika, latar belakang pendidikan,
SD 234 Watu pada tahun 1994-2000, SMPN 1 Marioriwawo
pada tahun 2000-2003, SMAN 1 Marioriwawo pada tahun
2003-2006, dan kuliah di Universitas Islam Negeri (UIN) Alauddin Makassar pada tahun
2006-2011.
Selama kuliah UIN Alauddin kegiatan yang dilakukan di kampus adalah
pernah menjadi Laboran, Asisten Pemrograman Dasar, Pemrograman Visual,
Pemrograman WEB, serta Jaringan Komputer sejak tahun 2007-2011. Kegiatan di
luar kampus adalah sebagai anggota study club Explorasi solidaritas Mahasiswa