Contoh Makalah Buffer Overflow

Buffer Overflow adalah salah satu celah keamanan yang bisa menjadi kelemahan pada suatu sistem komputer, nah untuk kalian yang ingin mengetahui tentang apa itu buffer overflow atau mungkin sedang mencari referensi tentang hal tersebut, berikut ini adalah contoh makalah buffer overlow yang pernah saya buat sabagai salah satu tugas pada mata kuliah Pengamanan Sistem Komputer


Contoh Makalah Buffer Overflow pada Pengamanan Sistem Komputer

Contoh Makalah Buffer Overflow Pengamanan Sistem Komputer

KATA PENGANTAR

Puji syukur kehadirat Allah SWT yang telah memberikan rahmat dan hidayah-Nya sehingga kami dapat menyelesaikan tugas makalah “Buffer Overflow” ini tepat pada waktunya.

Adapun tujuan dari penulisan dari makalah ini adalah untuk memenuhi tugas dari bapak Ilham Sahputra, S.T., M.Cs, pada Mata Kuliah Pengamanan Sistem Komputer. Selain itu, makalah ini juga bertujuan untuk menambah wawasan tentang Buffer Overflowbaik bagi para pembaca maupun bagi penulis.

Kami mengucapkan terima kasih kepada bapak Ilham Sahputra, S.T., M.Cs, selaku dosen pengampu Mata Kuliah Pengamanan Sistem Komputer yang telah memberikan tugas ini sehingga dapat menambah pengetahuan dan wawasan sesuai dengan bidang studi Teknik Informatika.

Kami juga mengucapkan terima kasih kepada semua pihak yang telah membagi sebagian pengetahuannya sehingga kami dapat menyelesaikan makalah ini.

Kami menyadari, makalah yang ditulis ini masih jauh dari kata sempurna. Oleh karena itu, kritik dan saran yang membangun akan kami nantikan demi kesempurnaan makalah ini.

Lhokseumawe, 17  Desember 2019


DAFTAR ISI

KATA PENGANTAR i
DAFTAR ISI ii
1 BAB I PENDAHULUAN 1
1.1 Latar Belakang 1
1. 2 Rumusan Masalah 1
1.3 Tujuan Pembahasan 2
2 BAB II PEMBAHASAN 3
2.1 Intruders 3
2.1.1 Intruder Behavior 5
2.2 Intrusion Detection 6
2.2.1 Basic Principle 7
2.2.2 Kekeliruan Tingkat Dasar 7
2.3 Pendekatan Analisis 8
2.3.1 Anomaly Detection 8
2.3.2 Signature or Heuristic Detection 8
2.4 Host-Based IntrusIon Detection 9
2.5 Network-Based Intrusion Detection 9
2.6 Distributed or Hybird Intrusion Detection 10
2.7 Intrusion Detection Exchange Format 11
2.8 Honeypots 11
3 BAB III PENUTUP 13
3.1 Kesimpulan 13
3.2 Saran 13
4 DAFTAR PUSTAKA 14


BAB I PENDAHULUAN

1.1 Latar Belakang

Jenis serangan buffer overflow adalah salah satu serangan paling umum yang terlihat dan hasil dari pemrograman yang ceroboh dalam aplikasi. Melihat daftar penasihat kerentanan dari organisasi seperti CERT atau SANS terus menyertakan sejumlah besar buffer overflow atau heap overflow exploit, termasuk sejumlah kerentanan serius yang dapat dieksploitasi dari jarak jauh.

Demikian pula, beberapa item dalam daftar 25 Kesalahan Perangkat Lunak Paling Berbahaya atas CWE / SANS, kategori Manajemen Sumber Daya yang Beracun, adalah varian buffer overflow. Ini dapat mengakibatkan eksploitasi pada sistem operasi dan aplikasi umum, dan masih terdiri dari sebagian besar eksploit dalam toolkit eksploit yang digunakan secara luas. Namun jenis serangan ini telah dikenal sejak pertama kali digunakan secara luas oleh Morris Internet Worm pada tahun 1988, dan teknik untuk mencegahnya dikenal dan didokumentasikan. Tabel 10.1 memberikan sejarah singkat dari beberapa insiden yang lebih terkenal dalam sejarah eksploitasi buffer overflow. 

Sayangnya, karena peninggalan kode buggy dalam sistem operasi dan aplikasi yang banyak digunakan, kegagalan untuk menambal dan memperbarui banyak sistem, dan melanjutkan praktik pemrograman yang ceroboh oleh programmer, itu masih menjadi sumber utama keprihatinan bagi praktisi keamanan. Bab ini berfokus pada bagaimana buffer overflow terjadi dan metode apa yang dapat digunakan untuk mencegah atau mendeteksi terjadinya.

Kita mulai dengan pengantar dasar-dasar buffer overflow. Kemudian kami menyajikan rincian overflow tumpukan buffer klasik. Ini termasuk diskusi tentang bagaimana fungsi menyimpan variabel lokal mereka di stack dan konsekuensi dari upaya untuk menyimpan lebih banyak data di dalamnya daripada ada ruang yang tersedia. Kami melanjutkan dengan ikhtisar tujuan dan desain shellcode, yang merupakan kode khusus yang disuntikkan oleh penyerang dan yang kontrolnya ditransfer sebagai akibat dari buffer overflow.

Selanjutnya kita mempertimbangkan cara bertahan melawan serangan buffer overflow. Kami mulai dengan pendekatan yang jelas untuk mencegah mereka dengan tidak menulis kode yang rentan terhadap buffer overflows. Namun, mengingat kode kereta yang besar dan sudah ada, kita juga perlu mempertimbangkan mekanisme perangkat keras dan perangkat lunak yang dapat mendeteksi dan menggagalkan serangan buffer overflow. Ini termasuk mekanisme untuk melindungi ruang alamat yang dapat dieksekusi, teknik untuk mendeteksi modifikasi tumpukan, dan pendekatan yang mengacak tata letak ruang alamat untuk menghambat keberhasilan pelaksanaan serangan ini.

1. 2 Rumusan Masalah

1. Apa pengertian dari Stack Overflow?
2. Bagaimana Pertahanan melawan Buffer Overflow ?
3. Bagaimana Bentuk-Bentuk lain dari Buffer Overflow?

1.3 Tujuan Pembahasan

Tujuan dari penyusunan makalah ini adalah untuk memberikan informasi serta menambah pengetahuan kepada pembaca mengenai Buffer Overflow termasuk didalamnya:
1. Pengertian dari Stack Overflow 
2. Bagaimana Pertahanan melawan Buffer Overflow 
3. Bagaimana Bentuk-Bentuk lain dari Buffer Overflow 


BAB II PEMBAHASAN

2.1 Stack Overflows

2.1.1 Dasar-dasar Buffer Buffer

Buffer overflow, juga dikenal sebagai buffer overrun atau buffer overwrite, didefinisikan dalam Daftar Istilah NIST dari Ketentuan Keamanan Informasi Utama sebagai berikut: Buffer Overrun: Suatu kondisi pada antarmuka di mana input lebih banyak dapat ditempatkan ke dalam area buffer atau data holding daripada kapasitas yang dialokasikan, menimpa informasi lainnya. Penyerang mengeksploitasi kondisi seperti itu untuk menghancurkan sistem atau memasukkan kode yang dibuat khusus yang memungkinkan mereka untuk mendapatkan kendali atas sistem

Buffer overflow dapat terjadi sebagai akibat dari kesalahan pemrograman ketika suatu proses mencoba untuk menyimpan data di luar batas buffer berukuran tetap dan akibatnya menimpa lokasi memori yang berdekatan. Lokasi-lokasi ini dapat menampung variabel atau parameter program lain atau data aliran kontrol program seperti mengembalikan alamat dan pointer ke frame stack sebelumnya. Buffer dapat ditemukan di stack, di heap, atau di bagian data proses.

