Kelemahan Memori: Double Free

Double Free merupakan salah satu kelemahan memori yang bisa dieskploitasi. Kesalahan yang sering dilakukan diantaranya memanggil fungsi free() dua kali pada alamat memori yang sama, hal ini bisa memodifikasi lokasi memori yang tidak diharapkan.

Dengan kata lain, ketika program memanggil fungsi free() dua kali dengan parameter yang sama maka manajemen struktur data terhadap program bisa menjadi korup. Dampak lain, program bisa mengalami crash atau hal aneh lainnya karena fungsi malloc() akan mengembalikan pointer yang sama. Jika fungsi malloc() mengembalikan nilai yang sama dua kali maka program bisa dieksploitasi oleh attacker melalui data yang dihasilkan oleh memori yang dialokasikan sehingga program menjadi lemah terhadap serangan buffer overflow.

Konsekuensinya, integritas program tersebut dapat dieksekusi dengan kode atau perintah yang tidak diharapkan. Sedangkan kerahasiaan dan ketersediaan program tersebut bisa menghasilkan kondisi dimana attacker mengeksekusi kode arbitrary.

Walaupun begitu, kelemahan memori ini bisa dibilang masuk ke dalam kelemahan tingkat rendah atau medium. Salah satu contoh dari kelemahan Double Free, bisa diilustrasikan pada kode dibawah ini.

// file df.c

#include "stdio.h"
#include "unistd.h"

#define ukuranBuffer1 512
#define ukuranBuffer2 ((ukuranBuffer1/2)-8)

int main(int argc, char **argv) {
	char *a;
	char *b;
	char *c;
	a = (char *) malloc(ukuranBuffer2);
	b = (char *) malloc(ukuranBuffer2);
	free(a);
	free(b);
	c = (char *) malloc(ukuranBuffer1);
	strncpy(c, argv[1], ukuranBuffer1-1);
	free(b);
	free(c);
}

Lakukan kompilasi program dengan perintah:

gcc -fno-stack-protector -z execstack -o df.out df.c

Apabila program kita eksekusi maka hasilnya sebagai berikut:

contohDoubleFree

Pada kasus ini, variabel b dibebaskan dua kali dengan fungsi free().

Bersambung …

(yp/cwe)

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s