Anda di halaman 1dari 37

TUJUAN PEMBELAJARAN

Setelah mempelajari bab ini, Anda harus mampu:

Mendefinisikan apa buffer overflow, dan daftar konsekuensi yang

mungkin terjadi.
Jelaskan bagaimana overflow tumpukan penyangga bekerja secara

rinci
Mendefinisikan shellcode dan menjelaskan penggunaannya dalam

serangan buffer overflow


Daftar berbagai pertahanan terhadap serangan buffer overflow
Daftar berbagai jenis lain dari serangan buffer overflow

Dalam bab ini kita mengalihkan perhatian khusus untuk serangan buffer
overflow. Ini jenis serangan adalah salah satu serangan yang paling umum terlihat
dan hasil dari ceroboh pemrograman dalam aplikasi. J melihat daftar kerentanan
nasihat dari organisasi seperti CERT atau SANS terus menyertakan sejumlah
besar buffer overflow atau tumpukan melimpah eksploitasi, termasuk sejumlah
serius, jarak jauh kerentanan dieksploitasi. Demikian pula, beberapa item dalam
CWE / SANS Top Daftar 25 Most Dangerous Kesalahan Software, kategori
Manajemen Sumber Daya Risky, yang penyangga varian overflow. Ini dapat
mengakibatkan eksploitasi untuk kedua sistem operasi dan aplikasi umum. Namun
jenis serangan telah dikenal sejak pertama banyak digunakan oleh Internet Worm
Morris pada tahun 1988, dan teknik untuk mencegah kejadiannya sudah dikenal
dan didokumentasikan. Tabel 10.1 memberikan sejarah singkat dari beberapa
insiden yang lebih penting dalam sejarah eksploitasi buffer overflow. Sayangnya,
karena kedua warisan kode kereta di operasi banyak digunakan sistem dan
aplikasi dan terus praktek pemrograman ceroboh oleh programmer, masih
merupakan sumber utama yang menjadi perhatian praktisi keamanan. Bab ini
berfokus pada bagaimana buffer overflow terjadi dan metode apa yang dapat
digunakan untuk mencegah.
Kita mulai dengan pengenalan dasar-dasar buffer overflow. Lalu kita
Rincian hadir klasik tumpukan buffer overflow. Ini termasuk diskusi tentang
bagaimana fungsi menyimpan variabel lokal mereka pada stack dan konsekuensi

dari mencoba untuk menyimpan lebih banyak data di dalamnya dari ada ruang
yang tersedia. Kita lanjutkan dengan gambaran tentang tujuan dan desain
shellcode, yang merupakan kode kustom disuntikkan oleh penyerang dan mana
kendali dialihkan sebagai akibat dari buffer meluap. Berikutnya kita
mempertimbangkan cara-cara membela terhadap serangan buffer overflow. Kami
mulai dengan pendekatan yang jelas untuk mencegah mereka dengan tidak
menulis kode yang rentan untuk buffer overflows di tempat pertama. Namun,
mengingat besar, tubuh yang ada kode kereta, kita juga perlu mempertimbangkan
mekanisme hardware dan software yang dapat mendeteksi dan menggagalkan
serangan buffer overflow. Ini termasuk mekanisme untuk melindungi ruang
alamat executable, teknik untuk mendeteksi tumpukan modifikasi, dan pendekatan
yang mengacak tata letak ruang alamat untuk menghambat keberhasilan
pelaksanaan ini serangan.
Akhirnya, kita secara singkat survei beberapa teknik melimpah lainnya,
termasuk kembali ke system call dan tumpukan melimpah, dan menyebutkan
pertahanan terhadap ini.

Buffer Overflow Basics


Sebuah buffer overflow, juga dikenal sebagai buffer overrun, didefinisikan dalam
NIST Glossary Istilah Key Keamanan Informasi sebagai berikut:

Buffer Overrun Sebuah kondisi di antarmuka di mana lebih masukan bisa


ditempatkan ke daerah memegang bufer atau data dari kapasitas yang dialokasikan,
penimpaan Informasi lainnya. Penyerang memanfaatkan kondisi tersebut untuk
kecelakaan sistem atau menyisipkan khusus diciptakan kode yang
memungkinkan mereka untuk mendapatkan kontrol dari sistem.

Sebuah buffer overflow dapat terjadi sebagai akibat dari kesalahan


pemrograman ketika proses mencoba untuk menyimpan data di luar batas buffer
berukuran tetap dan akibatnya menimpa lokasi memori yang berdekatan. Lokasi
ini bisa menahan program lain variabel atau parameter atau data aliran kontrol
program seperti alamat kembali dan pointer ke tumpukan frame sebelumnya.
Buffer bisa berada di stack, dalam tumpukan, atau di bagian data proses.
Konsekuensi dari kesalahan ini meliputi korupsi data yang digunakan oleh
program, transfer tak terduga kontrol dalam program ini, mungkin pelanggaran
akses memori, dan sangat mungkin penghentian program akhirnya. Ketika
dilakukan dengan sengaja sebagai bagian dari serangan terhadap sistem, transfer
control bisa untuk kode pilih penyerang, sehingga kemampuan untuk
mengeksekusi sewenang-wenang kode dengan hak istimewa dari proses
menyerang.
Untuk

menggambarkan

operasi

dasar

dari

buffer

overflow,

mempertimbangkan fungsi utama C diberikan pada Gambar 10.1a. Ini berisi tiga
variabel (valid, str1, and str2),1 nilai-nilai yang biasanya akan disimpan dalam
lokasi memori yang berdekatan. Perintah dan Lokasi ini akan tergantung pada
jenis variabel (lokal atau global), bahasa dan compiler yang digunakan, dan
arsitektur mesin target. Namun, untuk tujuan tersebut dari contoh ini kita akan
mengasumsikan bahwa mereka akan disimpan dalam lokasi memori berturutturut, dari tertinggi ke terendah, seperti yang ditunjukkan pada Gambar 10.2. 2 ini
biasanya akan menjadi kasus untuk variabel lokal dalam fungsi C pada arsitektur
prosesor yang umum seperti Intel Keluarga Pentium. Tujuan dari kode fragmen
adalah untuk memanggil fungsi next_tag (str1) untuk menyalin ke str1 beberapa
nilai tag yang diharapkan. Mari kita menganggap ini akan menjadi START tali.
Kemudian membaca baris berikutnya dari input standar untuk program

menggunakan perpustakaan C mendapat () fungsi dan kemudian membandingkan


string dibaca dengan tag diharapkan. Jika baris berikutnya memang hanya berisi
string START, perbandingan ini akan berhasil, dan variabel VALID akan diatur
untuk TRUE.3 kasus ini ditunjukkan pada pertama dari program tiga contoh
berjalan pada Gambar 10.1b. 4 Setiap lainnya tag masukan akan meninggalkannya
dengan nilai SALAH. Seperti fragmen kode dapat digunakan untuk mengurai
beberapa terstruktur protokol jaringan interaksi atau file teks berformat.

Masalah dengan kode ini ada karena perpustakaan C tradisional mendapat ()


fungsi tidak mencakup pemeriksaan pada jumlah data yang disalin. Ini akan
membaca berikutnya baris teks dari input standar program sampai pertama baris 5
karakter terjadi dan menyalinnya ke dalam buffer yang disediakan diikuti oleh
terminator NULL digunakan dengan C string. 6 Jika lebih dari tujuh karakter yang
hadir pada baris masukan, ketika membaca di mereka akan (bersama dengan
terminating NULL karakter) memerlukan lebih banyak ruang daripada yang
tersedia dalam buffer str2. Akibatnya, karakter tambahan akan melanjutkan ke
menimpa nilai-nilai variabel yang berdekatan, str1 dalam kasus ini.
Mengetahui struktur kode pengolahan itu, penyerang bisa mengatur nilai ditimpa
untuk menetapkan nilai di str1 sama dengan nilai ditempatkan di str2, sehingga
perbandingan berikutnya berhasil. Sebagai contoh, input garis bisa menjadi string
BADINPUTBADINPUT. Hal ini menyebabkan perbandingan berhasil, seperti
yang ditunjukkan dalam ketiga dari program tiga contoh berjalan pada Gambar
10.1b dan diilustrasikan dalam Gambar 10.2, dengan nilai-nilai variabel lokal
sebelum dan sesudah panggilan untuk mendapat (). Perhatikan juga bahwa NULL
terminating untuk input string adalah ditulis ke lokasi memori berikut str1. Ini
berarti aliran kontrol dalam Program ini akan terus seolah-olah tag diharapkan

