Page-table spraying for Rowhammer¶
Memory'yi page-table page'lerle doldurarak, bir page frame number (PFN) içindeki Rowhammer bit flip'inin saldırganın sahip olduğu bir virtual page'i başka bir page table'a yönlendirmesini sağlamak; bu da physical memory üzerinde kontrol kazandırır.
Mechanism¶
Note
Bir page-table entry (PTE), bir page frame number'ı encode eder — bir virtual address'in map'lendiği physical page'i. Eğer Rowhammer, bir PTE içindeki PFN'de bir bit'i flip ederse, virtual page artık farklı bir physical page'i gösterir. Belirleyici hile: sistemi o kadar çok page-table page ile spray et ki, yüksek olasılıkla yeni (flip'lenmiş) PFN başka bir page-table page'in üzerine düşsün. Saldırgan o zaman, backing page'i kendisi bir page table olan bir virtual mapping'i kontrol eder; bu da arbitrary PTE'ler kurma yeteneği — yani herhangi bir physical page'i writable map'leme — ve kernel-level memory erişimine yükselme sağlar.
Bu, Seaborn ve Dullien'in orijinal Rowhammer privilege-escalation primitive'idir (Project Zero, "Exploiting the DRAM rowhammer bug to gain kernel privileges"). Saldırgan, bozulmuş PFN'in hangi physical page'i gösterdiğini seçemediği için teknik probabilistic'tir: bir flip'in bir page table'ı hedefleme ihtimali yüksek olsun diye mümkün olduğunca çok memory'yi page table'larla doldurur. Sonraki çalışmalar (Flip Feng Shui, deduplication) yerleşimi deterministik hale getirdi, ama page-table spraying temel formdur.
Walkthrough¶
Exploit kompozisyonu:
1. Template DRAM -> find a reproducible PFN-bit flip in a PTE position.
2. Spray page tables -> mmap a huge number of pages and fault them in so the
kernel allocates many page-table pages filling RAM.
3. Position -> get a victim PTE onto the templated vulnerable cell.
4. Hammer -> flip a PFN bit; the mapping now points to a sprayed
page-table page.
5. Abuse -> write that page (now reachable read/write) to forge
PTEs mapping arbitrary physical memory -> kernel R/W.
Page table'ları spray etmek, kernel'i onları allocate etmeye zorlayarak yapılır — sonradan dokunulan büyük sparse mapping'ler:
// Allocate many pages across many mappings; touching each faults in PTE pages,
// covering physical memory with page-table pages.
for (int i = 0; i < N_MAPPINGS; i++) {
char *m = mmap(NULL, MAP_SPAN, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
for (size_t off = 0; off < MAP_SPAN; off += 4096)
m[off] = 0; // fault in -> kernel allocates page-table pages
}
// then hammer the templated aggressor rows around a victim PTE
Spray edilmiş bir page table üzerine düşen bir flip, bozulmuş bir mapping'i PTE'leri yeniden yazma yeteneğine ve oradan da arbitrary physical read/write'a dönüştürür.
Detection¶
- Devasa memory pressure (page-table spraying) ile Rowhammer tarzı activation burst'lerinin birlikteliği anormaldir; DRAM ECC hataları ve yüksek page-table allocation sayıları sinyaldir.
Mitigation¶
- Page table'ları saldırganın hammer'layabileceği DRAM'in dışında tut (guard row'lar, CTA/CATT tarzı şemaların önerdiği gibi domain-aware allocation).
- ECC, TRR/PRAC ve refresh-rate artışları flip'leri azaltır veya ortadan kaldırır.