GDI Bitmap (SURFOBJ) arbitrary R/W primitive¶
GDI bitmap objelerini (SURFOBJ pvScan0) SetBitmapBits/GetBitmapBits ile kötüye kullanarak kararlı, data-only bir kernel arbitrary read/write kuran bir Windows kernel tekniği.
Mechanism¶
Bir bitmap neden kernel R/W'ye dönüşür
Bir GDI bitmap'inin kernel SURFOBJ'i, bitmap'in ilk scan line'ına bir pointer
olan pvScan0'ı içerir. SetBitmapBits / GetBitmapBits byte'ları doğrudan
pvScan0 üzerinden yazar/okur. Bir kernel bug'ı attacker'ın pvScan0'ı
bozmasına izin verirse, o iyi biçimlenmiş GDI API'leri bir arbitrary kernel
write ve read'e dönüşür — kernel code execution gerektirmeyen, dolayısıyla
SMEP / SMAP / CFG'yi atlatan bir data-only primitive. "Manager/worker" pattern'i
primitive'i kararlı ve tekrarlanabilir tutar.
Walkthrough¶
Public writeup'lardan alınan kavramsal, üst-seviye reproduction. pvScan0
offset'i ve bitmap header layout'u mimariye ve OS sürümüne göre farklılaşır
(Win7 ila Win10 pre-1607, 32/64-bit olarak raporlanmıştır).
- "Manager" ve "worker" olarak adlandırılan iki bitmap allocate et, onları session pool'da groom et.
- Manager bitmap'in
pvScan0'ını worker bitmap'inpvScan0alanına işaret edecek şekilde overwrite etmek için kernel vulnerability'sini kullan. - Worker'ın
pvScan0'ını herhangi bir hedef kernel adresiyle overwrite etmek için manager üzerindeSetBitmapBitsçağır. - O adresteki arbitrary kernel memory'yi read / write etmek için worker üzerinde
GetBitmapBits/SetBitmapBitsçağır. - Worker'ı yeniden nişanlamak için 3. adımı tekrarla; bu, kararlı, tekrarlanabilir bir arbitrary kernel R/W verir.
- R/W'yi
_EPROCESS'i bulmak ve token stealing yapmak ya da privileged yapıları patch'lemek için kullan.
Detection¶
- Çok sayıda bitmap (GDI) objesi oluşturup/free eden tek bir user process'i (pool-spray imzası).
- Başarısız grooming'den kaynaklanan win32k / GDI pool-corruption bugcheck'leri.
- EDR davranışsal zincirleri: yoğun
CreateBitmap+SetBitmapBits/GetBitmapBitskullanımının ardından token / integrity escalation. - Patch'li Windows'ta kernel-pool integrity / GDI type-isolation uyarıları.
- Karşılık gelen bir kernel module yüklemesi olmadan privilege escalation (data-only saldırı göstergesi).
Mitigation¶
- Windows 10 Anniversary (1607)+ GDI hardening, kernel-address alanlarını kaldırdı/randomize etti ve type isolation ekledi; bu da klasik manager/worker primitive'ini kırdı (dolayısıyla "pre-1607" kapsamı).
pvScan0overwrite'ını mümkün kılan altta yatan kernel write bug'ı için OS patch'ini uygula.- Sandboxed process'ler için GDI erişilebilirliğini sınırlamak üzere Win32k syscall filtering / lockdown.
- HVCI / VBS, SMEP / SMAP ve Kernel CFG — data-only saldırılar bazılarını bypass etse de, takip eden aşamaları kısıtlar.
- Sistemleri low-fragmentation / segment-heap ve pool-integrity savunmalı build'lerde tut.