Mitigation Strategy #21 : Operating System Exploit Mitigation Mechanism

Muhammad Akbar Jamaludin (23213020)

Elian Daiva (23213021)

Penggunaan ASLR dan DEP pada Operating System

Data Extension Prevention (DEP) dan Address Space Layout Randomization (ASLR) merupakan dua buah countermeasure yang telah terbukti di dalam menghadapi tipe-tipe eksploit yang saat ini banyak dilakukan untuk memanfaatkan celah keamanan pada aplikasi. DEP mencegah sektor memori tertentu untuk dieksekusi, sementara ASLR merupakan teknologi yang digunakan mencegah shellcode untuk berhasil dieksekusi. Kombinasi keduanya akan menghasilkan pengamanan yag memadai untuk menangkal serangan yang mengekspoitasi kelemahan dengan return-oriented programming (ROP) dan shellcode.

Data Extension Prevention (DEP) dan Cara Kerjanya

DEP secara khusus, akan mencegah konten dari suatu region memori diidentifikasi sebagai data berisi selain instruksi executable yang akan dieksekusi sebagai instruksi oleh program, service, device driver, dan sebagainya. DEP melindungi beberapa program error dan membantu mencegah beberapa program exploit tertentu yang menyimpan instruksi executable pada data area seperti pada buffer overflow. DEP ini diperkenalkan penggunaannya untuk produk massal pada Linux tahun 2004 (kernel 2.6.8), Microsoft tahun 2004 (bagian dari Windows XP SP2), dan Apple tahun 2006 (saat migrasi arsitektur x86).

Kita akan menggunakan contoh kasus untuk melihat bagaimana kerentanan normal dapat dieksploitasi, contohnya adalah stack buffer overflow. Dengan menggunakan nilai 0x41414141 kedalam sebuah payload, dan eip disetting dengan 0x41414141, sehingga kita tahu bahwa payload ini dapat exploitasi. Bantuan dari software untuk melakukan penetration test seperti Metasploit, dapat digunakan untuk menemukan offset dari nilai yang dimasukkan dalam eip. Hal ini akan menjadi start offset dari kode eksploit ini. Untuk memverifikasi, kita akan memuat 0x41 sebelum offset, 0x42424242 pada offset, dan 0x43 setelah offset.

Pada proses tanpa ASLR dan tanpa DEP, stack address akan tetap sama setiap kali kita memulai proses. Kita tahu dengan pasti dimana proses pada memori. Maka akan kita lihat bagaimana stack memori akan tampak dengan data test seperti yang didefinisikan di atas:

1

Seperti yang kita lihat pada gambar, esp menunjuk pada stack address 000ff6b0, yang telah diset 0x42424242. Nilai sebelum ini adalah 0x41 dan nilai setelahnya adalah 0x43, seperti yang kita harapkan. Sekarang kita tahu bahwa address yang disimpan pada 000ff6b0 akan dilangkahi. Sehingga kita akan mengatur address ini pada alamat dari beberapa memori yang bisa kita kontrol:

 2

Sekarang kita sudah mengatur nilai dari address 000ff6b0 sehingga eip akan di set ke alamat 000ff6b4, offset berikutnya pada stack. Hal ini akan mengakibatkan 0xCC akan dieksekusi. Yang mana nilai int3 akan dieksekusi. Int3 merupakan op-code dari instruksi yang didefinisikan untuk digunakan oleh debugger untuk secara temporari mengganti suatu instruksi dengan breakpoint pada suatu program yang sedang berjalan. Ketika CPU mengeksekusi Int3, CPU akan memanggil OS interrupt handler yang akan melaporkan sebagai exception pada tipe EXCEPTION_BREAKPOINT pada OllyDbg. Dengan mengeksekusi nilai 0xCC pada stack address, akan mengaktifkan exception dan  menghentikan proses debugger. Hal ini akan mengizinkan kita untuk memverifikasi bahwa program exploit dilakukan dengan sukses.

 3

Sekarang kita akan mengganti memori pada 000ff6b4 dengan shellcode, dengan mengubah payload kita. Ini akan mengakhiri program exploit kita.

Untuk mencegah program exploit ini berhasil dijalankan, maka Data Execution Prevention (DEP) dikembangkan. DEP memaksakan struktur tertentu, termasuk didalamnya adalah stack, yang akan ditandai sebagai non-executable. Hal ini juga semakin didukung oleh dukungan CPU dengan No-Execution (NX) bit, yang juga dikenal dengan XD bit, EVP bit, atau XN bit, yang akan mengizinkan CPU untuk menjalankan eksekusi hingga ke level hardware. Dengan DEP diaktifkan, program exploit sebelumnya tidak akan berjalan.

 4

Exploit akan gagal karena stack ditandai sebagai non-executable, dan kita mencoba untuk mengeksekusinya. Untuk bisa mengatasi hal tersebut, biasanya attacker mengembangkan Return-Oriented Programming (ROP). Hal ini dilakukan dengan menggunakan potongan kecil kode, yang disebut ROP gadget, yang merepresentasikan modul yang sah untuk suatu proses. Gadget ini berisi satu atau lebih instruksi, yang diakhiri oleh return. Dengan menyisipkan ROP ke dalam suatu nilai tertentu pada stack, akan mengizinkan kode untuk dieksekusi.

Pertama-tama, mari kita lihat bagaimana stack kita saat ini:

 5

Kita tahu bahwa kita tidak bisa mengeksekusi kode pada 000ff6b4, maka kita akan mencari kode yang sah yang dapat kita gunakan. Bayangkan jika tugas pertama kita adalah untuk mendapatkan suatu nilai ke dalam register eax. Kita akan mencari kombinasi pop eax; ret , di dalam modul yang dijalankan oleh proses. Setelah kita menemukannya, katakanlah 00401f60, kita akan menempatkan nilai ini pada stack:

 6