ditemukan, padahal sebenarnya tag baca adalah sesuatu yang sama sekali berbeda.
Ini akan hampir pasti menghasilkan Program perilaku yang tidak dimaksudkan.
Seberapa serius ini akan sangat tergantung pada logika dalam program
menyerang. Salah satu kemungkinan berbahaya terjadi jika bukannya tag, nilainilai dalam buffer tersebut yang diharapkan dan disediakan sandi yang diperlukan
untuk mengakses fitur istimewa. Jika demikian, buffer overflow memberikan
penyerang dengan berarti mengakses fitur ini tanpa benar-benar mengetahui
password yang benar. Untuk mengeksploitasi jenis buffer overflow, seperti yang
kita telah gambarkan di sini, kebutuhan penyerang :
1. Untuk mengidentifikasi kerentanan buffer overflow dalam beberapa program
yang bisa dipicu menggunakan data eksternal yang bersumber di bawah kendali
penyerang, dan
2. Untuk memahami bagaimana buffer yang akan disimpan dalam memori proses,
dan maka potensi lokasi memori yang berdekatan merusak dan berpotensi
mengubah aliran eksekusi program. Mengidentifikasi program rentan dapat
dilakukan dengan inspeksi program sumber, menelusuri pelaksanaan program
karena mereka memproses masukan besar, atau menggunakan alat seperti fuzzing,
yang kita bahas dalam Bab 11 0,2, untuk secara otomatis mengidentifikasi
program berpotensi rentan. Apa penyerang melakukan korupsi yang dihasilkan
memori bervariasi, tergantung pada nilai-nilai apa yang sedang ditimpa.
Stack Buffer Overflows
Sebuah stack overflow bufer terjadi ketika buffer ditargetkan terletak pada stack,
biasanya sebagai variabel lokal dalam fungsi ini stack frame. Bentuk serangan ini
juga disebut sebagai tumpukan menghancurkan. Stack serangan buffer overflow
telah dieksploitasi sejak yang pertama terlihat di alam liar di Internet Worm
Morris pada tahun 1988. eksploitasi itu digunakan termasuk sebuah buffer
overflow dicentang dihasilkan dari penggunaan C mendapat () fungsi dalam
daemon fingerd. Publikasi oleh Aleph One (Elias Levy) rincian dari serangan dan
bagaimana memanfaatkannya [LEVY96] mempercepat penggunaan lebih lanjut
dari teknik ini.

FUNCTION CALL MECHANISMS


Untuk lebih memahami bagaimana buffer overflows bekerja, kita pertama
mengambil penyimpangan singkat ke mekanisme yang digunakan oleh fungsi
program untuk mengelola negara lokal mereka pada setiap panggilan. Ketika salah
satu fungsi panggilan lain, setidaknya dibutuhkan suatu tempat untuk menyimpan
alamat kembali sehingga disebut fungsi dapat kembali kendali ketika selesai.
Selain itu, juga perlu lokasi untuk menyimpan parameter yang akan disahkan pada
untuk fungsi yang disebut dan juga mungkin untuk menyimpan daftar nilai-nilai
yang ingin melanjutkan menggunakan ketika disebut mengembalikan fungsi.
Semua data ini biasanya disimpan pada stack dalam struktur yang dikenal sebagai
stack frame.
Fungsi panggilan P
1. Mendorong parameter untuk disebut fungsi ke dalam stack (biasanya di urutan
terbalik dari deklarasi)
2. Melaksanakan instruksi panggilan untuk memanggil fungsi target, yang
mendorong kembali ke alamat stack.

Yang disebut fungsi Q

3. Dorong saat ini nilai frame pointer (yang menunjuk ke panggilan rutin ini
stack frame) ke stack
4. Mengatur frame pointer menjadi arus nilai stack pointer (yang adalah
alamat frame pointer tua), yang kini mengidentifikasi baru stack frame
lokasi untuk disebut fungsi
5. Alokasikan ruang untuk variabel lokal dengan memindahkan stack
pointer ke bawah untuk meninggalkan ruang yang cukup bagi mereka
6. Berjalan tubuh yang disebut fungsi
7. Seperti keluar terlebih dahulu menetapkan stack pointer kembali ke nilai
frame pointer (efektif membuang ruang yang digunakan oleh variabel lokal)
8. Pops tua nilai frame pointer (memulihkan link ke rutinitas panggilan itu
stack frame)
9. Menjalankan instruksi kembali yang muncul alamat disimpan dari
tumpukan dan kembali kontrol ke fungsi panggilan Terakhir, fungsi
panggilan
10. Pops parameter untuk fungsi yang disebut dari tumpukan
11. Terus eksekusi dengan instruksi mengikuti panggilan fungsi.

STACK OVERFLOW EXAMPLE


Pada titik ini, hal ini berguna untuk melangkah kembali dan mengambil
pandangan yang agak lebih luas sebuah program berjalan, dan penempatan daerah
kunci seperti kode program, data global, tumpukan dan tumpukan. Ketika
program dijalankan, sistem operasi biasanya menciptakan proses baru untuk itu.
Proses ini diberikan ruang alamat virtual sendiri, dengan struktur umum seperti
yang ditunjukkan pada Gambar 10.4.

Kita dapat menggambarkan proses ini menggunakan fungsi contoh yang


sama ditunjukkan pada Gambar 10.5a. Secara khusus, kita dapat menunjukkan
bagaimana buffer overflow dapat menyebabkan untuk memulai kembali
melaksanakan fungsi halo, ketimbang kembali ke rutinitas utama menelepon.
Untuk melakukan hal ini kita perlu mencari alamat di mana fungsi halo akan
dimuat. Ingat dari diskusi kami proses penciptaan, ketika sebuah program
dijalankan, kode dan data global dari file program disalin ke dalam proses alamat
virtual ruang dengan cara standar. Maka kode tersebut akan selalu ditempatkan di
lokasi yang sama. Cara termudah untuk menentukan ini adalah untuk menjalankan
debugger pada program target dan membongkar fungsi target. Ketika dilakukan
dengan contoh program yang mengandung fungsi halo pada sistem Knoppix yang
digunakan, fungsi halo adalah terletak di alamat 0x08048394. Jadi nilai ini harus
menimpa alamat pengirim lokasi. Pada saat yang sama, pemeriksaan kode
mengungkapkan bahwa INP penyangga adalah terletak 24 byte bawah frame
pointer saat ini.
Jadi sekarang kita telah menentukan byte yang diperlukan untuk membentuk
buffer overflow menyerang. Salah satu kompleksitas terakhir adalah bahwa nilainilai yang diperlukan untuk membentuk alamat sasaran tidak semua sesuai dengan

karakter yang dapat dicetak. Jadi beberapa cara yang diperlukan untuk
menghasilkan urutan biner yang tepat untuk masukan untuk program target.
Biasanya ini akan menjadi ditentukan dalam heksadesimal, yang kemudian harus
dikonversi ke biner, biasanya dengan beberapa program kecil. Untuk tujuan
demonstrasi ini, kita menggunakan sederhana satu baris Perl 8 Program, yang
pack () fungsi dapat dengan mudah digunakan untuk mengkonversi string
heksadesimal menjadi setara biner, seperti dapat dilihat pada ketiga contoh
program berjalan pada Gambar 10.5b. Menggabungkan semua elemen yang
tercantum