Konsekuensi dari kesalahan ini termasuk korupsi data yang digunakan oleh program, transfer kontrol yang tidak terduga dalam program, kemungkinan pelanggaran akses memori, dan kemungkinan penghentian program pada akhirnya. Ketika dilakukan dengan sengaja sebagai bagian dari serangan pada suatu sistem, transfer kontrol dapat berupa kode yang dipilih penyerang, yang menghasilkan kemampuan untuk mengeksekusi kode arbitrer dengan hak istimewa dari proses yang diserang. 

Untuk menggambarkan operasi dasar buffer overflow, pertimbangkan fungsi utama C yang ada pada gambar dibawah ini berisi tiga variabel (valid, str1, dan str2), 1 yang nilainya biasanya akan disimpan di lokasi memori yang berdekatan. Urutan dan lokasi ini akan tergantung pada jenis variabel (lokal atau global), bahasa dan kompiler yang digunakan, dan arsitektur mesin target. Namun, untuk tujuan contoh ini kami akan menganggap bahwa mereka disimpan di lokasi memori berturut-turut

Contoh Makalah Buffer Overflow

dari tertinggi ke terendah, seperti yang ditunjukkan pada Gambar di bawah ini biasanya akan menjadi kasus untuk variabel lokal dalam fungsi C pada arsitektur prosesor umum seperti keluarga Intel Pentium. Tujuan dari fragmen kode adalah untuk memanggil fungsi tag next_ (str1) untuk menyalin ke str1 beberapa nilai tag yang diharapkan. Mari kita asumsikan ini akan menjadi string MULAI. Kemudian membaca baris berikutnya dari input standar untuk program menggunakan fungsi C library gets () dan kemudian membandingkan string yang dibaca dengan tag yang diharapkan. Jika baris berikutnya memang hanya berisi string MULAI, perbandingan ini akan berhasil, dan variabel VALID akan disetel ke TRUE.3. Kasus ini ditunjukkan pada contoh pertama dari tiga contoh program yang berjalan pada Gambar di bawah ini. Tag input lain akan meninggalkan dengan nilai SALAH. Fragmen kode seperti itu dapat digunakan untuk mem-parsing beberapa interaksi protokol jaringan terstruktur atau file teks yang diformat.

Contoh Makalah Buffer Overflow

Masalah dengan kode ini ada karena pustaka C tradisional mendapat () fungsi tidak termasuk memeriksa jumlah data yang disalin. Ini akan membaca baris teks berikutnya dari input standar program hingga karakter newline5 pertama muncul dan menyalinnya ke buffer yang disediakan diikuti oleh terminator NULL yang digunakan dengan string C. Jika lebih dari tujuh karakter ada pada baris input, ketika dibaca mereka akan (bersama dengan karakter NULL yang mengakhiri) membutuhkan lebih banyak ruang daripada yang tersedia di str2 buffer.

Akibatnya, karakter tambahan akan melanjutkan untuk menimpa nilai-nilai variabel yang berdekatan, str1 dalam kasus ini. Misalnya, jika baris input berisi EVILINPUTVALUE, hasilnya adalah str1 akan ditimpa dengan karakter TVALUE, dan str2 akan menggunakan tidak hanya delapan karakter yang dialokasikan untuk itu tetapi tujuh lainnya dari str1 juga. Ini dapat dilihat pada contoh kedua yang dijalankan pada Gambar sebelumnya. Overflow telah mengakibatkan korupsi variabel yang tidak langsung digunakan untuk menyimpan input. Karena string ini tidak sama, valid juga mempertahankan nilai FALSE. Selanjutnya, jika 16 karakter atau lebih dimasukkan, lokasi memori tambahan akan ditimpa.

Contoh sebelumnya menggambarkan perilaku dasar buffer overflow. Paling sederhana, setiap penyalinan data yang tidak dicentang ke dalam buffer dapat mengakibatkan kerusakan lokasi memori yang berdekatan, yang mungkin merupakan variabel lain, atau, seperti yang akan kita lihat selanjutnya, kemungkinan alamat kontrol program dan data. Bahkan contoh sederhana ini bisa diambil lebih lanjut. Mengetahui struktur kode yang memprosesnya, penyerang dapat mengatur nilai yang ditimpa untuk mengatur nilai di str1 sama dengan nilai yang ditempatkan di str2, sehingga perbandingan selanjutnya berhasil. Misalnya, baris input dapat berupa string BADINPUTBADINPUT.

Perhatikan juga bahwa NULL yang mengakhiri untuk string input ditulis ke lokasi memori setelah str1. Ini berarti aliran kontrol dalam program akan berlanjut seolah-olah tag yang diharapkan ditemukan, padahal sebenarnya membaca tag adalah sesuatu yang sama sekali berbeda. Ini hampir pasti akan menghasilkan perilaku program yang tidak dimaksudkan. Seberapa serius hal ini akan sangat tergantung pada logika dalam program yang diserang. Satu kemungkinan berbahaya terjadi jika alih-alih menjadi tag, nilai dalam buffer ini adalah kata sandi yang diharapkan dan disediakan yang diperlukan untuk mengakses fitur istimewa. Jika demikian, buffer overflow memberi penyerang sarana untuk mengakses fitur-fitur ini tanpa benar-benar mengetahui kata sandi yang benar. 

Untuk mengeksploitasi segala jenis buffer overflow, seperti yang telah kami ilustrasikan di sini, penyerang perlu: 
•Untuk mengidentifikasi kerentanan buffer overflow dalam beberapa program yang dapat dipicu menggunakan data yang bersumber eksternal di bawah kendali penyerang,

•Untuk memahami bagaimana buffer itu akan disimpan dalam memori proses, dan karenanya berpotensi merusak lokasi memori yang berdekatan dan berpotensi mengubah aliran eksekusi program.

Identifikasi program yang rentan dapat dilakukan dengan memeriksa sumber program, melacak pelaksanaan program ketika mereka memproses input yang terlalu besar, atau menggunakan alat-alat seperti fuzzing, untuk secara otomatis mengidentifikasi program yang berpotensi rentan. Apa yang dilakukan penyerang dengan kerusakan memori yang dihasilkan sangat bervariasi, tergantung pada nilai apa yang ditimpa. Kami akan mengeksplorasi beberapa alternatif di bagian berikut.

Sebelum menjelajahi buffer overflows lebih lanjut, ada baiknya mempertimbangkan bagaimana potensi terjadinya mereka dan mengapa program tidak perlu dilindungi dari kesalahan tersebut. Untuk memahami hal ini, kita perlu mempertimbangkan secara singkat sejarah bahasa pemrograman dan operasi dasar sistem komputer. Pada tingkat mesin dasar, semua data yang dimanipulasi oleh instruksi mesin yang dijalankan oleh prosesor komputer disimpan dalam register prosesor atau dalam memori. Data hanyalah array byte. Interpretasi mereka sepenuhnya ditentukan oleh fungsi instruksi yang mengaksesnya. Beberapa instruksi akan memperlakukan byte yang mewakili nilai integer, lainnya sebagai alamat data atau instruksi, dan yang lainnya sebagai array karakter.

Tidak ada yang intrinsik dalam register atau memori yang menunjukkan bahwa beberapa lokasi memiliki interpretasi yang berbeda dari yang lain. Dengan demikian, tanggung jawab ditempatkan pada programmer bahasa assembly untuk memastikan bahwa interpretasi yang benar ditempatkan pada setiap nilai data yang disimpan. Penggunaan program bahasa assembly (dan karenanya mesin) memberikan akses terbesar ke sumber daya sistem komputer, tetapi dengan biaya dan tanggung jawab tertinggi dalam upaya pengkodean untuk programmer.

Di ujung lain dari spektrum abstraksi, bahasa pemrograman tingkat tinggi modern seperti Java, ADA, Python, dan banyak lainnya memiliki gagasan yang sangat kuat tentang jenis variabel dan apa yang merupakan operasi yang diizinkan pada mereka. Bahasa seperti itu tidak mengalami buffer overflows karena mereka tidak mengizinkan lebih banyak data untuk disimpan ke dalam buffer daripada ruang yang tersedia untuk itu. Tingkat abstraksi yang lebih tinggi, dan fitur penggunaan yang aman dari bahasa-bahasa ini, berarti pemrogram dapat lebih fokus pada penyelesaian masalah yang dihadapi dan lebih sedikit dalam mengelola detail interaksi dengan variabel.