Ketika shellcode ini dieksekusi, maka kita akan mendapatkan peringatan access violation:

 7

CPU saat ini akan selesai melakukan hal berikut :

–          Melompati instruksi pop eax ke alamat 00401f60

–          Pop off 0xCCCCCCCC dari stack, ke dalam eax

–          Mengeksekusi ret, pop 0x43434343 ke dalam eip

–          Mengeluarkan preingatan access violation karena 43434343 bukanlah address memori yang valid

Sekarang, dengan membayangkan hal tersebut, bukannya nilai 43434343, nilai pada 000ff6b8 telah diarahkan ke alamat dari ROP gadget yang lain. Yang mana menunjukkan bahwa pop eax telah dieksekusi, yang kemudian adalah gadget kita berikutnya. Kita dapat menghubungkan gadget kita bersama seperti ini. Tujuan awal kita adalah untuk menemukan address dari proteksi memori API, seperti VirtualProtect, dan menandai stack tersebut sebagai executable. Kemudian kita akan memasukkan final dari ROP gadget untuk melakukan proses instruksi jmp esp dan mengeksekusi shellcode.  Dengan ini, maka DEP dapat diterobos.

ASLR dan Cara Kerjanya

Untuk dapat menambal kekurangan dari DEP, dikembangkan ASLR atau Address Space Layout Randomization. ASLR dikembangkan pada 1997 oleh Memco Software, yang diimplementasikan secara terbatas pada stack randomization sebagai bagian dari produk SeOS Access Control. Pengembangan selanjutnya dilakukan dalam PaX Projects, yang merupakan patch pada Linux kernel, dimana desain dan implementasi pertama ASLR diterapkan pada July 2001. Dan mulai penyempurnaan lebih lanjut mulai Oktober 2002 dengan kernel stack randomization.

ASLR menjaga ketika attacker secara tiba-tiba meloncat ke suatu fungsi yang mudah untuk dieksploitasi pada memori tertentu. ASLR akan melakukan pengacakan (randomization) pada posisi key data area pada suatu program, termasuk base dari executable dan posisi dari alokasi memori stack, memori dinamis, dan libraries pada process’s address space.

Pada Windows Vista dan 7, ASLR akan mengacak lokasi dari file executable, DLL, stack dan heap dalam memori. Ketika file executable dimuat ke dalam memori, Windows akan mendapatkan nilai dari timestamp counter (TSC) dari prosesor, untuk kemudian akan digeser (shifted) 4 kali, melakukan pembagian mod dengan 254, kemudian ditambahkan dengan 1. Hasil dari penghitungan tersebut akan dikalikan dengan 64 KB, dan gambar dari file executable akan dimuat didalam memori. Hal ini berarti ada 256 kemungkinan dari lokasi file executable di dalam memori. File-file DLL, melalui proses, akan secara bersama berada pada memori. Offset dari DLL akan ditentukan dari nilai bias sistem yang akan dihitung saat proses boot. Nilai akan dikomputasi sebagai TSC dari CPU ketika fungsi MiInitializeRelocations pertama kali dipanggil, digeser (shifted), dan disamarkan ke dalam nilai 8 bit. Nilai ini hanya akan dihitung sekali saat proses boot dilakukan.

Ketika DLL dimuat, mereka akan menuju shared memory region antara 0x50000000 dan 0x780000000. DLL pertama yang akan dimuat dalam memori yaitu ntdll.dll, yang akan dimuat pada 0x780000000 – bias * 0x100000, yang mana nilai bias adalah merupakan lebar bias sistem (widesystem bias). Karena menghitung offset module akan menjadi sangat trivial ketika mengetahui base dari ntdll.dll, maka urutan dimana module akan dimuat akan teracak juga.

Ketika threads dibuat, maka lokasi dari stack base mereka akan teracak. Hal ini akan dilakukan dengan menemukan 32 lokasi yang sesuai di dalam memori, untuk kemudian dipilih nilai TSC saat itu dan menggeser serta menyamarkannya ke dalam nilai 5 bit. Setelah base address selesai dihitung, bilangan 9 bit lain yang diturunkan dari TSC akan digunakan untuk menghitung final stack base address. Hal ini secara teoretis akan menghasilkan derajat keteracakan (randomness) yang tinggi.

Pada akhirnya, lokasi dari heap dan alokasinya akan teracak. Hal ini dihitung dari nilai 5-bit TSC yang diturunkan, kemudian dikalikan dengan 64KB, yang akan menghasilkan rentang heap yang memungkinkan dari 00000000 hingga 001f0000.

Ketika mekanisme ASLR ini dikombinasikan dengan DEP, kita akan terhindarkan dari eksekusi shellcode atau proses exploit secara umum. Hal ini tidak hanya dikarenakan kita tidak bisa mengeksekusi stack, melainkan juga kita tidak tahu dimanakah instruksi ROP akan berada di dalam memori.

Referensi:

[1] http://en.wikipedia.org/wiki/Address_space_layout_randomization (diakses 30 Oktober 2013 pukul 18.00)

[2] http://en.wikipedia.org/wiki/Data_Execution_Prevention  (diakses 30 Oktober 2013 pukul 18.00)

[3] http://security.stackexchange.com/questions/18556/ (diakses 29 Oktober 2013 pukul 20.00)

[4] ________, DEP/ASLR Implementation Progress in Popular Third-party Windows Applications, Secunia Research (2010)

Leave a Reply

Your email address will not be published. Required fields are marked *