timerfd_ctx spray¶
struct timerfd_ctxobject'lerinikmalloc-256'ya spray etmek içintimerfd_create()'i tekrar tekrar çağır ve free edilmiş bir slot'u reclaim et; timer'ı arm etmek bilinen bir kernel.textpointer'ı (timerfd_tmrproc) yerleştirir; bu da bir KASLR leak veya control-flow hijack içindir.
Mechanism¶
Note
timerfd_create(clockid, flags), kmalloc-256 slab'ında bir struct timerfd_ctx
allocate eder ve bir fd döndürür; fd'yi kapatmak onu free eder (embedded bir rcu_head
üzerinden RCU-deferred). O boyuttaki free edilmiş bir victim slot'unu reclaim etmek için
timerfd_create() çağrılarını spray et — her biri bir hole'a taze bir timerfd_ctx koyar.
Bir CLOCK_REALTIME timer üzerinde timerfd_settime() çağırmak, embedded hrtimer'ı
arm eder ve onun function pointer'ını timerfd_tmrproc kernel symbol'üne set eder.
Bu iki işe yarar: reclaim edilen object'i okumak sabit bir .text pointer'ı (KASLR base) ve
object'in kendi heap adresini sızdırır; ve tmr.function'ı expiry'den önce overwrite etmek
control flow verir.
Walkthrough¶
struct timerfd_ctx (kmalloc-256), struct hrtimer ile struct alarm (tmr) union'ı,
ktime_t tintv, ktime_t moffs, bir wait_queue_head_t wqh, u64 ticks, expiry/state
flag'leri ve deferred free için struct rcu_head rcu içerir. Exploit açısından kritik field,
embedded hrtimer'ın enum hrtimer_restart (*function)(struct hrtimer *)'ıdır; normalde
timerfd_tmrproc'tur.
- Victim object'i free et (bug'ın UAF/double-free'si üzerinden).
- Slot'u reclaim et:
int tfd = timerfd_create(CLOCK_REALTIME, 0); /* new timerfd_ctx into freed kmalloc-256 slot */
struct itimerspec its = { .it_value = { .tv_sec = 1 } };
timerfd_settime(tfd, 0, &its, NULL); /* arms timer: tmr.function = timerfd_tmrproc */
- Leak: reclaim edilen object'i oku;
timerfd_tmrprockernel base'i, timer node ise kendi heap adresini açığa çıkarır. - Control flow: bir write primitive ile
tmr.function'ı overwrite et ve timer'ın süresinin dolmasını bekle — kernel attacker hedefini çağırır (bkz.timer-list-hrtimer-function-pointer-hijack).
Warning
timerfd_tmrproc softirq/IRQ context'inde ateşlenir, dolayısıyla hijack edilen bir chain
"herhangi bir task ile ilişkili değildir"; exploit'ler bunu ROP kuyruğundaki msleep() ve
bir fork()/"telefork" hilesiyle ele alır. timerfd_ctx içindeki ticks / state flag'lerinin
kesin byte offset'leri build'e bağlıdır; struct RCU tabanlı freeing kullanır (kref refcount
yok).
Mitigation¶
- hrtimer callback'i üzerindeki CFI, sahte-
functioncall-through'unu bloklar. - Slab freelist randomization/quarantine ve dedicated-cache ayrımı reclaim güvenilirliğini
azaltır. Deterministik
timerfd_tmrprocpointer'ı ayrıca savunucular için arm edilmiş timer object'lerine yönelik bir integrity anchor görevi görür.