Berkenalan Dengan Bug Null Pointer Dereference [Versi Lawas]
Bypass mmap() protection
Para hacker bidang security terus mecari cara untuk melakukan eksploitasi terhadap bug NULL pointer dereference, ada beberapa metode yang bisa digunakan untuk dapat mengakses zero page memory seperti yang di-presentasikan oleh Gael Delalleau pada CanSecWest 2005.

Pada presentasi tersebut Gael memaparkan implementasi memory allocation Linux serta beberapa sistem operasi lain, dan memaparkan berbagai kemungkinan yang bisa digunakan untuk mengontrol zero page memory. Cara tidak langsung (indirect) misalnya dengan memanfaatkan OOM (Out Of Memory) yang secara paksa melakukan alokasi heap besar-besaran sehingga pada satu titik alokasi heap akan mengisi zero page memory.
Julien Tinnes dan Tavis Ormandy dari Google Security Team melakukan riset dan menghasilkan metode-metode untuk bypass proteksi terhadap bug Linux NULL pointer dereference. Salah satu metodenya ditulis pada blog julien[7].
Sebagaimana yang tertulis pada blog tersebut, mereka mencoba beragam cara namun hampir semua masih bisa ditangani dengan baik oleh LSM (Linux Security Module), yang notabene merupakan fitur tambahan pada kernel Linux untuk security dan salah satu tugasnya adalah melakukan pengecekan terhadap feature mmap_min_addr().
Ada dua hal penting yang mereka dapatkan untuk bisa melakukan mapping pada zero page memory berdasarkan analisis kode kernel linux (2.6.30), yang pertama adalah trik personality.

Linux menggunakan personality untuk melayani aplikasi user, dan pelayanan dalam hal ini adalah linux mendukung lingkungan unix-like variant bagi aplikasi yang membutuhkan lingkungan tersebut. Guna-nya apa?! tentu saja agar aplikasi-aplikasi yang semula dibuat untuk lingkungan non-linux namun masih termasuk unix-like variant bisa berjalan diatas linux. Diantara personality yang didukung adalah SVr4.
Jika kita set suatu process untuk menggunakan personality SVr4, maka kode diatas akan dijalankan. Dan dapat kita lihat secara gamblang dari komentar developer untuk kode diatas bahwa sistem SVr4 melakukan mapping zero page dengan protocol read-only (PROT_READ), dan beberapa aplikasi membutuhkan kondisi tersebut sehingga ketika suatu proses di-set untuk menggunakan personality SVr4 secara otomatis kernel linux akan melakukan mapping zero page dengan protocol read-only.
Namun personality SVr4 tidak dapat melawan aturan fitur security check LSM. Trik diatas akan digagalkan oleh LSM, seperti apakah aturan LSM untuk default security check pada linux dalam hal pemanggilan fungsi mmap()?
Security check dilakukan oleh cap_file_mmap(), dimana kode internalnya bisa dilihat pada security/capability.c (kernel 2.6):

File capability.c berisi default security module pada kernel linux jika tidak
ada modul lain yang di-load untuk melindungi kernel (mis: SELinux). Fungsi
cap_file_mmap() diatas akan mengatur proses mapping file dengan menggunakan syscall mmap(). Dan seperti yang tertulis jelas pada kode tersebut, jika addr yang dialokasikan nilainya kurang dari mmap_min_addr() dan tidak memiliki capability CAP_SYS_RAWIO maka return value-nya adalah -EACCESS. Pada contoh program sebelumnya telah kita lihat bahwa restriction ini akan memberikan pesan error permission denied (mmap_min_addr() di-set lebih dari nol).
Jadi, secara logika suatu proses dengan CAP_SYS_RAWIO bisa mem-bypass fungsi diatas dan diperbolehkan untuk melakukan mapping zero page memory walaupun mmap_min_addr() di-set lebih besar dari nol.

Berdasarkan capability di Linux, proses yang memiliki CAP_SYS_RAWIO
diperbolehkan untuk mengakses ioperm / iopl yang dalam hal ini setaraf dengan hak akses root. Sehingga kita membutuhkan suatu binary yang didalamnya memanggil fungsi setuid root sebelum dijalankan.
Julien dan Taviso menemukan pulseaudio. Pulseaudio melakukan setuid root ketika dijalankan untuk kemudian me-load library yang dibutuhkan melalui parameter -L. Dan ini adalah aplikasi yang sempurna untuk dapat mem-bypass default security diatas.
Dengan memanfaatkan pulseaudio, kita dapat membuat suatu kode yang melakukan set personality menjadi SVr4, kemudian memanggil pulseaudio untuk me-load suatu modul. Saat menjalankan pulseaudio, secara otomatis page 0 akan di-mapped dan tentu saja akan berhasil karena pulseaudio telah memiliki akses root sehingga cap_file_mmap() akan meloloskan hal tersebut.
Modul yang diload oleh pulseaudio pun bisa kita kontrol, dalam hal ini modul tersebut berisi eksploit yang didalamnya bisa melakukan beragam hal, diantaranya melakukan mprotect() untuk mengubah protocol pada page 0 agar bisa read+write+execute (jangan lupa, SVr4 hanya memberikan akses read+execute). Selanjutnya page 0 dapat kita tulisi dengan beragam hal seperti shellcode, sisanya adalah mencari aplikasi yang vulnerable terhadap NULL pointer dereference dan membawa eksekusi ke page 0 untuk kemudian menjalankan shellcode tersebut. Game over.
Metode diatas adalah satu dari beragam metode yang digunakan untuk mengontrol page 0 dan terbukti bisa mem-bypass restriction pada kernel linux yang memanfaatkan fitur mmap_min_addr().