Skip to content

GDI ring0 primitives (Core Security mechanics)

Core Security'nin "Abusing GDI for ring0 exploit primitives" tekniğinin kavramsal kataloğu: bir SURFOBJ'in pvScan0'ını patch'leyerek kontrollü kernel read/write elde eden iki-bitmap'li manager/worker pattern'i.

Mechanism

Boundary neden düşer

Bir GDI bitmap, üyesi pvScan0 ilk scanline'a — pixel buffer'a — işaret eden bir kernel surface objesi (SURFOBJ) ile arkalanır. User-mode API'leri GetBitmapBits / SetBitmapBits, pvScan0'ın referans verdiği yere/yerden data kopyalar. Bu API'ler yetkilendirilmiş user→kernel kopyalarıdır; güvenlikleri tamamen pvScan0'ın meşru bir buffer pointer'ı olmasına dayanır.

Bir memory-corruption bug'ı bir worker bitmap'in pvScan0'ını arbitrary kernel memory'ye yeniden işaret ederse, Get/SetBitmapBits bir arbitrary kernel read ve write'a dönüşür. Bu, Core Security tarafından popülerleştirilen (Economou/Juarez, Ekoparty 2015 ve 2016 "Reloaded" devamı) ve Hacking Team sızıntısından sonra geniş çapta görülen SURFOBJ-patching primitive'idir.

Walkthrough

Üst-seviye, public Core Security / SensePost write-up'larından:

  1. Bir manager'ı extend et. Bir OOB/overflow primitive'inden, bir manager bitmap, ondan yapılan bir write'ın bitişik bir worker bitmap'in pvScan0'ına ulaşması için "extend" edilir.
  2. Worker'ı hijack et. Manager worker.pvScan0'ı overwrite eder, sonra onu talep üzerine herhangi bir hedef adrese yeniden nişanlar.
  3. Kontrollü R/W. Worker üzerindeki Get/SetBitmapBits gerçek read/write'ı yapar; manager worker'ı operasyonlar arasında yeniden hedefler.
  4. KASLR'yi yen + escalate et. Kernel yapılarını bulmak için bir info-leak ile (tarihsel olarak GdiSharedHandleTable okuyarak) birleştirilir, sonra token theft.
Alıntılanan şekil (Core Security)

"The extended Bitmap object can be used as a Manager, to overwrite the pvScan0 member of an adjacent Bitmap object, and use the second one as Worker."

Detection

  • Bitmap spray'lerinin ardından sıkı Set/GetBitmapBits döngüleri, özellikle low-integrity process'lerden.
  • SURFACE/bitmap objelerine referans veren win32k pool-corruption bugcheck'leri.
  • User mode'dan GdiSharedHandleTable okumaları (KASLR öncülü).
  • GDI obje churn'ünün ardından LPE token-swap davranışı.

Mitigation

  • GDI Type Isolation (Windows 10 1709+) SURFOBJ pointer'larını attacker'ın erişebildiği data'dan ayırır ve manager→worker pvScan0 overwrite'ını kırar (bkz. win32k-type-isolation-mitigation).
  • GdiSharedHandleTable leak'inin kaldırılması (1607) KASLR adımını kırar.
  • Pool hardening, SMEP/SMAP.

References