Tetapi fleksibilitas dan keamanan ini dikenakan biaya dalam penggunaan sumber daya, baik pada waktu kompilasi, dan dalam kode tambahan yang harus dijalankan pada waktu berjalan untuk memaksakan pemeriksaan seperti pada batas buffer. Jarak dari bahasa dan arsitektur mesin yang mendasarinya juga berarti bahwa akses ke beberapa instruksi dan sumber daya perangkat keras hilang. Ini membatasi kegunaannya dalam menulis kode, seperti driver perangkat, yang harus berinteraksi dengan sumber daya tersebut.

Di antara kedua ekstrem ini terdapat bahasa seperti C dan turunannya, yang memiliki banyak struktur kontrol tingkat tinggi modern dan abstraksi tipe data tetapi yang masih menyediakan kemampuan untuk mengakses dan memanipulasi data memori secara langsung. Bahasa pemrograman C dirancang oleh Dennis Ritchie, di Bell Laboratories, pada awal 1970-an. Itu digunakan sangat awal untuk menulis sistem operasi UNIX dan banyak aplikasi yang berjalan di atasnya. Keberhasilannya yang berkelanjutan adalah karena kemampuannya untuk mengakses sumber daya mesin tingkat rendah sambil tetap memiliki ekspresif kontrol tingkat tinggi dan struktur data dan karena itu cukup mudah diangkut ke berbagai arsitektur prosesor.

Perlu dicatat bahwa UNIX adalah salah satu sistem operasi paling awal yang ditulis dalam bahasa tingkat tinggi. Sampai saat itu (dan memang dalam beberapa kasus selama bertahun-tahun setelah), sistem operasi biasanya ditulis dalam bahasa assembly, yang membatasi mereka pada arsitektur prosesor tertentu. Sayangnya, kemampuan untuk mengakses sumber daya mesin tingkat rendah berarti bahwa bahasa tersebut rentan terhadap penggunaan konten memori yang tidak tepat. Ini diperburuk oleh fakta bahwa banyak fungsi perpustakaan yang umum dan banyak digunakan, terutama yang berkaitan dengan input dan pemrosesan string, gagal melakukan pemeriksaan pada ukuran buffer yang digunakan. Karena fungsi-fungsi ini umum dan banyak digunakan, dan karena UNIX dan sistem operasi turunan seperti Linux digunakan secara luas, ini berarti ada banyak kode warisan yang menggunakan fungsi-fungsi tidak aman ini, yang dengan demikian berpotensi rentan terhadap buffer overflows. Kami kembali ke masalah ini ketika kami membahas langkah-langkah penanggulangan untuk mengelola kelebihan buffer.


2.1.2 Stack Buffer Overflows

Stack Buffer Overflows terjadi ketika buffer yang ditargetkan berada di tumpukan, biasanya sebagai variabel lokal dalam bingkai tumpukan fungsi. Bentuk serangan ini juga disebut sebagai stack smashing. Serangan buffer overflow tumpukan telah dieksploitasi sejak pertama kali terlihat di alam liar di Morris Internet Worm pada tahun 1988.

Eksploitasi yang digunakan termasuk buffer overflow yang tidak dicentang yang dihasilkan dari penggunaan fungsi C mendapat () dalam daemon fingerd. Publikasi oleh Aleph One (Elias Levy) tentang rincian serangan dan bagaimana mengeksploitasinya mempercepat penggunaan teknik ini. Seperti yang ditunjukkan dalam pengantar bab, tumpukan buffer overflows masih dieksploitasi, karena kerentanan baru terus ditemukan dalam perangkat lunak yang digunakan secara luas.

Function call Mechanisms
Untuk lebih memahami bagaimana buffer overflows bekerja, pertama-tama kita akan menyimpang ke dalam mekanisme yang digunakan oleh fungsi-fungsi program untuk mengelola status lokal mereka pada setiap panggilan. Ketika satu fungsi memanggil yang lain, setidaknya perlu tempat untuk menyimpan alamat kembali sehingga fungsi yang dipanggil dapat mengembalikan kontrol ketika selesai. Selain itu, ia juga membutuhkan lokasi untuk menyimpan parameter yang akan diteruskan ke fungsi yang dipanggil dan juga mungkin untuk menyimpan nilai register yang ingin terus digunakan ketika fungsi yang dipanggil kembali. Semua data ini biasanya disimpan di tumpukan dalam struktur yang dikenal sebagai Stack Frame.

Fungsi yang dipanggil juga membutuhkan lokasi untuk menyimpan variabel lokalnya, di suatu tempat berbeda untuk setiap panggilan sehingga memungkinkan bagi suatu fungsi untuk memanggil dirinya sendiri baik secara langsung maupun tidak langsung. Ini dikenal sebagai pemanggilan fungsi rekursif.7 Dalam sebagian besar bahasa modern, termasuk C, variabel lokal juga disimpan dalam bingkai stack fungsi. Satu informasi selanjutnya yang diperlukan adalah beberapa cara untuk merangkaikan frame-frame ini bersama-sama, sehingga ketika suatu fungsi keluar, ia dapat mengembalikan frame stack untuk fungsi panggilan sebelum mentransfer kontrol ke alamat pengirim.


Contoh Makalah Buffer Overflow


2.1.3 Shellcode

Komponen penting dari banyak serangan buffer overflow adalah transfer eksekusi ke kode yang disediakan oleh penyerang dan sering disimpan dalam buffer yang meluap. Kode ini dikenal sebagai shellcode, karena secara tradisional fungsinya adalah untuk mentransfer kontrol ke penerjemah baris perintah pengguna, atau shell, yang memberikan akses ke program apa pun yang tersedia di sistem dengan hak istimewa dari program yang diserang.

Pada sistem UNIX ini sering dicapai dengan mengkompilasi kode untuk panggilan ke fungsi sistem execve ("/ bin / sh"), yang menggantikan kode program saat ini dengan yang ada pada shell Bourne (atau shell lain mana yang disukai penyerang). Pada sistem Windows, biasanya melibatkan fungsi panggilan ke sistem ("command.exe") (atau "cmd.exe" pada sistem yang lebih lama) untuk menjalankan shell Command DOS.

Shellcode kemudian hanyalah kode mesin, serangkaian nilai biner yang sesuai dengan instruksi mesin dan nilai data yang mengimplementasikan fungsionalitas yang diinginkan penyerang. Ini berarti shellcode khusus untuk arsitektur prosesor tertentu, dan memang biasanya untuk sistem operasi tertentu, karena harus dapat berjalan pada sistem yang ditargetkan dan berinteraksi dengan fungsi sistemnya. Ini adalah alasan utama mengapa serangan buffer overflow biasanya ditargetkan pada perangkat lunak tertentu yang berjalan pada sistem operasi tertentu.

Karena shellcode adalah kode mesin, menulisnya secara tradisional membutuhkan pemahaman yang baik tentang bahasa rakitan dan pengoperasian sistem yang ditargetkan. Memang banyak panduan klasik untuk menulis shellcode, termasuk yang asli, mengasumsikan pengetahuan tersebut. Namun, baru-baru ini sejumlah situs dan alat telah dikembangkan yang mengotomatiskan proses ini (seperti yang memang telah terjadi dalam pengembangan eksploitasi keamanan pada umumnya), sehingga membuat pengembangan exploit shellcode tersedia untuk audiens potensial yang jauh lebih besar. Salah satu situs yang menarik adalah Proyek Metasploit, yang bertujuan untuk memberikan informasi yang berguna kepada orang-orang yang melakukan pengujian penetrasi, pengembangan tanda tangan IDS, dan eksploitasi penelitian. Ini mencakup platform open-source canggih untuk mengembangkan, menguji, dan menggunakan kode exploit, yang dapat digunakan untuk membuat shellcode yang melakukan salah satu dari berbagai tugas dan yang mengeksploitasi berbagai kerentanan buffer overflow yang diketahui.