di

atas

hasil

dalam

heksadesimal

yang

String

41424344454647485152535455565758616263646566676808fcffbf948304080a4
e4e4e4e0a, yang dikonversi ke biner dan ditulis oleh Program perl. Output ini
kemudian disalurkan ke dalam program buffer2 yang ditargetkan, dengan hasil
seperti yang ditunjukkan pada Gambar 10.5b. Perhatikan bahwa cepat dan
tampilan nilai membaca diulang dua kali, menunjukkan bahwa fungsi halo
memang telah masuk kembali. Namun, seperti sekarang stack frame tidak berlaku
lagi, ketika ia mencoba untuk mengembalikan kedua kalinya itu melompat ke
lokasi memori ilegal, dan program crash. Tetapi telah melakukan apa penyerang
ingin pertama! Ada beberapa poin yang perlu diperhatikan dalam contoh ini.
Meskipun nilai tag disediakan adalah benar dalam prompt pertama, pada saat
respon ditampilkan, itu telah rusak. Hal ini disebabkan karakter NULL final
digunakan untuk mengakhiri string masukan yang ditulis dengan lokasi memori
hanya melewati alamat pengirim, di mana alamat dari parameter tag terletak. Jadi
beberapa byte memori acak yang digunakan bukan dari yang sebenarnya nilai.
Ketika fungsi halo dijalankan kedua kalinya, parameter tag adalah direferensikan
relatif terhadap sewenang-wenang, acak, ditimpa disimpan nilai pointer bingkai,
yang beberapa lokasi di memori atas, maka string sampah terlihat. Proses
serangan lebih lanjut diilustrasikan pada Gambar 10.6, yang menunjukkan nilainilai dari frame stack, termasuk INP penyangga lokal sebelum dan setelah
panggilan ke gets ().
MORE STACK OVERFLOW VULNERABILITIES

Sebelum melihat desain shellcode, ada beberapa hal yang perlu diperhatikan
tentang struktur fungsi ditargetkan dengan serangan buffer overflow. Dalam
semua contoh yang digunakan sejauh ini, buffer overflow sudah terjadi ketika
input dibacakan. Ini adalah pendekatan yang diambil dalam bufer serangan
overflow awal, seperti dalam Worm Morris. Namun, potensi untuk buffer
overflow ada di mana saja data yang akan disalin atau digabung ke dalam buffer,
di mana setidaknya beberapa data yang dibaca dari luar program. Jika program
tidak memeriksa untuk memastikan buffer cukup besar, atau data yang disalin
adalah dihentikan dengan benar, maka buffer overflow dapat terjadi.

Beberapa Rutinitas umum tidak aman C Standard Library

