Berkenalan Dengan Bug Null Pointer Dereference [Versi Lawas]

Zero Page Memory

Setiap sistem operasi di desain berbeda dalam hal menangani NULL pointer dereference. Pada kernel Linux, sejak dahulu telah diketahui bahwa NULL pointer dereference akan mengacu pada lokasi zero page memory.

Muhammad Rasyid Sahputra
Muhammad Rasyid Sahputra

Jakarta, Indonesia

Zero Page Memory

Dengan kata lain, dereference NULL pointer akan mengacu pada lokasi 0x00000000.

Memasuki tahap ini kita membutuhkan pengetahuan mengenai manajemen memory pada sistem operasi khususnya Linux. Saya tidak akan memberikan penjelasan terlalu mendetail karena akan sangat luas sekali dan keluar dari konteks artikel, namun saya akan coba menjelaskan beberapa poin penting disini.

Pada arsitektur intel diperkenalkan istilah virtual memory. Virtual memory
digunakan karena saat x86 (8086?) baru keluar kapasitas memory yang bisa
digunakan masih sangat terbatas, sehingga dibutuhkan suatu mekanisme oleh sistem operasi agar dapat mengalokasikan memory yang sangat terbatas tersebut untuk bisa digunakan oleh banyak program / proses. Oleh sebab itulah digunakan virtual memory dimana setiap proses akan merasa layaknya menggunakan physical memory, namun sesungguhnya memory tersebut hanyalah bentuk virtual yang diberikan oleh sistem operasi untuk kemudian dipetakan ke lokasi memory yang sesungguhnya.

Manajemen memory menggunakan istilah PAGE, yang merupakan satuan dalam operasi memory. Besar PAGE ini tidak sama antar arsitektur (intel, sparc, dll), namun untuk Linux yang berjalan diatas arsitektur x86 (intel) besar PAGE ini adalah 4KB (4,096 bytes).

Suatu program (file image, contohnya: ELF untuk Linux, .exe untuk Windows) akan di-load oleh sistem operasi kedalam virtual memory ini. Besar area virtual memory ini menggunakan satuan PAGE dan ditentukan oleh sistem operasi. Setiap image akan memiliki informasi yang spesifik (header, code segment, data segment, stack segment, dll) dan tugas sistem operasi adalah mengalokasikan informasi tersebut kedalam virtual memory, selanjutnya processor akan membaca instruksi program satu per satu pada virtual memory untuk menjalankan perintah-perintah program tersebut. Processor mengakses physical memory melalui virtual memory dengan bantuan page table, dan semua ini adalah tanggung jawab sistem operasi untuk menyiapkan semuanya. Penjelasan lebih mendetail dapat mengacu pada artikel “The Linux Kernel”[4] bagian memory management.

Jika misalnya suatu program dialokasikan memory sebesar 64KB dengan ukuran PAGE sebesar 4KB, maka program tersebut akan memiliki ilustrasi alokasi virtual memory sebagai berikut:

memory allocation untuk arsitektur intel 32-bit

Setiap process / thread akan memiliki virtual memory-nya masing-masing, sehingga suatu process tidak diperbolehkan mengakses virtual memory dari process lain. Dalam sistem operasi Linux, sistem operasi akan mengatur apabila suatu aplikasi membutuhkan alokasi memory tambahan, hal ini biasanya dengan menggunakan syscall seperti mremap()(2).

Cukup tentang teori dasar virtual memory.

Dari ilustrasi diatas kita bisa lihat bahwa lokasi 0x00000000 pada virtual
memory
yang dialokasikan untuk suatu proses disebut juga sebagai Zero Page Memory. Jika kita kembali pada masalah NULL pointer dereference diatas, maka NULL pointer akan menunjuk pada lokasi tersebut.

Setiap alokasi memory yang diberikan oleh sistem operasi juga memiliki semacam hak akses, jadi telah ditentukan apakah memory page tersebut hanya boleh untuk dibaca (read), bisa di tulisi (write), bisa di eksekusi (execute), merupakan lokasi memory yang bisa digunakan oleh dua buah process berbeda (shared), dan lain sebagainya. Zero Page Memory juga memiliki kriteria ini, itu sebabnya jika kita hendak mengakses begitu saja lokasi tersebut dimana telah diset hak akses tertentu maka akan terjadi “Segmentation fault”.