Cheddar Bay

Pada saat itu baru saja beredar bug NULL pointer Dereference untuk device driver tun. Bug tersebut[10] dimana merupakan patch tambahan dari Herbert Xu apabila dilihat secara langsung pada source kode kernel tidak akan kelihatan karena telah dilakukan pengecekan terhadap NULL Pointer Dereference, namun ternyata ada fakta lain yang cukup mengejutkan yaitu masalah optimisasi oleh compiler, dalam hal ini gcc. gcc melakukan optimisasi terhadap kode pada driver tun dengan menganggap bahwa pengecekan pada kode tersebut terhadap NULL Pointer Dereference tidak diperlukan. Berikut ini contoh kodenya (hasil patch dari Herbert Xu untuk tun_chr_poll() yang dimasukan ke kernel 2.6.30):

driver tun pada kernel linux 2.6.30

Pada baris 489 variable pointer sk di-definisikan sekaligus di-inisialisasikan
dengan tun->sk, variable pointer tun sendiri didefinisikan sekaligus di
insisialisasikan dengan nilai dari fungsi __tun_get() (baris 488) dengan input
dari tfile. Pada baris 492 dilakukan pengecekan terhadap variable pointer tun apakah bernilai NULL. Jika memang NULL, maka tun_chr_poll() tidak akan dilanjutkan dan keluar dari fungsi tersebut. Dalam hal ini, source kode diatas tidak bermasalah dengan NULL Pointer Dereference.

Namun pada saat di-compile, gcc melakukan optimisasi dan menghilangkan bagian pengecekan dibaris 492 tersebut, alasannya karena pada baris 489 variable pointer tun telah di-dereference sehingga sudah pasti nilainya tidak NULL, sehingga pengecekan dihapus untuk menjadikan hasil kompilasi lebih optimal. Hasilnya? tentu saja jika tun bernilai NULL maka tidak akan ada pengecekan dan fungsi diatas beresiko terkena bug NULL pointer dereference.

Permasalahan ini kemudian menjadi salah satu topik yang didiskusikan diantara para developer sehingga mereka kemudian sepakat untuk menghilangkan opsi optimisasi terhadap null pointer ketika melakukan kompilasi kernel. Patch pun di-merge untuk kode diatas[11].

Bug tun inilah yang kemudian digunakan oleh Spender untuk di-eksploitasi
menggunakan cheddar_bay. Eksploit cheddar_bay ternyata menguak beberapa trik eksploitasi NULL Pointer Dereference yang mungkin selama ini menjadi rahasia dunia underground. At least, itu adalah klaim Brad Spander seperti yang tertulis lengkap pada source kode cheddar_bay. Cheddar_bay juga memasukan fitur untuk me-non aktifkan beragam LSM yang mungkin diaktifkan oleh target (AppArmor, Auditing, LSM).

Namun secara khusus kita bisa mengatakan bahwa cheddar_bay menyerang implementasi SELinux yang seharusnya menjadi pelindung kernel terhadap serangan eksploit. Spender membuktikan dengan cheddar_bay bahwa mengaktifkan SELinux justru malah menambah resiko serangan terhadap bug NULL Pointer Dereference menjadi lebih besar. Belakangan Dan Walsh[12] juga ikut menambahkan kegagalan SELinux dalam hal melindungi kernel linux terhadap serangan eksploit. Hal ini juga dibenarkan oleh pihak pengembang SELinux bahwa sebenarnya SELinux sangat kuat terhadap serangan remote exploit, namun ternyata lemah terhadap serangan local exploit. Berarti jika suatu sistem merupakan webserver / hosting yang mengaktifkan SELinux, dan salah satu web pada hosting tersebut memiliki hole (misal: SQL Injection) sehingga penyerang berhasil mendapatkan akses shell (sebagai user biasa), penyerang tersebut memiliki kesempatan lebih besar untuk mendapatkan akses root dengan melakukan eksploitasi terhadap NULL Pointer Dereference dibandingkan sistem lain yang tidak mengaktifkan SELinux. SELinux merupakan produk yang digunakan oleh RedHat dan fakta ini sangat memalukan.

Saya tidak akan mengupas secara mendetail eksploit cheddar_bay karena dua alasan:

  1. Spender telah memberikan penjelasan yang sangat sangat panjang tentang eksploit tersebut dalam source kode exploit.c
  2. Fitur yang di-implementasikan oleh cheddar_bay juga digunakan oleh eksploit publik kedua, wunderbar_emporium. Sehingga penjelasan umum saya berikan pada cheddar_bay, namun penjelasan proses eksploitasi akan dijelaskan secara mendetail melalui wunderbar_emporium.
console