Skip to content

Win32k Type Isolation mitigation (and bypass)

Windows 10 1709 ile gelen, GDI SURFACE/Bitmap allocation'larını ayıran bir mitigation; böylece bozulmuş (corrupted) bitmap'ler artık komşu, attacker tarafından okunabilir header'lara groom edilemiyor.

Mechanism

Savunulan invariant

Windows 10 1709'dan (Fall Creators Update) önce bir GDI Bitmap tek bir kernel allocation'dı: SURFACE header'ı ile pixel-data buffer'ı, ikisini birden tutacak kadar büyük tek bir bölgede bitişik (contiguous) duruyordu. İşte bu bitişiklik, Bitmap'leri evrensel exploitation hedefi yapan şeydi — neredeyse her sınırlı memory-corruption primitive'i (sizlBitmap width/height overwrite'ı, komşu bir OOB write, vb.) bir bitmap'in data buffer'ını bir sonraki bitmap'in header'ına bindirip (overlap) ardından GetBitmapBits/SetBitmapBits üzerinden read/write sürerek tam bir kernel read/write'a çevrilebiliyordu.

Type Isolation, iki allocation'ı ayırarak bu invariant'ı kırar. SURFACE header'ı genel session pool'undan çıkarılıp bitmap-tracked, özel bir bölgeye (Section Views) taşınır; pixel data buffer ise PagedPoolSession'da kalır. Kontrollü bir bitmap-vs-bitmap "header hemen data'nın ardından gelir" grooming layout'u artık elde edilemediği için, bozulmuş (corrupted) bir data buffer komşu bir SURFACE header'ına artık ulaşamaz.

Walkthrough

Halka açık şekilde reverse-engineer edilmiş haliyle yüksek seviyeli yapı (Quarkslab, build 10.0.16288.1):

  • Header allocator'ı, birlikte çalışan küçük bir nesne kümesinden inşa edilir: CTypeIsolation (bir doubly-linked list head'i), CSectionEntry (bir Section nesnesi tarafından desteklenen bir header batch'ini yönetir) ve CSectionBitmapAllocator (busy/free slot'ları bir RTL_BITMAP üzerinden takip eder).
  • Her CSectionEntry, sabit boyutlu View'lere bölünmüş bir Section'a sahiptir; View'ler talep üzerine commit edilir (MmCommitSessionMappedView) ve RtlFindClearBits boş bir slot bulduktan sonra slot'lar RtlSetBit ile busy olarak işaretlenir.
  • Allocator, bazı internal pointer'larını (View / bitmap) allocator başına rastgele bir key ile XOR-obfuscate eder; bu da allocator metadata'sını forge etmenin maliyetini yükseltir.
Klasik bir bitmap spray üzerindeki kavramsal etki
Pre-1709 (vulnerable layout):
    [ SURFACE hdr | pixel data ][ SURFACE hdr | pixel data ] ...
                   ^-- OOB write past data reaches next header

1709+ Type Isolation:
    Section View region:  [ hdr ][ hdr ][ hdr ] ...   (tracked by RTL_BITMAP)
    PagedPoolSession:     [ pixel data ] [ pixel data ] ...
    -> data overflow no longer lands on a header

Evrensel bir fix değil

Type Isolation özellikle Bitmap-as-target meta tekniğini ortadan kaldırır. Altta yatan corruption bug'ını kaldırmaz; araştırmacılar da diğer GDI primitive'lerine (özellikle Palette nesneleri) ve win32k'ye özgü nesnelere (tagWND extra byte'ları) yöneldi. Bunu, sınıfı kapatan değil çıtayı yükselten bir şey olarak değerlendirin.

Detection

  • Bu, build içine gömülü bir mitigation'dır; dolayısıyla en güçlü "detection" patch/build durumudur: host'ların header isolation'ın bulunduğu Windows 10 1709 veya sonrasını çalıştırdığını doğrulayın.
  • Saldırganları yönlendirdiği teknikler için EDR/davranışsal sinyaller: non-graphical / non-interactive bir process'ten patlama şeklinde GDI nesnesi oluşturma (CreateBitmap, CreatePalette) ve hemen ardından beklenmedik handle'lara karşı GetBitmapBits/SetBitmapBits ya da palette Get/SetPaletteEntries çağrıları.
  • Kernel-pool telemetrisi: tek bir process'ten gelen, bitmap tag'li çok sayıda session-pool allocation'ı — yaygın bir grooming habercisidir.

Mitigation

  • Type Isolation'ın yürürlükte olması için desteklenen bir Windows build'inde (1709+) kalın; etkin (enabled) olarak gelir ve opsiyonel bir configuration değildir.
  • Bunu daha geniş win32k surface reduction ile eşleştirin: GDI/USER'a ihtiyaç duymayan process'ler için Win32k system-call filtering process-mitigation policy'sini etkinleştirin; bu, attack surface'e erişimi tamamen ortadan kaldırır.
  • Defence-in-depth: HVCI/VBS, supervisor-mode korumaları (SMEP/SMAP) ve pool hardening, geriye kalan herhangi bir GDI primitive'inin değerini düşürür.

References

See also