Skip to content

DrK (De-randomizing Kernel ASLR with Intel TSX)

Hangi kernel page'lerinin mapped/executable olduğunu probe etmek için Intel TSX transactional abort'larını fault-suppressing bir oracle olarak kullan; hiçbir kernel memory leak olmadan KASLR'ı milisaniyeler içinde kır.

Mechanism

Neden çalışır

Intel TSX (Transactional Synchronization Extensions), XBEGIN/XEND arasındaki bir kod bölgesinin bir transaction olarak çalışmasını sağlar. Transaction içinde bir fault oluşursa — mapped olmayan veya non-executable bir adrese dokunmaktan kaynaklanan bir page fault dahil — transaction sessizce abort eder ve abort handler'a atlar, exception'ı OS'e hiç teslim etmeden.

Bu bastırma (suppression) oracle'dır. DrK'nın exploit ettiği invariant:

  • Leak: abort latency, page'in state'ine göre değişir. Bir mapped page'i, bir unmapped page'i ve bir executable page'i probe etmek ayırt edilebilir timing/abort-code signature'ları üretir, çünkü page-table walk ve TLB davranışı farklıdır.
  • Transmit/decode: bir TSX transaction içinde bir probe çalıştırıp (örn. bir aday kernel adresine load veya jump) abort'u time'layarak attacker, her aday KASLR slide adresini mapped/unmapped/executable olarak sınıflandırır.

Fault'lar kernel'a hiç ulaşmadığı için probe sessizdir (segfault yok, log kaydı yok) ve son derece hızlıdır — DrK tüm kernel address space'ini tarar ve slide'ı saniyenin epey altında geri elde eder.

Walkthrough

Probe, bir aday kernel adres erişimini bir TSX transaction içine sarar:

// Conceptual DrK probe (requires a TSX-capable CPU, e.g. Skylake-era).
static int probe_mapped(void *kaddr) {
    unsigned status;
    uint64_t t0 = rdtscp();
    if ((status = _xbegin()) == _XBEGIN_STARTED) {
        *(volatile char *)kaddr;   // page fault here aborts the TX silently
        _xend();
        return SLOW;               // committed: distinguish via timing
    }
    uint64_t dt = rdtscp() - t0;   // abort latency classifies the page
    return classify(dt, status);   // mapped vs unmapped vs executable
}

Aday KASLR base offset'lerini süpürmek ve her birini sınıflandırmak slide'ı verir.

Beklenen timing sınıfları (kavramsal)
unmapped page :  ~180 cycles (fast abort)
mapped page   :  ~215 cycles
executable    :  ~226 cycles
-> distinct clusters de-randomize the kernel layout

Mitigation

  • TSX'i devre dışı bırakmak oracle'ı kaldırır (sonraki microcode, ilgisiz nedenlerle birçok parçada TSX'i de devre dışı bıraktı).
  • Daha ince granüllü KASLR / function-granular randomization maliyeti yükseltir.
  • Generic mapping-indistinguishability savunma sınıfı için bkz. FLARE-targeted KASLR breaks.

References