Skip to content

timerfd_ctx spray

struct timerfd_ctx object'lerini kmalloc-256'ya spray etmek için timerfd_create()'i tekrar tekrar çağır ve free edilmiş bir slot'u reclaim et; timer'ı arm etmek bilinen bir kernel .text pointer'ı (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 hrtimerarm 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.

  1. Victim object'i free et (bug'ın UAF/double-free'si üzerinden).
  2. 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 */
  1. Leak: reclaim edilen object'i oku; timerfd_tmrproc kernel base'i, timer node ise kendi heap adresini açığa çıkarır.
  2. 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-function call-through'unu bloklar.
  • Slab freelist randomization/quarantine ve dedicated-cache ayrımı reclaim güvenilirliğini azaltır. Deterministik timerfd_tmrproc pointer'ı ayrıca savunucular için arm edilmiş timer object'lerine yönelik bir integrity anchor görevi görür.

References