Fake object¶
Controlled bellekte counterfeit bir allocator/kernel struct'ı forge edip dereference edilmesini sağlama.
Mechanism¶
Attacker, halihazırda kontrol ettiği bellekte (bir stack buffer, bir global ya da attacker-written bir heap bölgesi) counterfeit bir allocator veya kernel struct'ı crafts; consumer'ın incelediği metadata field'larını forge eder ve sonra onu fake üzerinde işlem yapmaya kandırır. Consumer'ın integrity check'leri tam olarak o forge edilmiş field'ları okur, dolayısıyla onlar makul biçimde set edilmişse fake kabul edilir.
Note
glibc house-of-spirit'te, fake bir malloc_chunk öyle inşa edilir ki free()
onu kabul eder ve attacker'ın pointer'ını bir fastbin/tcache'e link'ler; sonraki
bir malloc onu döndürür ve bir arbitrary write sağlar. Aynı fikir, controlled
bellekteki forge edilmiş bir file/cred/ops struct'ının kernel'in bir attacker
function pointer'ını veya length field'ını dereference etmesine yol açtığı kernel
exploitation'ı sürer.
Walkthrough¶
house_of_spirit stack üzerinde bir chunk forge eder ve onu bir fastbin'e free eder:
long fake_chunks[10] __attribute__((aligned(0x10)));
fake_chunks[1] = 0x40; // forged size field: a valid fastbin size
fake_chunks[9] = 0x1234; // next chunk's size: must pass 2*SIZE_SZ < size < av->system_mem
void *victim = &fake_chunks[2]; // "user data" pointer of the fake chunk
free(victim); // free() believes this is a real chunk -> fastbin
void *p = calloc(1, 0x30); // malloc returns the fake pointer -> write primitive
İki forge edilmiş size field'ı tam olarak allocator'ın integrity check'lerinin
okuduğu şeydir: chunk'ın kendisi için 0x40 (geçerli bir fastbin size olmalı,
16-byte aligned) ve makul bir "next size" 0x1234 (2*SIZE_SZ < size <
av->system_mem koşulunu sağlamalı). p == victim olduğunda, p üzerinden yazılan
write'lar attacker-chosen adrese düşer.
Mitigation¶
Allocator integrity check'leri (size/alignment/system_mem bound'ları, fd
üzerinde safe-linking), kernel CONFIG_HARDENED_USERCOPY, struct layout
randomization ve pointer authentication, validation'ı geçen bir struct forge etmenin
maliyetini yükseltir.