Shellcode Development
Untuk menyoroti struktur dasar shellcode, kami mengeksplorasi pengembangan serangan shellcode klasik sederhana, yang hanya meluncurkan shell Bourne pada sistem Intel Linux. Shellcode perlu mengimplementasikan fungsi tersebut. Shellcode marshal argumen yang diperlukan untuk fungsi sistem execve (), termasuk argumen minimal yang sesuai dan daftar lingkungan, dan kemudian memanggil fungsi. Untuk menghasilkan shellcode, spesifikasi bahasa tingkat tinggi ini pertama-tama harus dikompilasi ke dalam bahasa mesin yang setara. Namun, sejumlah perubahan harus dilakukan. Pertama, execve (sh, args, NULL) adalah fungsi pustaka yang pada gilirannya marsals argumen yang disediakan ke lokasi yang benar (mesin mendaftar dalam kasus Linux) dan kemudian memicu interupsi perangkat lunak untuk memanggil kernel untuk melakukan panggilan sistem yang diinginkan . Untuk digunakan dalam shellcode, instruksi ini termasuk inline, daripada mengandalkan fungsi perpustakaan.

Ada juga beberapa batasan umum pada konten shellcode. Pertama, harus mandiri. Itu berarti tidak dapat berisi alamat absolut yang merujuk pada dirinya sendiri, karena penyerang umumnya tidak dapat menentukan terlebih dahulu di mana buffer yang ditargetkan akan terletak di bingkai tumpukan fungsi di mana ia didefinisikan. Frame tumpukan ini dibuat satu di bawah yang lain, bekerja turun dari atas tumpukan karena aliran eksekusi dalam program target memiliki fungsi yang memanggil fungsi lainnya. Jumlah bingkai dan karenanya lokasi akhir buffer akan tergantung pada urutan panggilan fungsi yang tepat yang mengarah ke fungsi yang ditargetkan.

Fungsi ini dapat dipanggil dari beberapa tempat yang berbeda dalam program, dan mungkin ada urutan yang berbeda dari panggilan fungsi, atau jumlah nilai lokal sementara yang berbeda menggunakan stack sebelum akhirnya dipanggil. Jadi, sementara penyerang mungkin memiliki gagasan perkiraan lokasi bingkai tumpukan, biasanya penyerang tidak dapat ditentukan secara tepat. Semua ini berarti bahwa shellcode harus dapat berjalan di mana pun di memori itu berada. Ini berarti bahwa hanya referensi alamat relatif, offset ke alamat instruksi saat ini, dapat digunakan. Ini juga berarti bahwa penyerang tidak dapat secara tepat menentukan alamat awal dari instruksi dalam shellcode.

Pembatasan lain pada shellcode adalah bahwa ia tidak dapat berisi nilai NULL. Ini adalah konsekuensi dari bagaimana biasanya disalin ke buffer di tempat pertama. Semua contoh buffer overflows yang kami gunakan dalam bab ini melibatkan penggunaan rutin manipulasi string yang tidak aman. Dalam C, sebuah string selalu diakhiri dengan karakter NULL, yang berarti satu-satunya tempat shellcode dapat memiliki NULL adalah pada akhirnya, setelah semua kode, timpa frame pointer lama, dan mengembalikan nilai alamat.

Mengingat keterbatasan di atas, apa yang dihasilkan dari proses desain ini adalah kode yang mirip dengan yang ditunjukkan pada Gambar di atas. Kode ini ditulis dalam bahasa assembly x86, seperti yang digunakan oleh prosesor Pentium. Lebih banyak detail tentang bahasa assembly x86 dan organisasi mesin dapat ditemukan. Secara umum, kode pada Gambar di atas mengimplementasikan fungsionalitas yang ditentukan dalam program C asli.

Deskripsi sebelumnya menggambarkan bagaimana shellcode sederhana dapat dikembangkan dan digunakan dalam serangan stack overflow. Selain hanya menelurkan shell commandline (UNIX atau DOS), penyerang mungkin ingin membuat shellcode untuk melakukan operasi yang agak lebih kompleks, seperti yang ditunjukkan dalam kasus yang baru saja dibahas. 

Situs Proyek Metasploit mencakup serangkaian fungsionalitas dalam shellcode yang dapat dihasilkannya, dan situs Web Packet Storm mencakup banyak koleksi shellcode yang dikemas, termasuk kode yang dapat:
•Atur layanan mendengarkan untuk meluncurkan shell jarak jauh ketika terhubung.• Buat shell terbalik yang menghubungkan kembali ke hacker.
•Gunakan eksploitasi lokal yang membentuk shell atau menjalankan suatu proses.
•Aturan firewall flush (seperti IPTable dan IPChains) yang saat ini memblokir serangan lain.
•Keluar dari lingkungan chroot (eksekusi terbatas), memberikan akses penuh ke sistem.


2.2 Pertahanan melawan Buffer Overflow

Kita telah melihat bahwa menemukan dan mengeksploitasi stack buffer overflow tidaklah sulit. Sejumlah besar eksploitasi selama beberapa dekade sebelumnya dengan jelas menggambarkan hal ini. Akibatnya ada kebutuhan untuk mempertahankan sistem terhadap serangan seperti itu dengan mencegahnya, atau setidaknya mendeteksi dan membatalkan serangan tersebut. Bagian ini membahas kemungkinan pendekatan untuk mengimplementasikan perlindungan tersebut. 

Ini dapat secara luas diklasifikasikan ke dalam dua kategori:
Compile-time defenses, yang bertujuan mengeraskan program untuk melawan serangan dalam program baru.
•Run-time defenses  , yang bertujuan untuk mendeteksi dan membatalkan serangan pada program yang ada. 

Sementara pertahanan yang sesuai telah dikenal selama beberapa dekade, basis perangkat lunak yang rentan dan sistem yang sangat besar menghambat penyebaran mereka. Oleh karena itu minat pada pertahanan run-time, yang dapat digunakan sebagai sistem operasi dan pembaruan dan dapat memberikan beberapa perlindungan untuk program rentan yang ada

2.2.1 Compile-Time Defenses

Compile-Time Defenses bertujuan untuk mencegah atau mendeteksi kelebihan buffer dengan menginstruksikan program ketika dikompilasi. Kemungkinan untuk melakukan hal ini berkisar dari memilih bahasa tingkat tinggi yang tidak mengizinkan buffer overflows, hingga mendorong standar pengkodean yang aman, menggunakan perpustakaan standar yang aman, atau termasuk kode tambahan untuk mendeteksi kerusakan bingkai tumpukan.

Choice of Programming Language
Satu kemungkinan, seperti disebutkan sebelumnya, adalah menulis program menggunakan bahasa pemrograman tingkat tinggi modern, yang memiliki gagasan kuat tentang tipe variabel dan apa yang merupakan operasi yang diizinkan pada mereka. Bahasa-bahasa seperti itu tidak rentan terhadap serangan buffer overflow karena kompiler mereka menyertakan kode tambahan untuk menegakkan pemeriksaan jangkauan secara otomatis, menghilangkan kebutuhan bagi programmer untuk secara eksplisit mengkode mereka.

Fleksibilitas dan keamanan yang diberikan oleh bahasa-bahasa ini memang memakan biaya dalam penggunaan sumber daya, baik pada waktu kompilasi dan juga dalam kode tambahan yang harus dijalankan pada waktu berjalan untuk memaksakan pemeriksaan seperti pada batas buffer. Kerugian ini jauh kurang signifikan daripada sebelumnya, karena peningkatan cepat dalam kinerja prosesor. Semakin banyak program yang ditulis dalam bahasa-bahasa ini dan karenanya harus kebal terhadap buffer overflows dalam kode mereka (meskipun jika mereka menggunakan pustaka sistem yang ada atau lingkungan eksekusi run-time yang ditulis dalam bahasa yang kurang aman, mereka mungkin masih rentan).

