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) veCSectionBitmapAllocator(busy/free slot'ları birRTL_BITMAPüzerinden takip eder). - Her
CSectionEntry, sabit boyutlu View'lere bölünmüş bir Section'a sahiptir; View'ler talep üzerine commit edilir (MmCommitSessionMappedView) veRtlFindClearBitsboş bir slot bulduktan sonra slot'larRtlSetBitile 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/SetBitmapBitsya da paletteGet/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¶
- Reverse Engineering the Win32k Type Isolation Mitigation — Quarkslab
- TypeIsolationDbg WinDbg extension — F. Falcon
- Inside Win32k Exploitation, Part 1 — Palo Alto Unit 42