timer_list spray¶
Bir kernel timer'ı embed eden (
functionpointer'ı sonradan overwrite edilen) heap object'leri spray ederek free edilmiş bir slab slot'unu reclaim et ve heap'i öngörülebilir bir layout'a groom et.
Mechanism¶
Note
Çıplak bir struct timer_list (veya struct hrtimer) nadiren tek başına duran bir heap
allocation'ıdır — neredeyse her zaman daha büyük bir object'in içine embed edilmiştir.
Yani pratikte "timer_list spray", function pointer'ı overwrite edilebilen bir timer'ı
embed eden bir container object'i spray etmek anlamına gelir (örneğin bir hrtimer embed
eden timerfd_ctx ya da POSIX-timer k_itimer object'leri). Reclaim invariant'ı herhangi
bir SLUB spray ile aynıdır: victim'i free et, sonra aynı boyutta çok sayıda object allocate
et ki biri free edilmiş slot'a düşsün; o object bir timer embed ediyorsa, artık kernel'in
sonradan çağıracağı bir callback pointer'ını kontrol edersin.
Walkthrough¶
Güvenilir bir layout "dig and fence" grooming yöntemiyle (CVE-2022-1786 writeup'ından) kurulur, ardından timer taşıyan bir object kontrollü bir hole'a bırakılır:
- Dig + fence — hedef bir slab page'ini attacker'ın kontrol ettiği object'lerle tamamen
doldur (örneğin
kmalloc-256page başına 16msg_msgsegobject'i), sonra ortadan bir object'i free ederek kontrollü bir hole oluştur; her biri fence object'leriyle çevrili çok sayıda hole üretmek için bunu ~64 kez tekrarla. - Bir timer object'i ile reclaim et — timer taşıyan container'ı bir hole'a allocate et, örn.:
- Reclaim edilen object'in embedded timer
function'ı (ve object'in kendi heap adresi) overwrite edildiğinde bir KASLR leak kaynağı ve bir control-flow primitive haline gelir (bkz.timer-list-hrtimer-function-pointer-hijack).
Warning
Ayrı bir "çıplak timer_list spray et" primitive'i standart, dokümante edilmiş bir teknik
değildir — exploitation, bir timer embed eden container'ları spray eder. Tek başına duran
timer çerçevesini kavramsal olarak ele al.
Mitigation¶
CONFIG_SLAB_FREELIST_RANDOM, freelist hardening ve slab quarantine spray güvenilirliğini azaltır.- Dedicated/segregated cache'ler, bir timer taşıyan object'in cross-type reclaim'ini zorlaştırır.