Seperti yang kami catat juga, jarak dari bahasa mesin dan arsitektur yang mendasarinya juga berarti bahwa akses ke beberapa instruksi dan sumber daya perangkat keras hilang. Ini membatasi kegunaannya dalam menulis kode, seperti driver perangkat, yang harus berinteraksi dengan sumber daya tersebut. Karena alasan ini, kemungkinan masih ada setidaknya beberapa kode yang ditulis dalam bahasa yang kurang aman seperti C.

Safe Coding Techniques
Jika bahasa seperti C sedang digunakan, maka programmer perlu menyadari bahwa kemampuan mereka untuk memanipulasi alamat pointer dan mengakses memori secara langsung dikenakan biaya. Telah dicatat bahwa C dirancang sebagai bahasa pemrograman sistem, berjalan pada sistem yang jauh lebih kecil dan lebih terbatas daripada yang kita gunakan sekarang. Ini berarti desainer C lebih menekankan pada efisiensi ruang dan pertimbangan kinerja daripada pada keamanan jenis. Mereka berasumsi bahwa programmer akan melakukan kehati-hatian dalam menulis kode menggunakan bahasa-bahasa ini dan bertanggung jawab untuk memastikan keamanan semua struktur data dan variabel.

Sayangnya, seperti yang ditunjukkan oleh beberapa dekade pengalaman, ini tidak terjadi. Ini dapat dilihat pada legacy besar kode yang berpotensi tidak aman di sistem operasi dan aplikasi Linux, UNIX, dan Windows, beberapa di antaranya berpotensi rentan terhadap buffer overflows.

Untuk memperkuat sistem ini, programmer perlu memeriksa kode dan menulis ulang setiap konstruksi pengkodean yang tidak aman dengan cara yang aman. Mengingat penggunaan eksploit buffer overflow yang cepat, proses ini telah dimulai dalam beberapa kasus. Contoh yang baik adalah proyek OpenBSD, yang menghasilkan sistem operasi seperti UNIXlike 4.4.4D berbasis multiplatform gratis. Di antara perubahan teknologi lainnya, programmer telah melakukan audit ekstensif terhadap basis kode yang ada, termasuk sistem operasi, perpustakaan standar, dan utilitas umum. Ini telah menghasilkan apa yang secara luas dianggap sebagai salah satu sistem operasi teraman yang digunakan secara luas.

Proyek OpenBSD mengklaim pada pertengahan 2006 bahwa hanya ada satu lubang jarak jauh yang ditemukan pada pemasangan default dalam lebih dari delapan tahun. Ini catatan yang patut ditiru. Pemrogram Microsoft juga telah melakukan proyek besar dalam mengkaji basis kode mereka, sebagian sebagai tanggapan terhadap publisitas yang berkelanjutan atas jumlah kerentanan, termasuk banyak masalah buffer overflow, yang telah ditemukan dalam sistem operasi dan kode aplikasi mereka. Ini jelas merupakan proses yang sulit, meskipun mereka mengklaim bahwa Vista mereka yang lebih baru dan kemudian sistem operasi Windows mendapat manfaat besar dari proses ini.

Language Extensions and use of safe libraries\
Mengingat masalah yang dapat terjadi pada C dengan referensi array dan pointer yang tidak aman, ada sejumlah proposal untuk menambah kompiler untuk secara otomatis memasukkan pemeriksaan jangkauan pada referensi tersebut. Meskipun ini cukup mudah untuk array yang dialokasikan secara statis, penanganan memori yang dialokasikan secara dinamis lebih bermasalah, karena informasi ukuran tidak tersedia pada waktu kompilasi.

Menangani ini memerlukan ekstensi ke semantik pointer untuk memasukkan informasi batas dan penggunaan rutin perpustakaan untuk memastikan nilai-nilai ini diatur dengan benar. Beberapa pendekatan seperti itu tercantum dalam [LHEE03]. Namun, pada umumnya ada penalti kinerja dengan penggunaan teknik seperti itu yang mungkin atau mungkin tidak dapat diterima. Teknik-teknik ini juga memerlukan semua program dan pustaka yang membutuhkan fitur keselamatan ini untuk dikompilasi ulang dengan kompiler yang dimodifikasi. Meskipun hal ini layak untuk rilis baru dari sistem operasi dan utilitas terkait, masih akan ada masalah dengan aplikasi pihak ketiga.

Kekhawatiran umum dengan C berasal dari penggunaan rutin pustaka standar yang tidak aman, terutama beberapa rutin manipulasi string. Salah satu pendekatan untuk meningkatkan keamanan sistem telah menggantikannya dengan varian yang lebih aman. Ini dapat mencakup ketentuan fungsi baru, seperti strlcpy () dalam keluarga sistem BSD, termasuk OpenBSD. Menggunakan ini membutuhkan penulisan ulang sumber agar sesuai dengan semantik baru yang lebih aman. Atau, itu melibatkan penggantian perpustakaan string standar dengan varian yang lebih aman. Libsafe adalah contoh terkenal dari ini. Ini mengimplementasikan semantik standar tetapi mencakup pemeriksaan tambahan untuk memastikan bahwa operasi penyalinan tidak melampaui ruang variabel lokal dalam bingkai tumpukan. Jadi sementara itu tidak dapat mencegah korupsi dari variabel lokal yang berdekatan, itu dapat mencegah modifikasi dari bingkai stack lama dan mengembalikan nilai-nilai alamat, dan dengan demikian mencegah buffer overflow tipe serangan klasik yang kita periksa sebelumnya.

Perpustakaan ini diimplementasikan sebagai perpustakaan dinamis, diatur untuk memuat sebelum perpustakaan standar yang ada, dan dengan demikian dapat memberikan perlindungan untuk program yang ada tanpa mengharuskan mereka untuk dikompilasi ulang, asalkan mereka secara dinamis mengakses rutinitas perpustakaan standar (seperti kebanyakan program lakukan). Kode perpustakaan yang dimodifikasi telah ditemukan biasanya setidaknya seefisien perpustakaan standar, dan dengan demikian penggunaannya adalah cara mudah untuk melindungi program yang ada terhadap beberapa bentuk serangan buffer overflow.

Stack Protection Mechanisms
Metode yang efektif untuk melindungi program terhadap serangan overflow tumpukan klasik adalah dengan memasukkan dan memasukkan kode fungsi masuk dan keluar dan kemudian memeriksa kerangka tumpukannya untuk melihat bukti korupsi. Jika ada modifikasi ditemukan, program dibatalkan daripada membiarkan serangan untuk melanjutkan. Ada beberapa pendekatan untuk menyediakan perlindungan ini.

Stackguard adalah salah satu mekanisme perlindungan yang paling dikenal. Ini adalah ekstensi kompiler GCC yang menyisipkan entri fungsi tambahan dan kode keluar. Kode entri fungsi yang ditambahkan menulis nilai canary12 di bawah alamat penunjuk bingkai lama, sebelum alokasi ruang untuk variabel lokal. Kode keluar fungsi yang ditambahkan memeriksa bahwa nilai kenari tidak berubah sebelum melanjutkan dengan fungsi keluar yang biasa operasi mengembalikan frame pointer lama dan mentransfer kontrol kembali ke alamat kembali.

Setiap upaya stack overflow buffer klasik harus mengubah nilai ini untuk mengubah frame pointer lama dan mengembalikan alamat, dan dengan demikian akan terdeteksi, sehingga program dibatalkan. Agar pertahanan ini berfungsi dengan sukses, sangat penting bahwa nilai kenari tidak dapat diprediksi dan harus berbeda pada sistem yang berbeda. Jika ini tidak terjadi, penyerang hanya akan memastikan shellcode menyertakan nilai kenari yang benar di lokasi yang diperlukan. Biasanya, nilai acak dipilih sebagai nilai kenari pada proses penciptaan dan disimpan sebagai bagian dari kondisi proses. Kode ditambahkan ke entri fungsi dan keluar kemudian gunakan nilai ini.

