Skip to content

Kernel ROP stack pivot

SMEP'i bypass eden bir ROP chain'i sahnelemek için kernel stack pointer'ını attacker-controlled memory'ye yönlendir.

Mechanism

Kırılan invariant

SMEP (Supervisor Mode Execution Prevention, CR4'ün bit 20'siyle gate edilir) CPU ring 0'dayken bir user-mode page'den bir instruction execute ederse fault verir. Bu, klasik "kernel'i user-mode shellcode'uma yönelt" technique'ini kırar. ROP yalnızca var olan kernel-mode code'u execute ederek SMEP'i atlatır — ama ROP temelde "stack üzerinde control varsayar", çünkü her gadget ret ile biter, bu da sonraki gadget adresini RSP'den pop'lar. Dolayısıyla exploit önce RSP'yi gadget adreslerinden oluşan attacker-controlled bir buffer'a işaret ettirmelidir. O sınırı geçen şey stack pivot gadget'ıdır (örn. xchg eax, esp / mov esp, <reg>).

Temsili bir chain sonra SMEP bit'i clear'lanmış bir CR4 değeri load eder (pop rcx; ret), onu geri yazar (mov cr4, rcx; ret) ve artık izin verilen user-mode payload'a (örn. bir token-stealing routine) return eder. Alternatif olarak chain hiç ring 0'dan çıkmadan doğrudan kernel function'larını çağırır.

Walkthrough

Üst düzey, Connor McGarr'ın public "Panic! At The Kernel" write-up'ından:

  1. Saved bir return address / control-flow target'ı overwrite etmek için bir kernel memory-corruption primitive'i (örn. bir driver stack overflow) kullan.
  2. Execution'ı bir stack-pivot gadget'ına yönlendir ki RSP chain'i tutan attacker buffer'ına işaret etsin.
  3. Yalnızca kernel-mode gadget'lardan kurulu bir ROP chain çalıştır; ya CR4.SMEP'i kapat ya da hedefe doğru doğrudan kernel function'larını invoke et.
  4. Execution kısıtlamaları gevşetildiğinde privilege-escalation payload'una (örn. token theft) transfer et.
  5. Stack'i ve register'ları onarmak ve temiz return etmek, bir bugcheck'ten kaçınmak için bir recovery / cleanup sırası execute et.

Warning

Kavramsal olarak ifade edildi — tam gadget chain ya da offset yok. Gadget adresleri spesifik kernel/driver build'ine ve KASLR slide'ına bağlıdır.

Detection

  • CR4'e beklenmedik write'ları gözle (hypervisor / HVCI / Hyper-V CR4 shadowing CR4 bit'lerini trap edebilir ya da pin'leyebilir).
  • RSP'nin aniden legitimate kernel-stack bound'larının dışına işaret etmesinde telemetry (stack-pivot detection).
  • Başarısız denemelerden gelen driver crash/bugcheck pattern'leri ve pool-corruption göstergeleri.
  • Control-flow-integrity ihlalleri (CET shadow-stack uyuşmazlıkları, kCFG indirect-call failure'ları).

Mitigation

  • Hypervisor (VBS / HVCI) üzerinden CR4.SMEP'i pin'le ki software onu clear'layamasın.
  • User page'lere data access'ini bloklamak ve data-only staging'i zorlaştırmak için SMAP (CR4 bit 21).
  • Return address'leri doğrulamak ve ROP'u yenmek için Kernel CET / shadow stack'ler.
  • Indirect-call integrity için kCFG / Control Flow Guard; gadget adreslerini öngörülemez kılmak için KASLR.
  • Driver hardening: stack cookie'leri, signing, attack-surface azaltma.

References