GDI ring0 primitives (Core Security mechanics)¶
Core Security'nin "Abusing GDI for ring0 exploit primitives" tekniğinin kavramsal kataloğu: bir
SURFOBJ'inpvScan0'ı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:
- 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. - Worker'ı hijack et. Manager
worker.pvScan0'ı overwrite eder, sonra onu talep üzerine herhangi bir hedef adrese yeniden nişanlar. - Kontrollü R/W. Worker üzerindeki
Get/SetBitmapBitsgerçek read/write'ı yapar; manager worker'ı operasyonlar arasında yeniden hedefler. - KASLR'yi yen + escalate et. Kernel yapılarını bulmak için bir info-leak ile
(tarihsel olarak
GdiSharedHandleTableokuyarak) 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/GetBitmapBitsdöngüleri, özellikle low-integrity process'lerden. SURFACE/bitmap objelerine referans verenwin32kpool-corruption bugcheck'leri.- User mode'dan
GdiSharedHandleTableokumaları (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
pvScan0overwrite'ını kırar (bkz.win32k-type-isolation-mitigation). GdiSharedHandleTableleak'inin kaldırılması (1607) KASLR adımını kırar.- Pool hardening, SMEP/SMAP.