• Tidak ada hasil yang ditemukan

SECURE PROGRAMMING UNTUK MENCEGAH BUFFER (1)

N/A
N/A
Protected

Academic year: 2018

Membagikan "SECURE PROGRAMMING UNTUK MENCEGAH BUFFER (1)"

Copied!
75
0
0

Teks penuh

(1)

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

(2)

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.

(3)

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

(4)

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,

(5)

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

(6)

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

(7)

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

(8)

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

(9)

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

(10)

x

DAFTAR PUSTAKA ... 59 LAMPIRAN-LAMPIRAN

(11)

xi

DAFTAR TABEL

Tabel 2.1 Parameter yang umumnya digunakan untuk format string attack... 18

(12)

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

(13)

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

(14)

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.

(15)

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

(16)

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:

(17)

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

(18)

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.

(19)

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

(20)

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:

(21)

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

(22)

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

(23)

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

(24)

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,

(25)

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

(26)

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.

(27)

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

(28)

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

(29)

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

(30)

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,

(31)

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

(32)

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.

(33)

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

(34)

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

(35)

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.

(36)

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

(37)

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

(38)

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

(39)

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

(40)

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

(41)

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

(42)

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

(43)

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

(44)

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

(45)

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

(46)

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

(47)

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

(48)

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

(49)

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

(50)

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

(51)

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

(52)

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

(53)

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

(54)

4. Jumlah kode program

5. Waktu yang digunakan untuk pendeteksian

6. Level kerentanan (rentang nilai 1-5)

(55)

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

(56)

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

(57)

44

Gambar 5.3 Tampilan di register abo1

Gambar 5.4 Eksploit untuk abo1

Jadi penyerang dapat memasukkan shellcode kedalam program

(58)

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

(59)

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

(60)

3. abo3.c

Gambar 5.7 Tampilan pendeteksian untuk file abo3.c

(61)

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

(62)

4. abo4.c

Gambar 5.10 Tampilan pendeteksian untuk file abo4.c

(63)

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

(64)

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

(65)

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

(66)

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.

(67)

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

(68)

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

(69)

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

(70)

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.

(71)

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

(72)

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

(73)

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

(74)

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,

(75)

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

Gambar

Tabel 5.1 Hasil pendeteksian buffer overflow ......................................................
Gambar 2.1 Tiga model manajemen memori7
Gambar 2.2 proses memori.8
Gambar 2.3 penempatan source code kedalam memori pada waktu dieksekusi 9
+7

Referensi

Dokumen terkait