Shellcode
Komponen penting dari banyak serangan buffer overflow adalah transfer
eksekusi kode yang diberikan oleh penyerang dan sering disimpan dalam buffer
yang meluap. Kode ini dikenal sebagai shellcode, karena secara tradisional
fungsinya adalah untuk mentransfer kontrol untuk baris perintah pengguna
interpreter, atau shell, yang memberikan akses ke program apapun tersedia pada
sistem dengan hak istimewa dari program menyerang. pada UNIX sistem ini
sering dicapai dengan menyusun kode untuk panggilan ke execve yang ("/ Bin /
sh") fungsi sistem, yang menggantikan kode program saat ini dengan yang dari
shell Bourne (atau mana shell lainnya penyerang disukai). pada Windows sistem,
biasanya melibatkan panggilan ke sistem ("command.exe") fungsi (atau
"cmd.exe" pada sistem yang lebih tua) untuk menjalankan shell DOS Command.
Ini adalah alasan utama mengapa serangan buffer overflow biasanya
ditargetkan pada bagian tertentu dari perangkat lunak yang berjalan pada sistem
operasi tertentu. Karena shellcode adalah kode mesin, menulis itu secara
tradisional diperlukan pemahaman yang baik tentang bahasa assembly dan
pengoperasian sistem target. Memang banyak panduan klasik untuk menulis
shellcode, termasuk asli [LEVY96], diasumsikan pengetahuan tersebut. Namun,
baru-baru ini nomor situs dan alat telah dikembangkan yang mengotomatisasi
proses ini (karena memang memiliki terjadi dalam pengembangan eksploitasi
keamanan umum), sehingga membuat pembangunan dari shellcode eksploitasi
tersedia untuk khalayak potensial yang jauh lebih besar.

SHELLCODE DEVELOPMENT

Untuk

menyoroti

struktur

dasar

shellcode,

kami

mengeksplorasi

pengembangan serangan shellcode klasik yang sederhana, yang hanya


meluncurkan Bourne shell pada sistem Intel Linux. Shellcode perlu menerapkan
fungsi yang ditunjukkan pada Gambar 10.8a. Marsekal shellcode yang diperlukan
argumen untuk execve () fungsi sistem, termasuk argumen minimal sesuai dan
daftar lingkungan, dan kemudian memanggil fungsi. Untuk menghasilkan
shellcode, tingkat tinggi spesifikasi bahasa ini terlebih dahulu harus dikompilasi
menjadi setara bahasa mesin.

Tumpukan frame ini diciptakan satu di bawah yang lain, bekerja turun dari
puncak stack sebagai aliran eksekusi dalam program target memiliki fungsi
memanggil fungsi lainnya. Jumlah frame dan lokasi maka akhir dari buffer akan
tergantung pada urutan yang tepat dari fungsi panggilan yang mengarah ke fungsi
yang ditargetkan.
Mengingat keterbatasan di atas, apa hasil dari proses desain ini adalah kode yang
sama dengan yang ditunjukkan pada Gambar 10.8b. Kode ini ditulis dalam bahasa
assembly x86, 10 seperti yang digunakan oleh prosesor Pentium. Untuk
membantu dalam membaca kode ini, Tabel 10.3 memberikan daftar x86 umum
instruksi bahasa assembly, dan Tabel 10.4 daftar beberapa mesin umum register
itu referensi. Lebih 11 Banyak detail pada x86 perakitan bahasa dan organisasi
mesin dapat ditemukan dalam [STAL10]. Secara umum, kode di Gambar 10.8b
mengimplementasikan fungsi yang ditetapkan dalam program asli C di Gambar
10.8a. Namun, dalam rangka untuk mengatasi keterbatasan yang disebutkan di
atas, ada adalah beberapa fitur unik.

Seperti yang disusun oleh default, ini akan diasumsikan bagian dari wilayah
data global program. Tapi untuk digunakan di shellcode itu harus disertakan
bersama dengan petunjuk, biasanya terletak hanya setelah mereka. Dalam rangka
untuk kemudian merujuk ke string ini, kode harus menentukan alamat di mana ia
berada, relatif terhadap alamat instruksi saat. Hal ini dapat dilakukan melalui
novel, penggunaan yang tidak standar dari instruksi PANGGILAN.
Dengan latar belakang ini, Anda sekarang harus mampu melacak melalui
dihasilkan tersebut assembler shellcode tercantum pada Gambar 10.8b. Secara
singkat, kode ini,
Menentukan alamat string konstan menggunakan JMP / PANGGILAN trik
nol isi% eax dan salinan nilai ini ke akhir dari string konstan
Menyimpan alamat string yang di args [0]
nol nilai args [1]
Marshals argumen untuk sistem panggilan yang
-The Nomor kode untuk sistem execve panggilan (11)
-The Alamat string sebagai nama program untuk memuat
-The Alamat array args sebagai daftar argumen
-The Alamat args [1], karena itu adalah NULL, sebagai (kosong) daftar
lingkungan
Menghasilkan interrupt software untuk menjalankan system call ini (yang
tidak pernah kembali)

EXAMPLE OF A STACK OVERFLOW ATTACK


Kami sekarang memiliki semua komponen diperlukan untuk memahami
serangan stack overflow. Untuk menggambarkan bagaimana serangan itu
sebenarnya dieksekusi, kita menggunakan program sasaran yang merupakan
varian dari yang ditampilkan di Gambar 10.5a. Program ini dimodifikasi memiliki
ukuran buffer yang meningkat menjadi 64 (untuk memberikan cukup ruang untuk
shellcode kami), memiliki masukan unbuffered (sehingga tidak ada nilai-nilai
yang hilang ketika Bourne shell diluncurkan), dan telah dibuat setuid root. Ini
berarti ketika
dijalankan, program dijalankan dengan hak superuser / administrator, dengan
lengkap akses ke sistem. Ini mensimulasikan serangan di mana seorang penyusup
telah memperoleh akses untuk beberapa sistem sebagai user biasa dan keinginan
untuk mengeksploitasi buffer overflow dalam Situs utilitas untuk mendapatkan
hak yang lebih besar.
Setelah mengidentifikasi, rentan, program utilitas dipercaya cocok,
penyerang telah melakukan analisa untuk menentukan lokasi kemungkinan buffer
ditargetkan pada stack dan berapa banyak data yang diperlukan untuk mencapai
hingga meluap dan frame pointer tua dan kembali alamat di stack frame nya.
Untuk melakukan hal ini, penyerang biasanya menjalankan program target
menggunakan debugger pada jenis yang sama dari sistem seperti yang menjadi
target.
Penyerang juga harus menentukan perintah yang akan dijalankan oleh shell
setelah serangan berhasil. Ini juga harus ditulis untuk program target, sebagai
menelurkan Bourne shell akan membaca dari input standar yang sama dengan
program yang digantikannya. Dalam contoh ini, kita akan menjalankan dua
perintah UNIX:
1. whoami menampilkan identitas pengguna yang hak saat ini sedang bekas.
2. cat / etc / shadow menampilkan isi dari file password shadow, memegang
password terenkripsi pengguna, yang hanya superuser memiliki akses ke.

Contoh ini mensimulasikan mengeksploitasi kerentanan lokal pada sistem,


memungkinkan penyerang untuk meningkatkan hak-nya. Dalam prakteknya,
buffer mungkin akan lebih besar (1.024 menjadi ukuran umum), yang berarti
kereta luncur NOP akan Sejalan lebih besar, dan akibatnya alamat target menduga
tidak perlu seakurat bertekad. Juga, dalam praktek utilitas ditargetkan akan
cenderung menggunakan buffered daripada masukan unbuffered. Ini berarti
bahwa perpustakaan masukan berbunyi depan dengan beberapa jumlah
melampaui apa program ini telah diminta. Namun, ketika execve yang ("/ bin /
sh") fungsi disebut, masukan buffer ini dibuang. Jadi penyerang perlu pad
masukan dikirim ke program dengan garis yang cukup kosong (biasanya sekitar
1000+ karakter layak) sehingga perintah shell yang diinginkan tidak termasuk
dalam ini dibuang buffer konten. Hal ini mudah dilakukan (hanya selusin laporan
cetak lebih banyak di Program perl), tetapi itu akan membuat contoh ini bulkier
dan kurang jelas.

Program ini ditargetkan tidak perlu menjadi sistem utilitas dipercaya. lain
mungkin Target adalah program menyediakan layanan jaringan; yaitu, daemon

jaringan. Biasa Pendekatan untuk program tersebut mendengarkan permintaan


sambungan dari klien dan kemudian pemijahan proses anak untuk menangani
permintaan itu.

Kita telah melihat bahwa menemukan dan memanfaatkan overflow


tumpukan bufer tidak begitu sulit. Banyaknya eksploitasi selama beberapa dekade
sebelumnya jelas menggambarkan hal ini. Ada akibatnya kebutuhan untuk
mempertahankan sistem terhadap serangan tersebut dengan baik mencegah
mereka, atau setidaknya mendeteksi dan batal serangan tersebut. Bagian ini
membahas kemungkinan pendekatan untuk menerapkan perlindungan tersebut. Ini
dapat luas diklasifikasikan menjadi dua kategori:
pertahanan Kompilasi-waktu, yang bertujuan untuk mengeras program untuk
melawan serangan di baru program
pertahanan Run-time, yang bertujuan untuk mendeteksi dan membatalkan
serangan yang ada di program.
Compile-Time Defenses
Waktu kompilasi pertahanan bertujuan untuk mencegah atau mendeteksi buffer
overflows oleh instrumenting program ketika disusun.
CHOICE OF PROGRAMMING LANGUAGE
Salah satu kemungkinan, seperti disebutkan sebelumnya, adalah untuk menulis
program menggunakan bahasa pemrograman tingkat tinggi modern, salah satu
yang memiliki kuat Gagasan jenis variabel dan apa yang merupakan operasi
diperbolehkan pada mereka. Seperti itu bahasa tidak rentan terhadap serangan
buffer overflow karena kompiler mereka termasuk kode tambahan untuk
menegakkan berbagai pemeriksaan otomatis, menghilangkan kebutuhan bagi
programmer untuk secara eksplisit kode mereka. Fleksibilitas dan keamanan yang
diberikan oleh bahasa ini tidak datang dengan biaya dalam penggunaan
sumberdaya, baik pada waktu kompilasi dan juga dalam kode tambahan yang
harus dijalankan pada waktu berjalan untuk memaksakan pemeriksaan seperti

yang pada batas penyangga. Kerugian ini jauh lebih signifikan daripada dulu
menjadi, karena peningkatan pesat dalam kinerja prosesor. Program yang semakin
yang ditulis dalam bahasa ini dan karenanya harus kebal terhadap buffer overflow
dalam kode mereka (meskipun jika mereka menggunakan sistem perpustakaan
yang ada atau run-waktu eksekusi lingkungan yang ditulis dalam bahasa kurang
aman, mereka mungkin masih rentan).
SAFE CODING TECHNIQUES
Jika bahasa seperti C yang digunakan, maka programmer perlu menyadari bahwa
kemampuan mereka untuk memanipulasi alamat pointer dan akses memori
langsung datang pada biaya. Telah dicatat bahwa C dirancang sebagai bahasa
pemrograman sistem, yang berjalan pada sistem yang jauh lebih kecil dan lebih
dibatasi dari sekarang kita gunakan. Dalam rangka mengeras sistem ini,
pemrogram perlu memeriksa kode dan menulis ulang setiap coding konstruksi
yang tidak aman dengan cara yang aman. Mengingat serapan cepat buffer
eksploitasi overflow, proses ini telah dimulai dalam beberapa kasus. Sebuah
contoh yang baik adalah proyek OpenBSD, yang menghasilkan berbasis 4.4BSDbebas, multiplatform Sistem operasi UNIX-like.
Sekali lagi masalahnya adalah bahwa kode berikut tidak diberikan informasi
tentang ukuran buffer dan karenanya tidak mampu untuk memeriksa kemungkinan
overflow. Contoh-contoh ini menekankan baik kebutuhan untuk selalu
memverifikasi jumlah ruang yang digunakan dan fakta bahwa masalah dapat
terjadi baik dengan kode C polos, serta dari memanggil rutinitas perpustakaan
standar.

LANGUAGE EXTENSIONS AND USE OF SAFE LIBRARIES


Mengingat masalah yang dapat terjadi pada C dengan aman array dan
pointer referensi, telah ada jumlah proposal untuk menambah compiler untuk
secara otomatis memasukkan berbagai pemeriksaan pada referensi tersebut.
Sementara ini cukup mudah untuk array statis dialokasikan, penanganan memori
dinamis dialokasikan lebih bermasalah, karena informasi ukuran tidak tersedia
pada waktu kompilasi. Penanganan ini memerlukan perpanjangan semantic dari
pointer

untuk

memasukkan

batas

informasi

dan

penggunaan

rutinitas

perpustakaan untuk memastikan nilai-nilai ini diatur dengan benar. Beberapa


pendekatan seperti tercantum dalam [LHEE03]. Namun, umumnya ada hukuman
kinerja dengan penggunaan teknik seperti yang mungkin atau mungkin tidak dapat
diterima. Teknik ini juga mengharuskan semua program dan perpustakaan yang
membutuhkan fitur keselamatan tersebut dikompilasi ulang dengan modifikasi
penyusun. Meskipun hal ini dapat menjadi layak untuk rilis baru dari sistem
operasi dan yang utilitas terkait, masih akan cenderung menjadi masalah dengan
aplikasi pihak ketiga.
STACK PROTECTION MECHANISMS
An effective method for protecting programs against classic stack overflow
attacks is to instrument the function entry and exit code to setup and then check its
stack frame for any evidence of corruption. If any modification is found, the
program is aborted rather than allowing the attack to proceed. There are several
approaches to providing this protection, which we discuss next.
Run-Time Defenses
Seperti telah dicatat, sebagian besar pendekatan kompilasi-waktu membutuhkan
kompilasi ulang program yang ada. Oleh karena itu ada kepentingan dalam
pertahanan run-time yang dapat digunakan sebagai sistem operasi update untuk
memberikan perlindungan bagi yang ada rentan program. Pertahanan ini
melibatkan perubahan pada manajemen memori virtual ruang alamat proses.
Perubahan ini bertindak baik mengubah sifat dari daerah memori, atau untuk

membuat memprediksi lokasi buffer ditargetkan cukup sulit untuk menggagalkan


berbagai jenis serangan.
EXECUTABLE ADDRESS SPACE PROTECTION
Teknik run-time lain yang dapat digunakanuntuk menggagalkan serangan
melibatkan manipulasi lokasi struktur data kunci dalamproses mengatasi ruang.
Secara khusus, ingat bahwa dalam rangka melaksanakan klasiktumpukan serangan
overflow, penyerang harus mampu memprediksi perkiraanlokasi buffer yang
ditargetkan.

Penyerang

menggunakan

alamat

diprediksi

ini

untuk

menentukanalamat pengirim yang cocok untuk digunakan dalam serangan itu


untuk mentransfer kontrol untuk shellcode.Satuteknik untuk lebih meningkatkan
kesulitan prediksi ini adalah untuk mengubah alamatdi mana tumpukan terletak
dalam cara acak untuk setiap proses. Kisaranalamat yang tersedia di prosesor
modern besar (32 bit), dan sebagian besar program hanyamembutuhkan sebagian
kecil dari itu. Oleh karena itu, bergerak wilayah tumpukan memori sekitar
denganmegabyte atau lebih memiliki dampak minimal pada sebagian besar
program tapi membuat memprediksialamat penyangga ditargetkan hampir
mustahil. Jumlah ini variasi juga jauhlebih besar dari ukuran yang paling rentan
buffer, sehingga tidak ada kesempatan memiliki besarcukup NOP kereta luncur
untuk

menangani

ini

berbagai

alamat.

Sekali

lagi

ini

menyediakan

tingkatperlindungan bagi program yang ada, dan sementara itu tidak dapat
menghentikan

serangan

melanjutkan,

yangProgram

hampir

pasti

akan

membatalkan karena referensi memori yang tidak valid.


Terkait dengan pendekatan ini adalah penggunaan alokasi memori
dynamic random ( untuk malloc ( ) dan rutinitas perpustakaan terkait ) . Seperti
yang kita bahas dalam Bagian 10.3,adakelas serangan tumpukan buffer overflow
yang mengeksploitasi kedekatan diharapkan dari succes alokasi memori sive , atau
memang susunan data manajemen tumpukanstruktur . Mengacak alokasi memori
di heap membuat possibil yang memprediksi alamat buffer ditargetkan sangat
sulit,sehingga

menggagalkankeberhasilan

tumpukan overflow.

pelaksanaan

beberapa

serangan

Target lain dari serangan adalah lokasi rutinitas perpustakaan standar .


dalam sebuah mencoba untuk memotong perlindungan seperti tumpukan
nonexecutable,beberapa

buffer

overflowvarian

mengeksploitasi

kode

di

perpustakaan standar yang ada . Ini biasanya dimuat padaalamat yang sama
dengan program yang sama . Untuk mengatasi bentuk serangan , kita dapat
menggunakanekstensi keamanan yang merandomisasi urutan perpustakaan
memuat standar olehProgram dan lokasi alamat memori virtual mereka . Hal ini
membuat alamat dari setiapfungsi tertentu cukup tak terduga untuk membuat
kesempatan serangan yang diberikanbenar memprediksi alamatnya , sangat rendah
.Sistem OpenBSD termasuk versi dari semua ekstensi ini di -teknik
yangdukungan nological untuk sistem yang aman .
GUARD PAGES
GUARDSebuah teknik runtime akhir yang dapat digunakan halaman tempat
penjagaantara daerah kritis memori dalam proses mengatasi ruang. Sekali lagi,
inimengeksploitasi fakta bahwa proses memiliki memori lebih virtual yang
tersedia dariitu biasanya membutuhkan. Kesenjangan ditempatkan antara rentang
alamat yang digunakan untuk setiapkomponen dari ruang alamat, seperti yang
diilustrasikan pada Gambar 10.4. Inikesenjangan, atau halaman penjaga, yang
ditandai di MMU sebagai alamat ilegal, dan setiap upayauntuk mengaksesnya
hasil dalam proses yang dibatalkan. Hal ini dapat mencegah bufferserangan
overflow, biasanya data global, yang mencoba untuk menimpa berdekatandaerah
dalam proses mengatasi ruang, seperti meja diimbangi global, seperti yang kita
bahasdalam Bagian 10.3.Sebuah perpanjangan menempatkan halaman guard
antara tumpukan frame atau antara-bedaalokasi di heap. Ini dapat memberikan
perlindungan lebih lanjut terhadap stack danmenimbun lebih serangan aliran,
tetapi dengan biaya di waktu eksekusi mendukung sejumlah besarpemetaan
halaman yang diperlukan.

Pada bagian ini , kita membahas beberapa serangan buffer overflow lain
yang memiliki dieksploitasi dan mempertimbangkan kemungkinan pertahanan.Ini
termasuk variasi pada stack overflows, seperti kembali ke system call , meluap
dari data yang disimpan dalam program tumpukan , dan limpahan data yang
disimpan dalam proses bagian data global . A lebih survei rinci dari berbagai
kemungkinan serangan dapat ditemukan di [ LHEE03 ] .
Replacement Stack Frame
Dalam klasik tumpukan buffer overflow , penyerang menimpa penyangga
yang terletak di daerah variabel lokal dari stack frame dan kemudian menimpa
frame pointer disimpan dan kembali alamat.Varian dari serangan ini menimpa
buffer dan disimpan bingkaialamat pointer . Disimpan nilai pointer frame berubah
untuk merujuk ke lokasidekat bagian atas buffer ditimpa , di mana tumpukan
bingkai boneka telah diciptakan dengan alamat kembali menunjuk ke shellcode
yang lebih rendah dalam buffer . Berikut
perubahan ini , fungsi saat kembali ke pemanggilan fungsi sebagai normal, sejak
alamat pengirim belum berubah.Namun, fungsi panggilan sekarang menggunakan
penggantian bingkai boneka , dan saat kembali , kontrol ditransfer ke shellcode
dalam buffer ditimpa
Hal ini mungkin tampak serangan yang agak tidak langsung, tetapi bisa
digunakan ketika hanyaterbatas buffer overflow adalah mungkin, salah satu yang
memungkinkan perubahan ke frame disimpanpointer tetapi tidak alamat pengirim.
Anda mungkin ingat program contoh yang ditunjukkanpada Gambar 10.7 hanya
diizinkan cukup konten penyangga tambahan untuk menimpabingkai pointer
tetapi tidak kembali alamat. Contoh ini mungkin tidak bisa menggunakan
iniserangan, karena NULL Trailing akhir, yang berakhir string dibaca ke
dalampenyangga, akan mengubah baik frame pointer disimpan atau kembali
alamat dengan cara yangbiasanya akan menggagalkan serangan. Namun, ada
kategori lain dari tumpukanbuffer overflows dikenal sebagai off-per-satu
serangan. Ini dapat terjadi dalam buffer binercopy kode ketika programmer sudah

termasuk untuk memeriksa jumlah byte menjadiditransfer, namun karena


kesalahan coding, memungkinkan hanya satu lagi byte yang akan disalindaripada
ada ruang yang tersedia. Ini biasanya terjadi ketika menggunakan tes bersyarat
dari pada, atau dari pada. Jika buffer terletak langsung di bawah frame pointer
disimpan, kemudian 13 byte tambahan ini bisa mengubah pertama (setidaknya
signifikantidak bisa byte pada prosesor x86) dari alamat ini. Sementara mengubah
satu byte tidak mungkintampaknya banyak, mengingat bahwa penyerang hanya
ingin mengubah alamat ini dari nyatasebelumnya stack frame (tepat di atas frame
di memori) ke dummy barubingkai terletak di buffer dalam frame, perubahan
biasanya hanyaperlu beberapa puluh byte. Dengan keberuntungan di alamat yang
digunakan, satu-bytePerubahan mungkin semua yang diperlukan. Oleh karena itu
serangan meluap mentransfer kontrol untukshellcode adalah mungkin, bahkan jika
tidak langsung.
Ada beberapa keterbatasan tambahan pada serangan ini . Dalam klasik
tumpukan berlebihan serangan aliran,penyerang hanya perlu menebak alamat
perkiraan untuk buffer ,karena beberapa kendur bisa diambil di kereta luncur NOP
. Namun, untuk ini tidak langsungserangan untuk bekerja , penyerang harus tahu
alamat penyangga tepat , sebagai yang tepatalamat dummy stack frame harus
digunakan ketika Timpa bingkai tuanilai pointer . Hal ini dapat secara signifikan
mengurangi kesempatan serangan itu sukses. Lainmasalah bagi penyerang terjadi
setelah kontrol telah kembali ke fungsi panggilan.Karena fungsi ini sekarang
menggunakan boneka stack frame , setiap variabel lokal itu menggunakan
sekarang tidak sah, dan penggunaan mereka dapat menyebabkan program untuk
kecelakaan sebelum inifungsi selesai dan kembali ke shellcode. Namun, ini adalah
risiko dengan sebagian besartumpukan Timpa serangan .
Pertahanan terhadap jenis serangan termasuk salah satu perlindungan
tumpukan mechanisms untuk mendeteksi modifikasi stack frame atau kembali
alamat dengan fungsi kode keluar.Juga,menggunakan nonexecutable tumpukan
blok eksekusi shellcode meskipun ini saja tidak akan mencegah varian tidak
langsung

kembali

ke

sistem

yangSerangan

panggilan

kami

akan

mempertimbangkan berikutnya . Pengacakan dari stack dalam memori

danperpustakaan sistem akan baik bertindak untuk lebih menghambat kemampuan


penyerang untuk menebakalamat yang benar untuk menggunakan dan karenanya
menghalangi keberhasilan pelaksanaan serangan itu .
Return to System Call
Mengingat pengenalan tumpukan nonexecutable sebagai pertahanan
terhadap penyangga overflows , penyerang telah berpaling ke serangan varian di
mana alamat pengirim 13Perhatikan bahwa sementara ini tidak terjadi dengan
compiler GCC digunakan untuk contoh dalam bab ini , itu adalah pengaturan
umum dengan banyak kompiler lain . diubah untuk melompat ke kode yang ada
pada sistem. Anda mungkin ingat kami mencatat inisebagai pilihan ketika kita
meneliti dasar-dasar serangan stack overflow. Kebanyakan Kendala ini alamat dari
fungsi perpustakaan standar yang dipilih, seperti sistem ()fungsi. Penyerang
menentukan overflow yang mengisi buffer, menggantikan disimpanframe pointer
dengan alamat yang sesuai, menggantikan alamat pengirim dengan alamatfungsi
perpustakaan yang diinginkan, menulis nilai placeholder bahwa fungsi
perpustakaanakan percaya adalah alamat pengirim, dan kemudian menulis nilainilai satu (atau lebih) parameter-fungsi perpustakaan ini. Ketika menyerang
kembali fungsi, itu mengembalikan(dimodifikasi) frame pointer, kemudian
muncul dan transfer kontrol ke alamat pengirim,yang menyebabkan kode dalam
fungsi perpustakaan untuk mulai menjalankan. Karena fungsi yangpercaya telah
disebut, memperlakukan nilai saat ini di atas tumpukan(placeholder) sebagai
alamat

pengirim,

dengan parameter

di atas

itu. Pada gilirannya

itu

akanmembangun kerangka baru di bawah lokasi ini dan menjalankan.


Jika fungsi perpustakaan yang disebut , misalnya , sistem ( " shell baris
mand " ) , maka perintah shell yang ditentukan akan dijalankan sebelum
kontrolkembali ke program diserang , yang kemudian akan kemungkinan besar
kecelakaan . Bergantung kepadajenis parameter dan interpretasi mereka dengan
fungsi perpustakaan , penyerang mungkin perlu tahu persis alamat mereka
( biasanya dalam buffer ditimpa ) .Dalam contoh ini , meskipun, " baris perintah
shell " dapat diawali dengan lari dari ruang , yang akan diperlakukan sebagai

ruang putih dan diabaikan oleh shell, sehingga allowing beberapa kelonggaran
dalam keakuratan menebak alamat . Lain rantai varian dua perpustakaan
panggilan satu demi satu. Ini bekerja dengan membuat nilai placeholder (yang
fungsi perpustakaan pertama disebut sebagai yang memperlakukan alamat pulang)
menjadi alamat dari fungsi kedua. Maka parameter untuk masing-masing telah
menjadi sesuai terletak di stack, yang umumnya membatasi fungsi apa bisa
disebut, dan dalam rangka apa. Penggunaan umum dari teknik ini membuat
pertama mengatasi bahwa dari strcpy () fungsi perpustakaan. Parameter yang
ditentukan menyebabkan itu untuk menyalin beberapa shellcode dari buffer
menyerang ke wilayah lain memori yang tidak ditandai nonexecutable. Alamat
poin kedua ke alamat tujuan untuk yang shellcode disalin. Hal ini memungkinkan
penyerang untuk menyuntikkan kode mereka sendiri tetapi memilikinya
menghindari tumpukan keterbatasan nonexecutable.
Sekali lagi, pertahanan terhadap ini termasuk salah satu mekanisme
perlindungan stack untuk mendeteksi modifikasi stack frame atau kembali alamat
dengan kode fungsi keluar.Demikian juga, pengacakan dari tumpukan dalam
memori, dan perpustakaan sistem, merintangikeberhasilan pelaksanaan serangan
tersebut.
Heap Overflows
Dengan meningkatnya kesadaran masalah dengan buffer overflows pada
stack dan pengembangan pertahanan melawan mereka , penyerang telah
mengalihkan perhatian mereka kemengeksploitasi overflows di buffer terletak di
tempat lain di ruang alamat proses. SatuTarget yang mungkin adalah buffer
terletak di memori dinamis dialokasikan dari tumpukan .Tumpukan biasanya
terletak di atas kode program dan data global dan tumbuhdalam memori
(sementara tumpukan tumbuh ke arah itu ) . Memori diminta daritumpukan oleh
program untuk digunakan dalam struktur data dinamis, seperti daftar link dari
catatan

.Jika

catatan

tersebut

berisi

buffer

rentan

meluap,

memori

mengikutinyadapat rusak . Tidak seperti tumpukan , tidak akan kembali alamat di


sini untuk mudah menyebabkan transfer kontrol. Namun, jika ruang yang

dialokasikan termasuk pointer ke fungsi, yang kode ang kemudian memanggil,


penyerang dapat mengatur inialamat untuk dimodifikasi untuk menunjuk ke
shellcode dalam buffer ditimpa . Khas,ini mungkin terjadi ketika sebuah program
menggunakan

daftar

catatan

untuk

memegang

potongan

data

sementarapengolahan input / output atau decoding gambar atau video yang file
terkompresi . Sebaikmemegang sepotong saat data , catatan ini mungkin berisi
pointer ke fungsipengolahan kelas ini masukan ( sehingga memungkinkan
berbagai kategori potongan data yang akandiproses oleh satu fungsi generik ) .
Kode tersebut digunakan dan telah berhasilterserang.
Sebagai contoh, perhatikan kode program yang ditunjukkan pada Gambar
10.11a . Ini menyatakan struktur yang mengandung buffer dan fungsi pointer.14
Pertimbangkan baris kode yang ditunjukkan di main () rutin . Ini menggunakan
malloc standar ( ) fungsi perpustakaan untuk mengalokasikan ruang untuk contoh
baru dari struktur di heap dan kemudian menempatkan referensi ke fungsi
showlen ( ) dalam fungsi pointer untuk memproses buffer . Sekali lagi, tidak aman
mendapat ( ) perpustakaan rutin digunakan untuk menggambarkan salinan
penyangga tidak aman . Berikut ini , fungsi pointer dipanggil untuk memproses
buffer .
Seorang penyerang , setelah diidentifikasi program yang berisi tumpukan
seperti berlebihan mengalir kerentanan , akan membangun urutan serangan
sebagai berikut. memeriksaprogram ketika berjalan akan mengidentifikasi bahwa
itu biasanya terletak di alamat0x080497a8 dan bahwa struktur hanya berisi buffer
64 - byte dan kemudianfungsi pointer. Asumsikan penyerang akan menggunakan
shellcode kita dirancang sebelumnya ,ditunjukkan pada Gambar 10.8 . Penyerang
akan pad shellcode ini persis 64 byte olehmemperluas kereta luncur NOP di depan
dan kemudian tambahkan alamat target yang cocok dibuffer untuk menimpa
fungsi pointer . Ini bisa 0x080497b8 ( dengan byteterbalik karena x86 adalah
little-endian seperti yang dibahas sebelumnya ) . Gambar 10.11b menunjukkanIsi
serangan script yang dihasilkan dan hasil itu diarahkan terhadapProgram rentan
( lagi diasumsikan setuid root ) dengan keberhasilan pelaksanaandari yang
diinginkan , perintah shell istimewa . Bahkan jika struktur rentan di heap tidak

langsung mengandung fungsi pointer , serangan telah ditemukan . Ini


memanfaatkan fakta bahwa dialokasikandaerah memori di heap termasuk memori
tambahan di luar apa yang userdiminta . Memori tambahan ini memegang struktur
manajemen data yang digunakan olehalokasi memori dan dealokasi perpustakaan
rutinitas . Ini struktur sekitarnyamungkin baik secara langsung atau tidak langsung
memberikan akses penyerang untuk fungsi pointer yangakhirnya disebut .
Interaksi antara beberapa overflows beberapa buffer mungkinbahkan dapat
digunakan ( salah satu pemuatan shellcode , lain menyesuaikan fungsi sasaran
pointeruntuk merujuk ke sana ) .Pertahanan terhadap tumpukan overflows
termasuk membuat tumpukan juga nonexecutable .
Ini akan memblokir eksekusi kode yang ditulis ke dalam tumpukan .
Namun, varian dari panggilan kembali-ke - sistem masih mungkin . Mengacak
alokasi memori di heap membuat kemungkinan memprediksi alamat buffer
ditargetkan sangat sulit, sehingga menggagalkan keberhasilan pelaksanaan
beberapa timbunan overflow serangan . Selain itu , jika pengalokasi memori dan
deallocator termasuk pemeriksaan untuk korupsi dari data manajemen , mereka
bisa mendeteksi dan membatalkan setiap upaya untuk melimpah di luar daerah
yang dialokasikan dari memori .
14Realistis , struktur tersebut akan memiliki lebih banyak bidang, termasuk
bendera dan pointer ke struktur- lain seperti membangun struktur sehingga
mereka dapat dihubungkan bersama-sama . Namun, serangan dasar yang kita
bahas di sini , dengan sedikit modifikasi ,masih akan bekerja .

Global Data Area Overflows


Sebuah kategori terakhir dari buffer overflows kita pertimbangkan
melibatkan buffer terletak diglobal ( atau statis ) area data program . Gambar 10.4
menunjukkan bahwa ini diambil darifile program dan terletak di memori di atas
kode program.Sekali lagi, jika tidak amanoperasi penyangga yang digunakan ,
data dapat meluap buffer global dan mengubah berdekatanlokasi memori ,
termasuk mungkin satu dengan pointer fungsi , yang kemudian selanjutnya
disebut .Gambar 10.12a menggambarkan program rentan ( yang berbagi banyak
Serupa larities dengan Gambar 10.11a , kecuali bahwa struktur dinyatakan sebagai
variabel global ) .Desain serangan ini sangat mirip ; memang hanya perubahan
alamat target . Itustruktur global yang ditemukan di alamat 0x08049740 , yang
digunakan sebagaialamat target dalam serangan itu . Perhatikan bahwa variabel
global biasanya tidak mengubah lokasi,sebagai alamat mereka digunakan secara
langsung dalam kode program . Script serangan danHasil berhasil dijalankan
ditunjukkan pada Gambar 10.12b .
Variasi yang lebih kompleks dari serangan ini memanfaatkan fakta bahwa
alamat proses ruang mungkin berisi tabel manajemen lainnya di daerah yang
berdekatan dengan data globaldaerah. Tabel tersebut dapat meliputi referensi

untuk fungsi destructor ( GCC C dan C ++ekstensi ) , meja global offset


( digunakan untuk menyelesaikan fungsi referensi untuk dinamisperpustakaan
setelah mereka telah dimuat )dan struktur lainnya. Sekali lagi, tujuan dariserangan
adalah untuk menimpa beberapa fungsi pointer bahwa penyerang percaya maka
akandisebut kemudian oleh program diserang , mentransfer kontrol untuk
shellcode dari Attack yangpilihan er itu .
Pertahanan terhadap serangan tersebut termasuk membuat area data global
nonexecut mampu , mengatur fungsi pointer akan berada di bawah setiap jenis
data , dan menggunakan halaman penjaga antara daerah data global dan setiap
bidang manajemen lainnya .
Other Types of Overflows
Di luar jenis kerentanan penyangga yang telah kita bahas di sini , masih
ada lebih varian termasuk format string dan integer overflow overflows . Sangat
mungkin bahwabahkan lebih akan ditemukan di masa depan.Referensi yang
diberikan di DirekomendasikanMembaca untuk bab ini mencakup rincian dari
varian tambahan . Secara khusus , detaildari berbagai serangan buffer overflow
yang dibahas dalam [ LHEE03 ] .
Pesan penting adalah bahwa jika program tidak benar dikodekan dalam
pertama tempat untuk melindungi struktur data mereka , maka serangan pada
mereka yang mungkin.Sementara pertahanan yang telah kita bahas dapat
memblokir banyak serangan tersebut , beberapa , seperti aslinya Misalnya pada
Gambar 10.1 (yang merusak nilai variabel yang berdekatan dengan cara yang
mengubah perilaku program menyerang ) , hanya tidak dapat diblokir kecuali
dengan coding untuk mencegah mereka .

[ LHEE03 ] survei berbagai alternatif teknik buffer overflow , termasuk


sejumlah tidak disebutkan dalam bab ini,bersama dengan kemungkinan -teknik
defensif teknik.Jauh lebih rinci pada aspek tertentu diberikan dalam
[ HOGL04 ] dan [ ANLE07] Deskripsi diterbitkan asli serangan buffer overflow
diberikan di [ LEVY96 ].[ KUPE05] adalah gambaran yang baik .Untuk lebih
detail pada dasarorganisasi dan pengoperasian sistem komputer , termasuk
rincian pada stack framedan konvensi organisasi proses , lihat [ STAL10 ] , atau
untuk proses dan operasirincian sistem , lihat [ STAL12 ] .

Rekomendasi situs Web :


CWE / SANS 25 Most Dangerous Kesalahan Software: Daftar
jenis

yang

paling

umum

kesalahan

pemrograman

yang

dimanfaatkan dalam banyak serangan cyber besar , dengan rincian


tentang

bagaimana

mereka

terjadi

dan

bagaimana

untuk

menghindari mereka .
Metasploit : The Metasploit Project memberikan informasi yang
berguna mengenai eksploitasi shellcode kepada orang-orang yang
melakukan pengujian penetrasi , pengembangan signature IDS , dan
mengeksploitasi penelitian.
OpenBSD Keamanan : Proyek OpenBSD menghasilkan gratis ,
4.4BSD- multiplatform berdasarkan sistem operasi UNIX -like .
Daerah keamanan Rincian tujuan dan pendekatan mereka untuk
menyediakan keamanan yang proaktif , termasuk audit ekstensif
dari basis kode yang sudah ada dan masuknya teknologi untuk
mendeteksi dan mencegah sukses buffer overflow serangan .

Syarat utama

Pertanyaan ulasan
10.1

Mendefinisikan buffer overflow .

10.2

Daftar tiga jenis yang berbeda dari lokasi dalam ruang alamat
proses yang berlebihan penyangga serangan aliran biasanya
menargetkan .

10.3

Apa konsekuensi dari buffer overflow?

10.4

Apakah dua elemen kunci yang harus diidentifikasi untuk


melaksanakan buffer meluap?

10.5

Apa jenis

bahasa pemrograman

rentan terhadap

buffer

overflow ?
10,6

Jelaskan bagaimana

setumpuk

serangan buffer overflow

diimplementasikan
10,7

Mendefinisikan shellcode .

10,8

Pembatasan apa yang sering ditemukan dalam shellcode , dan


bagaimana mereka dapat dihindari ?

10.9

Jelaskan apa kereta luncur NOP dan bagaimana ia digunakan


dalam serangan buffer overflow .

10.10

Daftar beberapa operasi yang berbeda penyerang dapat


merancang shellcode untuk melakukan .

10.11

Apakah dua kategori besar pertahanan terhadap buffer overflows


?

10.12

Daftar dan jelaskan secara singkat beberapa pertahanan terhadap


buffer overflows yang dapat digunakan saat kompilasi program
baru .

10.13

Daftar dan jelaskan secara singkat beberapa pertahanan terhadap


buffer

overflows

yang

dapat

diimplementasikan

ketika

menjalankan , program rentan yang ada .


10.14

Jelaskan bagaimana serangan kembali-ke

sistem panggilan

diimplementasikan dan mengapa digunakan .


10.15

Jelaskan bagaimana tumpukan serangan buffer overflow


diimplementasikan

10,16

Menggambarkan bagaimana daerah data serangan melimpah


global diimplementasikan .

Masalah
10.1

Menyelidiki masing-masing fungsi perpustakaan standar C yang


tidak aman ditunjukkan pada Gambar 10.2 menggunakan
halaman manual UNIX atau teks pemrograman C , dan
menentukan alternatif yang lebih amanmenggunakan.

10.2

Menulis ulang program yang ditunjukkan pada Gambar 10.1a


sehingga tidak lagi rentan terhadap buf-fer overflow.

10.3

Menulis ulang fungsi yang ditunjukkan pada Gambar 10.5a


sehingga tidak lagi rentan terhadap stack buffer overflow .

10.4

Menulis ulang fungsi yang ditunjukkan pada Gambar 10.7a


sehingga tidak lagi rentan terhadap stack buffer overflow

10.5

Contoh shellcode yang ditunjukkan pada Gambar 10.8b


mengasumsikan bahwa sistem panggilan execve tidak akan
kembali (yang terjadi selama itu berhasil ) . Namun, untuk
menutupikemungkinan bahwa hal itu mungkin gagal , kode
dapat diperluas untuk mencakup sistem panggilan lainsetelah ,
kali ini untuk keluar ( 0 ) . Hal ini akan menyebabkan program
untuk keluar normal , menarikperhatian kurang dari yang
memungkinkan untuk kecelakaan . Memperpanjang shellcode ini

dengan assembler tambahaninstruksi yang dibutuhkan untuk


mengumpulkan argumen dan memanggil fungsi sistem ini .
10.6

Percobaan dengan menjalankan serangan stack overflow baik


menggunakan shellcode asli dari Gambar 10.8b atau kode
dimodifikasi dari Soal 1.5 , terhadap contoh rentan mampu
Program . Anda akan perlu menggunakan lebih tua O / S rilis
yang tidak termasuk tumpukan perlindungan secara default .
Anda juga akan perlu menentukan buffer dan stack frame lokasi ,
menentukan string serangan yang dihasilkan , dan menulis
sebuah program sederhana untuk mengkodekan ini untuk
melaksanakan serangan .

10.7

Tentukan apa perakitan instruksi bahasa akan diperlukan untuk


melaksanakan shell fungsi kode yang ditunjukkan pada Gambar
10.8a pada prosesor PowerPC ( seperti telahdigunakan oleh
distribusi MacOS atau Linux PPC ) .

10.8

Menyelidiki penggunaan standar pengganti string C library ,


seperti Libsafe , bstring ,vstr , atau lainnya . Menentukan
seberapa besar perubahan kode yang diperlukan adalah , jika
ada, untuk menggunakanperpustakaan yang dipilih .

10.9

Tentukan shellcode yang diperlukan untuk melaksanakan


kembali ke serangan system call yang panggilan sistem ( "
whoami ; cat / etc / shadow ; exit; " ) , menargetkan sama
rentanProgram seperti yang digunakan pada Soal 10.6 . Anda
perlu mengidentifikasi lokasi standarsistem perpustakaan ( )
fungsi pada sistem target dengan menelusuri program uji yang
sesuai dengandebugger . Anda kemudian harus menentukan
urutan yang benar dari alamat dan datanilai untuk digunakan
dalam serangan tali . Percobaan dengan menjalankan serangan
ini .

10.10

Menulis ulang fungsi yang ditunjukkan pada Gambar 10.10


sehingga mereka tidak lagi rentan terhadap penyangga serangan
overflow.

10.11

Menulis ulang program yang ditunjukkan pada Gambar 10.11a


sehingga tidak lagi rentan terhadap tumpukan buffer overflow

10.12

Meninjau beberapa pengumuman kerentanan terbaru dari CERT ,


SANS , atau Serupa organisasi lar . Mengidentifikasi nomor
yang terjadi sebagai akibat dari serangan buffer overflow
.Mengklasifikasikan jenis buffer overflow yang digunakan dalam
masing-masing, dan memutuskan apakah itu adalah salah satu
bentuk kita bahas dalam bab ini atau varian lain .

10.13

Menyelidiki rincian dari serangan melimpah format string , cara


kerjanya , dan bagaimana serangan string yang menggunakan
dirancang . Kemudian bereksperimen dengan menerapkan
serangan initerhadap program uji sesuai rentan .

10.14

Menyelidiki rincian dari serangan integer overflow , cara


kerjanya , dan bagaimana serangan itu tali menggunakan
dirancang . Kemudian bereksperimen dengan menerapkan
serangan ini terhadapprogram uji sesuai rentan .

Anda mungkin juga menyukai