Ada beberapa masalah dengan menggunakan pendekatan ini. Pertama, ini mensyaratkan bahwa semua program yang membutuhkan perlindungan dikompilasi ulang. Kedua, karena struktur frame stack telah berubah, itu dapat menyebabkan masalah dengan program, seperti debuggers, yang menganalisis frame stack. Namun, teknik kenari telah digunakan untuk mengkompilasi ulang seluruh distribusi Linux dan menyediakannya dengan tingkat resistensi yang tinggi terhadap serangan stack overflow. Fungsionalitas serupa tersedia untuk program Windows dengan mengompilasinya menggunakan opsi kompiler Microsoft / GS Visual C ++.

Varian lain untuk melindungi frame stack digunakan oleh Stackshield dan Return Address Defender (RAD). Ini juga ekstensi GCC yang mencakup entri fungsi tambahan dan kode keluar. Ekstensi ini tidak mengubah struktur bingkai tumpukan. Sebaliknya, pada entri fungsi, kode yang ditambahkan menulis salinan alamat pengirim ke wilayah memori yang aman yang akan sangat sulit rusak. Pada fungsi keluar kode yang ditambahkan memeriksa alamat kembali dalam bingkai tumpukan terhadap salinan yang disimpan dan, jika ada perubahan ditemukan, batalkan program. Karena format frame stack tidak berubah, ekstensi ini kompatibel dengan debugger yang tidak dimodifikasi. Sekali lagi, program harus dikompilasi ulang untuk memanfaatkan ekstensi ini.

2.2.2 Run-Time Defenses

Seperti yang telah dicatat, sebagian besar pendekatan waktu kompilasi memerlukan kompilasi ulang dari program yang ada. Oleh karena itu ada minat pada pertahanan run-time yang dapat digunakan sebagai pembaruan sistem operasi untuk memberikan perlindungan bagi program rentan yang ada. Pertahanan ini melibatkan perubahan pada manajemen memori ruang alamat proses virtual. Perubahan-perubahan ini bertindak untuk mengubah sifat-sifat wilayah memori, atau untuk membuat memprediksi lokasi buffer yang ditargetkan cukup sulit untuk menggagalkan berbagai jenis serangan.

Executable Address Space Protection
Banyak serangan buffer overflow, seperti contoh stack overflow dalam bab ini, melibatkan menyalin kode mesin ke buffer yang ditargetkan dan kemudian mentransfer eksekusi ke sana. Kemungkinan pertahanan adalah untuk memblokir eksekusi kode pada stack, dengan asumsi bahwa kode yang dapat dieksekusi hanya dapat ditemukan di tempat lain di ruang alamat proses.

Untuk mendukung fitur ini secara efisien diperlukan dukungan dari unit manajemen memori (MMU) prosesor untuk menandai halaman-halaman memori virtual sebagai tidak dapat dieksekusi. Beberapa prosesor, seperti SPARC yang digunakan oleh Solaris, telah memiliki dukungan untuk ini selama beberapa waktu. Mengaktifkan penggunaannya di Solaris membutuhkan perubahan parameter kernel sederhana. Prosesor lain, seperti keluarga x86, tidak memiliki dukungan ini sampai penambahan bit eksekusi di MMU yang relatif baru.

Ekstensi telah tersedia untuk Linux, BSD, dan sistem gaya UNIX lainnya untuk mendukung penggunaan fitur ini. Beberapa memang juga mampu melindungi tumpukan serta tumpukan, yang juga merupakan target serangan, seperti yang kita bahas dalam Bagian 10.3. Dukungan untuk mengaktifkan perlindungan noexecute juga termasuk dalam sistem Windows sejak XP SP2.

Address Space Randomization
Teknik run-time lain yang dapat digunakan untuk menggagalkan serangan melibatkan manipulasi lokasi struktur data utama dalam ruang alamat proses. Secara khusus, ingat bahwa untuk mengimplementasikan serangan stack overflow klasik, penyerang harus dapat memprediksi perkiraan lokasi buffer yang ditargetkan.

Penyerang menggunakan alamat prediksi ini untuk menentukan alamat pengirim yang cocok untuk digunakan dalam serangan untuk mentransfer kontrol ke shellcode. Salah satu teknik untuk meningkatkan kesulitan prediksi ini adalah dengan mengubah alamat tempat tumpukan diletakkan secara acak untuk setiap proses. Kisaran alamat yang tersedia pada prosesor modern adalah besar (32 bit), dan sebagian besar program hanya membutuhkan sebagian kecil dari itu. Oleh karena itu, memindahkan wilayah memori tumpukan sekitar satu megabyte atau kurang memiliki dampak minimal pada sebagian besar program, tetapi membuat memperkirakan alamat penyangga target hampir mustahil.

Jumlah variasi ini juga jauh lebih besar dari ukuran buffer yang paling rentan, sehingga tidak ada kemungkinan memiliki kereta luncur NOP yang cukup besar untuk menangani kisaran alamat ini. Sekali lagi ini memberikan tingkat perlindungan untuk program yang ada, dan meskipun tidak dapat menghentikan proses serangan, program hampir pasti akan dibatalkan karena referensi memori yang tidak valid.

Terkait dengan pendekatan ini adalah penggunaan alokasi memori dinamis acak (untuk malloc () dan rutinitas perpustakaan terkait). Seperti yang kita bahas di Bagian 10.3, ada kelas serangan heap buffer overflow yang mengeksploitasi kedekatan yang diharapkan dari alokasi memori berturut-turut, atau memang susunan struktur data manajemen heap. Mengacak alokasi memori pada heap membuat kemungkinan memprediksi alamat buffer yang ditargetkan menjadi sangat sulit, sehingga menggagalkan eksekusi yang sukses dari beberapa heap overflow attack.

Guard Pages
Teknik runtime terakhir yang dapat digunakan menempatkan halaman penjaga di antara wilayah kritis memori dalam ruang alamat proses. Sekali lagi, ini mengeksploitasi fakta bahwa suatu proses memiliki lebih banyak memori virtual yang tersedia daripada yang biasanya dibutuhkan. Kesenjangan ditempatkan di antara rentang alamat yang digunakan untuk masing-masing komponen ruang alamat, seperti yang diilustrasikan dalam gambar di atas.

Kesenjangan ini, atau halaman penjaga, ditandai di MMU sebagai alamat ilegal, dan setiap upaya untuk mengaksesnya mengakibatkan proses dibatalkan. Ini dapat mencegah serangan buffer overflow, biasanya data global, yang berupaya untuk menimpa wilayah yang berdekatan dalam ruang alamat proses, seperti tabel offset global, ekstensi selanjutnya menempatkan halaman penjaga di antara frame stack atau antara alokasi berbeda pada heap. 

Ini dapat memberikan perlindungan lebih lanjut terhadap serangan stack dan heap over flow, tetapi dengan biaya dalam waktu pelaksanaan mendukung sejumlah besar pemetaan halaman yang diperlukan.

2.3 Bentuk-Bentuk lain dari Buffer Overflow

2.3.1 Replacement Stack Frame

Dalam stack overflow buffer klasik, penyerang menimpa buffer yang terletak di area variabel lokal dari frame stack dan kemudian menimpa frame pointer yang disimpan dan mengembalikan alamat. Varian pada serangan ini menimpa buffer dan alamat penunjuk bingkai yang disimpan. Nilai pointer bingkai yang disimpan diubah untuk merujuk ke lokasi di dekat bagian atas buffer yang ditimpa, di mana frame tumpukan boneka telah dibuat dengan alamat kembali yang menunjuk ke shellcode yang lebih rendah di buffer. Setelah perubahan ini, fungsi saat ini kembali ke fungsi panggilannya seperti biasa, karena alamat pengembaliannya belum diubah. Namun, fungsi panggilan itu sekarang menggunakan bingkai dummy pengganti, dan ketika kembali, kontrol ditransfer ke shellcode di buffer yang ditimpa.

