Skip to content

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.

Beklenen sonuç
p == &fake_chunks[2]  -> malloc handed back the forged chunk

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.

References