Jurusan:SistemInformasi
Semster:5(Malam)
Tugas Keamanan Komputer Part 2
Pengertian Buffer Overflow
Buffer overflow adalah sebuah kelemahan yang mudah untuk
ditemukan dan dimanfaatkan oleh hacker dalam sebuah sistem. Aplikasi dan
Operating System (OS) menyimpan untuk sementara perintah yang mereka dapat di
memori tertentu yang biasa disebut buffer memory. Kalau OS atau program tidak
bisa dikode secara sempurna maka hacker bisa membuat komputer korban jadi
terganggu dengan mengirimkan perintah yang dibuat khusus yang membuat gangguan
jadi berlangsung lebih lama. Windows 95 paling rentan kalau sudah berhadapan
dengan serangan seperti buffer overflow yang banyak dilancarkan lewat internet
ini.Saat ini serangan serupa sudah jarang dilancarkan pada sebuah komputer.
Namun terkadang hacker masih sering melakukannya untuk memperlambat kinerja
sebuah situs.
Tujuan
Tujuan dari Buffer OverFlow adalah Mengambil ahli akun root
Menggunakan Metode Buffer OverFlow
Arsitektur Serangan
Cara dan Teknik
serangan
Dalam program yang menggunakan
bahasa C, buffer dialokasikan dengan array atau pointer. C atau C++ tidak
mempunyai pengecekan otomatis (automatic bounds checking) batasan suatu buffer,
sehingga pengguna dapat menulis kode untuk memberikan data melebihi ukuran
buffer [8]. Sebagai contoh: int main () { int buffer[10]; buffer[20] = 10; }
Program di atas adalah program yang valid dan compiler dapat meng-compile tanpa
error. Tetapi program tersebut berusaha untuk memberikan data melebihi alokasi
memory untuk buffer. Hal ini dapat mengakibatkan kejadian yang tidak
diinginkan. Konsep ini digunakan para hacker untuk mengacau industri komputer.
Program yang dapat dieksekusi berisi sekumpulan instruksi biner yang harus
dieksekusi oleh processor. Instruksi ini dapat berupa read-only data, (seperti
print format strings), data global dan data statis yang tetap ada selama proses
eksekusi, dan break pointer yang selalu mengikuti malloced memory. Function
local variable adalah variabel otomatis yang ada di stack selama suatu fungsi
bekerja dan dibuang setelah fungsi selesai bekerja. Gambar 1 memperlihatkan
memory layout dari suatu proses Linux. Proses dimulai dengan kode program dan
data. Kode dan data berisi instruksi program serta data global dan data static
yang terinisialisasi maupun tak terinisialisasi. Setelah itu adalah run-time
heap (dibuat dengan malloc/calloc), dan di paling atas adalah users stack.
Stack digunakan jika ada function cal
Gambar 1. Memory layout pada
proses Linux [8].
A. Buffer overruns pada kebanyakan Web server
Webserver Apache dan IIS memiliki celah keamanan. Worm seperti Code Red (untuk IIS) dan Linux. Slapper (untuk Apache) menjadikan celah keamanan yang lebar.
B. DNS Overflow
Beberapa server DNS (BIND) sebelumnya tergolong rentan terhadap overflow. Suatu serangan yang akan memberikan nama DNS sangat panjang. Nama DNS dibatasi hingga 64-byte per subkomponen dan 256 byte secara keseluruhan.
C. Serangan DNS
Server DNS biasanya dijalankan pada mode ‘Trust’ oleh service dan user – maksudnya bahwa server DNS dapat dikompromikan agar melancarkan serangan lebih jauh pada user dan service lainnya. Hal ini menjadikan server DNS merupakan target utama serangan para hacker.
D. Mengelabui cache DNS
Serangan yang umum terhadap server DNS. Sederhananya, bekerja dengan mengirimkan suatu pertanyaan untuk meminta domain yang sesungguhnya (“siapakah www.test.com ini?) dan akan disediakan jawaban yang tentu saja salah
Webserver Apache dan IIS memiliki celah keamanan. Worm seperti Code Red (untuk IIS) dan Linux. Slapper (untuk Apache) menjadikan celah keamanan yang lebar.
B. DNS Overflow
Beberapa server DNS (BIND) sebelumnya tergolong rentan terhadap overflow. Suatu serangan yang akan memberikan nama DNS sangat panjang. Nama DNS dibatasi hingga 64-byte per subkomponen dan 256 byte secara keseluruhan.
C. Serangan DNS
Server DNS biasanya dijalankan pada mode ‘Trust’ oleh service dan user – maksudnya bahwa server DNS dapat dikompromikan agar melancarkan serangan lebih jauh pada user dan service lainnya. Hal ini menjadikan server DNS merupakan target utama serangan para hacker.
D. Mengelabui cache DNS
Serangan yang umum terhadap server DNS. Sederhananya, bekerja dengan mengirimkan suatu pertanyaan untuk meminta domain yang sesungguhnya (“siapakah www.test.com ini?) dan akan disediakan jawaban yang tentu saja salah
Efek Serangan
Pencegahan dari buffer overflowAda beberapa cara mencegah
buffer overflow, berikut ini ringkasan beberapa pendekatan tersebut:· Menulis
ulang program dalam bahasa lain. Kadang ini tidak mungkin dilakukan, terutama
jika programnya low level.
· Memakai library khusus untuk mencegah kesalahan umum (library semacam ini tidak selalu tersedia)
· Melakukan code review (tapi kadang ada bug yang terlewat)
· Memakai tools yang dapat melakukan pemeriksaan statik (kadang bug ditemukan, kadang tidak)
Untuk aplikasi jaringan, ada pendekatan lain: paket jaringan yang masuk bisa diperiksa, dan jika mengandung shellcode yang dikenal, atau mengandung banyak NOP, maka paket akan dicegah masuk. Tapi cara ini sangat tidak efektif, karena ada kemungkinan mencegah paket valid, dan ada banyak variasi shellcode yang tidak dikenal.
· Memakai library khusus untuk mencegah kesalahan umum (library semacam ini tidak selalu tersedia)
· Melakukan code review (tapi kadang ada bug yang terlewat)
· Memakai tools yang dapat melakukan pemeriksaan statik (kadang bug ditemukan, kadang tidak)
Untuk aplikasi jaringan, ada pendekatan lain: paket jaringan yang masuk bisa diperiksa, dan jika mengandung shellcode yang dikenal, atau mengandung banyak NOP, maka paket akan dicegah masuk. Tapi cara ini sangat tidak efektif, karena ada kemungkinan mencegah paket valid, dan ada banyak variasi shellcode yang tidak dikenal.
Pencegahan dari buffer overflow
Ada beberapa cara mencegah buffer overflow, berikut ini ringkasan beberapa pendekatan tersebut:
· Menulis ulang program dalam bahasa lain. Kadang ini tidak mungkin dilakukan, terutama jika programnya low level.
Ada beberapa cara mencegah buffer overflow, berikut ini ringkasan beberapa pendekatan tersebut:
· Menulis ulang program dalam bahasa lain. Kadang ini tidak mungkin dilakukan, terutama jika programnya low level.
· Memakai library khusus untuk mencegah kesalahan umum
(library semacam ini tidak selalu tersedia)
· Melakukan code review (tapi kadang ada bug yang terlewat)
· Memakai tools yang dapat melakukan pemeriksaan statik
(kadang bug ditemukan, kadang tidak)
Untuk aplikasi jaringan, ada pendekatan lain: paket jaringan
yang masuk bisa diperiksa, dan jika mengandung shellcode yang dikenal, atau
mengandung banyak NOP, maka paket akan dicegah masuk. Tapi cara ini sangat
tidak efektif, karena ada kemungkinan mencegah paket valid, dan ada banyak
variasi shellcode yang tidak dikenal.
Organisasi Memori
Pengalokasian
memori menjadi hal yang penting untuk diketahui karena ketika program selesai
di-compile menjadi bilangan biner dan kemudian dijalankan maka
masing-masing bagian seperti kode program, konstanta, data dan jenis variabel
data yang berbeda-beda akan ditempatkan pada berbagai segmentasi yang berbeda
pula didalam memori. Pembagian segmentasi alokasi memori dapat dilihat seperti
gambar
Code
Code segmentation atau juga yang dikenal dengan istilah
segmentasi teks merupakan salah satu bagian dari program dalam file objek atau
didalam memori yang berisi intruksi atau perintah –perintah pada program yang
akan dieksekusi. Didalam memori, code segmentation harus ditempatkan pada
bagian bawah segmen heap atau stack hal ini dimaksudkan
untuk menghindari terjadinya heap dan stack overflow dari overwriting program.
Selain hal itu Code segmentationjuga mempunyai sifat read
only untuk menghindari terjadinya sintruksi untuk memodifikasi program.
Karen sifat tersebut diatas maka kemungkinan terjadinya serangan pada
segmentasi ini sangat kecil.
BSS
Uninitialized data segment atau yang sering disebut
segmen bss (Block Started by Symbol) merupakan bagian dari segmen
data yang berisikan variabel dancompiler yang secara konstan dan berkala
membutuhkan nilai (value) ketika program dijalankan. Ketikabagian BSS
diinisialisasi untuk loading pertama kali maka semua variabels didalamnya akan
diberi nilai 0
Data
Initialized data segment atau yang lebih dikenal dengan
segmen data merupakan bagian dari virtual address space dari program.
Segmen data berisi variabel global dan variabel statis yang dideklarasikan
olehprogrammer. Hal yang perlu diperhatikan adalahInitialized data
segment tidak bersifat read only karena nilai dari variabel
dapat berubah saat program berada pada kondisi kondisi run time. Untuk
pembagian area, segmentasi ini dibagi lagi lebih lanjut
kedalam initialized read-only dan initialized read-write.
Stack
Deklarasi variabel didalam sebuah program dibedakan
menjadi variabel global dan variabel lokal. variabel lokal
biasanya dideklarasikan didalam satu fungsi, ini berarti variabel lokal hanya
dapat diakses oleh instruksi program didalam fungsi itu sendiri. Variabel lokal
ini ditempatkan pada stack segmentation yang bersifat sementara. Stack segmentation juga
dikenal dengan istilah last-in-first-out (LIFO). Istilah ini menggambarkan
salah satu sifat dasar dari stack : elemen yang pertama masuk ke
dalam stack akan tersimpan pada bagian bawah segment sehingga akan
diakses pada bagian akhir karena akses akan dilakukan pada bagian atas segmen
terlebih dahulu. Didalam proses penyimpanan dan akses elemen
didalam stack, dikenal 2 istilah yaitu : Push dan Pop.
Push : adalah proses penimpanan atau menambah elemen
kedalam stack. Error akan terjadi pada proses ini ketika stack
tidak dapat menyimpan elemen data lagi atau yang lebih dikenal dengan
istilah stack overflow.Pop : adalah proses pengambilan data
dari stackatau dapat juga dipandang sebagai sebuah proses menghapus elemen
dari stack. Error akan terjadi pada proses ini
jika stack kosong sehingga tidak mampu untuk mengeluarkan data apapun
atau yang biasa dikenal dengan istilah stack underflow.Heap
Heap adalah area memori yang dialokasikan secara
dinamis selama proses ekseskusi biner (dengan menggunakan fungsi yang disebut
malloc() ; memory alocation ). Heap akan menempati
sebagian atau seluruh ruang memori tersisa yang belum digunakan.Heap memiliki
struktur yang mirip dengan stack dimulai dari byte sisa terbawah
(memori terbawah di heap) dan akan berkembang ke alamat memori yang diatas
tergantung dari penggunaan alokasi alamat memori yang ditambahkan didalam.
Karena penggunaan alokasi memori heap yang bersifat dinamis maka bisa
saja alokasi memori heap penuh. Untuk menghindari hal ini perlu
dilakukan pemantauan sisa alokasi memori padaheap terlebih dahulu sebelum
memori ini dipergunakan. Pemeriksaan dapat dilakukan dengan fungsi MaxAvail,
fungsi ini memberikan ukuran blok terbesar pada Heap. Pemeriksaan ini bertujuan
supaya tidak terjadi run time error saat alokasi memori heap habis
dipergunakan sewaktu program sedang berjalan.
Pengalamatan Memori
Pengalamatan memori adalah penempatan alamat pada ruang memory pada suatu
sistem komputer. Adapun susunan ruang memory adalah 1 megabyte.
Pengaksesan data ke bagian ini menggunakan metoda yang
disebut LIFO (Last In First Out). Jenis data yang harus juga diketahui adalah
buffer yang pada bahasa C diimplementasikan sebagai array. Array dapat
dibedakan ke dalam dua jenis berdasarkan metoda pengalokasiannya, yaitu array
statis dan array dinamis. Array statis dialokasikan di bagian data saat program
dimuatkan ke memori, sedangkan array dinamis dialokasikan di dalam stack saat
run time.
Stack
Stack dapat dibayangkan sebagai sebuah blok dari memori yang dapat memuat data secara dinamis.
Beberapa hal yang harus diketahui pada prosesor Intel sehubungan dengan stack adalah :
1. Penggunaan metoda Big Edian dalam mengorganisasikan sistem memori. Di sini MSB (Most Significant Bit) terletak pada alamat memori yang lebih kecil dibandingkan LSB (Least Significant Bit).
Stack dapat dibayangkan sebagai sebuah blok dari memori yang dapat memuat data secara dinamis.
Beberapa hal yang harus diketahui pada prosesor Intel sehubungan dengan stack adalah :
1. Penggunaan metoda Big Edian 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.
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 menaikkan nilai SP sebesar 4 byte.
Blok memori dari stack ini biasanya di bagi lagi menjadi apa
yang disebut dengan stack frame. Setiap stack frame berisi data yang
berhubungan dengan pemanggilan sebuah fungsi. Biasanya posisi awal dari frame ini
akan ditunjuk oleh frame pointer (FP). Dengan bantuan FP ini, maka pengaksesan
ke variabel lokal maupun parameter fungsi dapat dilakukan menggunakan sistem
pengalamatan relatif. Pada prosesor Intel, register EBP berfungsi sebagai frame
pointer.
Program , Libraries dan Binary
Disadari atau tidak, program yang kita pergunakan sehari-hari
dibentuk dari konstata, variabel dan instruksi yang berhubungan dengan data
yang akan diproses. Instruksi biasanya dikelompokan didalam satuan unit kecil
yang disebut modul, sub rutin, methode, dan didalam bahasa C biasanya
dikenal dengan istilah fungsi yang masing-masing memiliki tugas (fungsi)
tertentu. Untuk sekarang ini dengan adanya open sourcedan open
code fungsi untuk tugas – tugas yang umum diperlukan tidak perlu diprogram
secara detail karena sebagian besar fungsi tersebut telah tersedia padalibrary.
Sebuah program khusus yang disebut compilerdipergunakan
untuk menterjemahkan instruksi bahasa tingkat tinggi seperti bahasa pemrograman
C kedalam kode mesin (machine code) yang dimaksudkan untuk dapat
dikenali dan dieksekusi oleh prosesor sehingga target program yang diinginkan
dapat tercapai. Program yang lain disebut linker (kadang-kadang
sudah embededatau langsung dipanggil oleh compiler) yang dipergunakan
untuk mengitegrasikan semua bagian dari program, disertakan semua referensi
fungsi darilibraries. Keseluruhan hasil dari aktivitas diatas biasanya
disebut dengan biner. sebagai catatan selain merubah menjadi bahasa
mesin kita juga dapat melakukan konversi disassemblers yang biasa
dikenal denganassember code, merupakan bahasa pemrograman yang sangat
dasar yang masih bisa dibaca oleh manusia.