Ini mungkin tampak serangan yang agak tidak langsung, tetapi bisa digunakan ketika hanya buffer overflow yang dimungkinkan, yang memungkinkan perubahan ke frame pointer yang disimpan tetapi bukan alamat pengirim. Anda mungkin mengingat program contoh yang ditunjukkan pada hanya mengizinkan konten buffer tambahan yang cukup untuk menimpa frame pointer tetapi tidak mengembalikan alamat. Contoh ini mungkin tidak dapat menggunakan serangan ini, karena NULL akhir trailing, yang mengakhiri string membaca ke buffer, akan mengubah baik frame pointer yang disimpan atau mengembalikan alamat dengan cara yang biasanya akan menggagalkan serangan. Namun, ada kategori stack stack overflows yang dikenal sebagai serangan off-by-one.

Ini dapat terjadi dalam salinan buffer biner ketika programmer telah memasukkan kode untuk memeriksa jumlah byte yang ditransfer, tetapi karena kesalahan pengkodean, memungkinkan hanya satu byte lagi untuk disalin daripada ada ruang yang tersedia. Ini biasanya terjadi ketika tes bersyarat menggunakan 6 = bukannya 6, atau 7 = bukannya 7. Jika buffer terletak tepat di bawah pointer bingkai yang disimpan, 13 maka byte tambahan ini dapat mengubah yang pertama (byte paling signifikan pada prosesor x86 ) dari alamat ini.

Meskipun mengubah satu byte mungkin tidak tampak banyak, mengingat bahwa penyerang hanya ingin mengubah alamat ini dari frame stack sebelumnya (tepat di atas frame saat ini dalam memori) ke frame dummy baru yang terletak di buffer dalam frame saat ini, perubahan biasanya hanya perlu beberapa puluh byte. Dengan keberuntungan dalam alamat yang digunakan, perubahan satu byte mungkin yang diperlukan. Karenanya serangan overflow yang mentransfer kontrol ke shellcode dimungkinkan, bahkan jika secara tidak langsung. Ada beberapa batasan tambahan pada serangan ini. 

Dalam serangan overflow tumpukan klasik, penyerang hanya perlu menebak perkiraan alamat penyangga, karena beberapa slack dapat diambil di kereta luncur NOP. Namun, agar serangan tidak langsung ini berfungsi, penyerang harus mengetahui alamat penyangga secara tepat, karena alamat persis frame tumpukan boneka harus digunakan ketika menimpa nilai frame pointer lama. Ini secara signifikan dapat mengurangi peluang keberhasilan serangan. Masalah lain bagi penyerang terjadi setelah kontrol kembali ke fungsi panggilan. Karena fungsinya sekarang menggunakan bingkai dummy stack, variabel lokal apa pun yang digunakannya sekarang tidak valid, dan penggunaannya dapat menyebabkan program macet sebelum fungsi ini selesai dan kembali ke shellcode.

Namun, ini adalah risiko dengan sebagian besar serangan overwriting stack. Pertahanan terhadap jenis serangan ini termasuk mekanisme perlindungan stack untuk mendeteksi modifikasi pada frame stack atau mengembalikan alamat berdasarkan kode keluar fungsi. Juga, menggunakan tumpukan yang tidak dapat dieksekusi menghambat eksekusi shellcode, meskipun ini saja tidak akan mencegah varian tidak langsung dari serangan kembali ke sistem panggilan yang akan kita pertimbangkan selanjutnya. Pengacakan tumpukan dalam memori dan pustaka sistem akan bertindak untuk sangat menghambat kemampuan penyerang untuk menebak alamat yang benar untuk digunakan dan karenanya memblokir eksekusi serangan yang berhasil.

2.3.2 Return to System Call

Dengan diperkenalkannya tumpukan yang tidak dapat dieksekusi sebagai pertahanan terhadap buffer overflows, penyerang telah beralih ke serangan varian di mana alamat pengirim diubah untuk melompat ke kode yang ada pada sistem. Anda mungkin ingat kami mencatat ini sebagai opsi ketika kami memeriksa dasar-dasar serangan stack overflow. Paling umum alamat dari fungsi perpustakaan standar dipilih, seperti fungsi system ().

Penyerang menentukan limpahan yang mengisi buffer, menggantikan pointer frame yang disimpan dengan alamat yang sesuai, mengganti alamat pengirim dengan alamat fungsi perpustakaan yang diinginkan, menulis nilai placeholder yang diyakini oleh fungsi perpustakaan sebagai alamat pengirim, dan kemudian menulis nilai satu (atau lebih) parameter ke fungsi pustaka ini. Ketika fungsi yang diserang kembali, ia mengembalikan pointer bingkai (dimodifikasi), kemudian muncul dan mentransfer kontrol ke alamat kembali, yang menyebabkan kode dalam fungsi pustaka untuk mulai mengeksekusi. Karena fungsi percaya telah dipanggil, ia memperlakukan nilai saat ini di atas tumpukan (placeholder) sebagai alamat pengirim, dengan parameter di atas itu.

Pada gilirannya itu akan membangun bingkai baru di bawah lokasi ini dan berjalan. Jika fungsi perpustakaan yang dipanggil adalah, misalnya, sistem ("shell command line"), maka perintah shell yang ditentukan akan dijalankan sebelum kontrol kembali ke program yang diserang, yang kemungkinan besar akan crash. Bergantung pada jenis parameter dan interpretasinya oleh fungsi pustaka, penyerang mungkin perlu mengetahui alamat mereka secara tepat (biasanya di dalam buffer yang ditimpa). Namun, dalam contoh ini, "shell command line" bisa diawali dengan serangkaian spasi, yang akan diperlakukan sebagai ruang putih dan diabaikan oleh shell, sehingga memungkinkan beberapa kelonggaran dalam akurasi menebak alamatnya. Varian lain menghubungkan dua panggilan perpustakaan satu demi satu. Ini berfungsi dengan membuat nilai placeholder (yang fungsi pustaka pertama disebut memperlakukan sebagai alamat pengirim) menjadi alamat fungsi kedua. Kemudian parameter untuk masing-masing harus sesuai terletak di tumpukan, yang umumnya membatasi fungsi apa yang bisa dipanggil, dan dalam urutan apa. 

Penggunaan umum dari teknik ini membuat alamat pertama dari fungsi perpustakaan strcpy (). Parameter yang ditentukan menyebabkannya menyalin beberapa shellcode dari buffer yang diserang ke wilayah memori lain yang tidak ditandai tidak dapat dieksekusi. Alamat kedua menunjuk ke alamat tujuan di mana shellcode disalin. Ini memungkinkan penyerang untuk menyuntikkan kode mereka sendiri tetap membiarkannya menghindari pembatasan tumpukan yang tidak dapat dieksekusi. Sekali lagi, pertahanan terhadap ini termasuk mekanisme perlindungan stack untuk mendeteksi modifikasi pada frame stack atau mengembalikan alamat dengan kode keluar fungsi. Demikian juga, pengacakan tumpukan dalam memori, dan pustaka sistem, menghambat keberhasilan serangan tersebut.

2.3.3 Heap Overflows

Dengan meningkatnya kesadaran akan masalah dengan buffer overflows pada stack dan pengembangan pertahanan terhadap mereka, penyerang telah mengalihkan perhatian mereka untuk mengeksploitasi overflows dalam buffer yang terletak di tempat lain di ruang alamat proses. Salah satu target yang mungkin adalah buffer yang terletak di memori yang dialokasikan secara dinamis dari heap. Tumpukan biasanya terletak di atas kode program dan data global dan tumbuh di memori (sementara tumpukan tumbuh ke arah itu).

Memori diminta dari tumpukan oleh program untuk digunakan dalam struktur data dinamis, seperti daftar catatan yang ditautkan. Jika catatan semacam itu berisi buffer yang rentan terhadap overflow, memori yang mengikutinya dapat rusak. Berbeda dengan stack, tidak akan ada alamat pengirim di sini untuk dengan mudah menyebabkan transfer kontrol. Namun, jika ruang yang dialokasikan mencakup pointer ke fungsi, yang kemudian dipanggil oleh kode, penyerang dapat mengatur agar alamat ini dimodifikasi agar mengarah ke shellcode di buffer yang ditimpa.

