Pencegahan Eksekusi Data
Pencegahan Eksekusi Data (DEP) adalah fitur perlindungan memori tingkat sistem yang dibangun ke dalam sistem operasi yang dimulai dengan Windows XP dan Windows Server 2003. DEP memungkinkan sistem menandai satu atau beberapa halaman memori sebagai tidak dapat dieksekusi. Menandai wilayah memori sebagai tidak dapat dieksekusi berarti bahwa kode tidak dapat dijalankan dari wilayah memori tersebut, yang membuatnya lebih sulit untuk eksploitasi overrun buffer.
DEP mencegah kode dijalankan dari halaman data seperti tumpukan, tumpukan, dan kumpulan memori default. Jika aplikasi mencoba menjalankan kode dari halaman data yang dilindungi, pengecualian pelanggaran akses memori terjadi, dan jika pengecualian tidak ditangani, proses panggilan dihentikan.
DEP tidak dimaksudkan untuk menjadi pertahanan komprehensif terhadap semua eksploitasi; ini dimaksudkan untuk menjadi alat lain yang dapat Anda gunakan untuk mengamankan aplikasi Anda.
Cara Kerja Pencegahan Eksekusi Data
Jika aplikasi mencoba menjalankan kode dari halaman yang dilindungi, aplikasi menerima pengecualian dengan kode status STATUS_ACCESS_VIOLATION. Jika aplikasi Anda harus menjalankan kode dari halaman memori, aplikasi harus mengalokasikan dan mengatur atribut perlindungan memori virtual yang tepat. Memori yang dialokasikan harus ditandai PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, atau PAGE_EXECUTE_WRITECOPY saat mengalokasikan memori. Alokasi timbunan yang dibuat dengan memanggil fungsi malloc dan HeapAlloc tidak dapat dieksekusi.
Aplikasi tidak dapat menjalankan kode dari timbunan proses default atau tumpukan.
DEP dikonfigurasi pada boot sistem sesuai dengan pengaturan kebijakan perlindungan halaman tanpa eksekusi dalam data konfigurasi boot. Aplikasi bisa mendapatkan pengaturan kebijakan saat ini dengan memanggil fungsi GetSystemDEPPolicy . Bergantung pada pengaturan kebijakan, aplikasi dapat mengubah pengaturan DEP untuk proses saat ini dengan memanggil fungsi SetProcessDEPPolicy .
Pertimbangan Pemrograman
Aplikasi dapat menggunakan fungsi VirtualAlloc untuk mengalokasikan memori yang dapat dieksekusi dengan opsi perlindungan memori yang sesuai. Disarankan bahwa set aplikasi, minimal, opsi perlindungan memori PAGE_EXECUTE . Setelah kode yang dapat dieksekusi dihasilkan, disarankan agar aplikasi mengatur perlindungan memori untuk melarang akses tulis ke memori yang dialokasikan. Aplikasi dapat melarang akses tulis ke memori yang dialokasikan dengan menggunakan fungsi VirtualProtect . Melarang akses tulis memastikan perlindungan maksimum untuk wilayah ruang alamat proses yang dapat dieksekusi. Anda harus mencoba membuat aplikasi yang menggunakan ruang alamat terkecil yang dapat dieksekusi, yang meminimalkan jumlah memori yang terpapar eksploitasi memori.
Anda juga harus mencoba mengontrol tata letak memori virtual aplikasi Anda dan membuat wilayah yang dapat dieksekusi. Wilayah yang dapat dieksekusi ini harus terletak di ruang memori yang lebih rendah daripada wilayah yang tidak dapat dieksekusi. Dengan menemukan wilayah yang dapat dieksekusi di bawah wilayah yang tidak dapat dieksekusi, Anda dapat membantu mencegah luapan buffer meluap ke area memori yang dapat dieksekusi.
Kompatibilitas Aplikasi
Beberapa fungsionalitas aplikasi tidak kompatibel dengan DEP. Aplikasi yang melakukan pembuatan kode dinamis (seperti pembuatan kode Just-In-Time) dan tidak secara eksplisit menandai kode yang dihasilkan dengan izin eksekusi mungkin memiliki masalah kompatibilitas pada komputer yang menggunakan DEP. Aplikasi yang ditulis ke Pustaka Templat Aktif (ATL) versi 7.1 dan yang lebih lama dapat mencoba mengeksekusi kode pada halaman yang ditandai sebagai tidak dapat dieksekusi, yang memicu kesalahan NX dan mengakhiri aplikasi; untuk informasi selengkapnya, lihat SetProcessDEPPolicy. Sebagian besar aplikasi yang melakukan tindakan yang tidak kompatibel dengan DEP harus diperbarui agar berfungsi dengan baik.
Sejumlah kecil file dan pustaka yang dapat dieksekusi mungkin berisi kode yang dapat dieksekusi di bagian data file gambar. Dalam beberapa kasus, aplikasi dapat menempatkan segmen kecil kode (biasa disebut sebagai thunks) di bagian data. Namun, DEP menandai bagian dari file gambar yang dimuat dalam memori sebagai tidak dapat dieksekusi kecuali bagian menerapkan atribut yang dapat dieksekusi.
Oleh karena itu, kode yang dapat dieksekusi di bagian data harus dimigrasikan ke bagian kode, atau bagian data yang berisi kode yang dapat dieksekusi harus secara eksplisit ditandai sebagai dapat dieksekusi. Atribut yang dapat dieksekusi, IMAGE_SCN_MEM_EXECUTE, harus ditambahkan ke bidang Karakteristik header bagian terkait untuk bagian yang berisi kode yang dapat dieksekusi. Untuk informasi selengkapnya tentang menambahkan atribut ke bagian, lihat dokumentasi yang disertakan dengan linker Anda.