Biasanya, ini dapat terjadi ketika suatu program menggunakan daftar catatan untuk menampung potongan data saat memproses input / output atau mendekode file gambar atau video yang dikompresi. Selain memegang potongan data saat ini, catatan ini dapat berisi pointer ke fungsi yang memproses kelas input ini (sehingga memungkinkan berbagai kategori potongan data diproses oleh satu fungsi umum).

Kode seperti itu digunakan dan telah berhasil diserang. Sebagai contoh, perhatikan kode program yang ditunjukkan pada Gambar 10.11a. Ini mendeklarasikan struktur yang berisi buffer dan penunjuk fungsi.14 Pertimbangkan baris kode yang ditampilkan dalam rutin utama (). Ini menggunakan fungsi pustaka malloc () standar untuk mengalokasikan ruang untuk contoh baru dari struktur pada heap dan kemudian menempatkan referensi ke fungsi showlen () dalam penunjuk fungsinya untuk memproses buffer. Sekali lagi, rutin perpustakaan yang tidak aman () digunakan untuk menggambarkan salinan buffer yang tidak aman. Setelah ini, pointer fungsi dipanggil untuk diproses buffer.

Seorang penyerang, setelah mengidentifikasi suatu program yang mengandung kerentanan tumpukan luapan, akan menyusun urutan serangan sebagai berikut. Meneliti program ketika dijalankan akan mengidentifikasi bahwa ia biasanya terletak di alamat 0x080497a8 dan bahwa struktur hanya berisi buffer 64-byte dan kemudian pointer fungsi. Asumsikan penyerang akan menggunakan shellcode yang kami desain sebelumnya, Penyerang akan membuat shellcode ini tepat 64 byte dengan memperpanjang kereta luncur NOP di bagian depan dan kemudian menambahkan alamat target yang sesuai di buffer untuk menimpa fungsi pointer. Ini bisa 0x080497b8 (dengan byte terbalik karena x86 adalah little-endian seperti yang dibahas sebelumnya). 

Isi skrip serangan yang dihasilkan dan hasilnya diarahkan terhadap program rentan (sekali lagi diasumsikan sebagai root setuid), dengan keberhasilan pelaksanaan perintah shell yang diinginkan, privilege. Bahkan jika struktur rentan pada heap tidak secara langsung mengandung pointer fungsi, serangan telah ditemukan. Ini mengeksploitasi fakta bahwa area memori yang dialokasikan pada heap termasuk memori tambahan di luar yang diminta pengguna.

Memori tambahan ini menampung struktur data manajemen yang digunakan oleh rutinitas alokasi dan deallokasi perpustakaan. Struktur sekeliling ini dapat secara langsung atau tidak langsung memberikan akses penyerang ke fungsi pointer yang akhirnya disebut. Interaksi di antara beberapa overflow beberapa buffer bahkan dapat digunakan (satu memuat shellcode, yang lain menyesuaikan pointer fungsi target untuk merujuknya). Pertahanan terhadap heap overflows termasuk membuat heap juga tidak dapat dieksekusi. Ini akan memblokir eksekusi kode yang ditulis ke heap. Namun, varian panggilan kembali ke sistem masih dimungkinkan.

Mengacak alokasi memori pada heap membuat kemungkinan memprediksi alamat buffer yang ditargetkan menjadi sangat sulit, sehingga menggagalkan eksekusi yang sukses dari beberapa heap overflow attack. Selain itu, jika pengalokasi memori dan deallocator menyertakan pemeriksaan untuk korupsi data manajemen, mereka dapat mendeteksi dan membatalkan segala upaya untuk meluap di luar area memori yang dialokasikan.

2.3.4 Global Data Area Overflows

Kategori terakhir dari buffer overflows yang kami pertimbangkan melibatkan buffer yang terletak di area data global (atau statis) program. Gambar 10.4 menunjukkan bahwa ini diambil dari file program dan terletak di memori di atas kode program. Sekali lagi, jika operasi buffer yang tidak aman digunakan, data dapat meluap buffer global dan mengubah lokasi memori yang berdekatan, termasuk mungkin satu dengan pointer fungsi, yang kemudian disebut.

Desain serangannya sangat mirip; memang hanya alamat target yang berubah. Struktur global ditemukan di alamat 0x08049740, yang digunakan sebagai alamat target dalam serangan itu. Perhatikan bahwa variabel global biasanya tidak mengubah lokasi, karena alamatnya digunakan langsung dalam kode program.

Variasi yang lebih kompleks dari serangan ini mengeksploitasi fakta bahwa ruang alamat proses dapat berisi tabel manajemen lain di wilayah yang berdekatan dengan area data global. Tabel tersebut dapat mencakup referensi ke fungsi destruktor (ekstensi GCC C dan C ++), tabel offset global (digunakan untuk menyelesaikan referensi fungsi ke pustaka dinamis setelah mereka dimuat), dan struktur lainnya. Sekali lagi, tujuan serangan adalah untuk menimpa beberapa pointer fungsi yang diyakini penyerang akan dipanggil nanti oleh program yang diserang, mentransfer kontrol ke shellcode pilihan penyerang.

Pertahanan terhadap serangan semacam itu termasuk membuat area data global tidak dapat dieksekusi, mengatur pointer fungsi agar berada di bawah tipe data lainnya, dan menggunakan halaman penjaga antara area data global dan area manajemen lainnya.

2.3.5 Jenis Overflow lainnya

Di luar jenis kerentanan buffer yang telah kita bahas di sini, masih ada lebih banyak varian termasuk format string overflow dan integer overflow. Sangat mungkin bahwa lebih banyak akan ditemukan di masa depan. Referensi yang diberikan dalam Bacaan yang Direkomendasikan untuk bab ini mencakup rincian varian tambahan. Secara khusus, perincian kisaran serangan buffer overflow dibahas dalam [LHEE03] dan [VEEN12].

Pesan penting adalah bahwa jika program tidak dikodekan dengan benar di tempat pertama untuk melindungi struktur data mereka, maka serangan terhadap mereka dimungkinkan. Sementara pertahanan yang telah kita bahas dapat memblokir banyak serangan seperti itu,(yang merusak nilai variabel yang berdekatan dengan cara yang mengubah perilaku program yang diserang), tidak dapat diblokir kecuali dengan pengkodean untuk mencegah mereka.

Contoh Makalah Buffer Overflow


BAB III PENUTUP

3.1 Kesimpulan

1. Buffer Overflow, juga dikenal sebagai buffer overrun atau buffer overwrite, didefinisikan dalam Daftar Istilah NIST dari Ketentuan Keamanan Informasi Utama sebagai berikut: Buffer Overrun: Suatu kondisi pada antarmuka di mana input lebih banyak dapat ditempatkan ke dalam area buffer atau data holding daripada kapasitas yang dialokasikan, menimpa informasi lainnya. Penyerang mengeksploitasi kondisi seperti itu untuk menghancurkan sistem atau memasukkan kode yang dibuat khusus yang memungkinkan mereka untuk mendapatkan kendali atas system

2. Stack Buffer Overflows terjadi ketika buffer yang ditargetkan berada di tumpukan, biasanya sebagai variabel lokal dalam bingkai tumpukan fungsi. Bentuk serangan ini juga disebut sebagai stack smashing

3. Perthanan melawan Buffer Overflow dapat secara luas diklasifikasikan ke dalam dua kategori:
Compile-time defenses, yang bertujuan mengeraskan program untuk melawan serangan dalam program baru.
Run-time defenses, yang bertujuan untuk mendeteksi dan membatalkan serangan pada program yang ada. 

3.2 Saran

Makalah ini sangat jauh dari kesempurnaan, maka dari itu penulis sangat mengharapkan kritik dan saran untuk makalah ini. Semoga makalah ini bisa menjadi salah satu acuan dalam pembuatan makalah selanjutnya.  

0 Response to "Contoh Makalah Buffer Overflow"

Posting Komentar

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel