Write-What-Where via Type Isolation bypass (Creators Update)¶
Morten Schenk'in Black Hat USA / DEF CON 25 2017 araştırması: generic write-what-where kernel bug'ları, type-isolation ve KASLR sertleştirmelerine rağmen Windows 10 Creators Update üzerinde nasıl hâlâ güvenilir read/write ve code execution'a dönüştürülebiliyor.
Mechanism¶
Invariant: a single controlled write should not yield a general R/W primitive
Windows 10, ham write-what-where (WWW) bug'larını sömürmeyi zorlaştırmak için bir dizi mitigation getirdi: tam ölçekli kernel KASLR, birçok kernel-pointer info leak'inin kaldırılması (örneğin NtQuerySystemInformation'dan gelenler) ve sömürülebilir control field'ları attacker'ın erişebildiği buffer'lardan ayıran "type isolation" / object-header değişiklikleri.
Araştırma, bu sınırın hâlâ sızdırdığını gösteriyor: belirli GDI kernel object'leri — Bitmap (surface) object'leri ve tagWND window object'leri — tek bir WWW ile corrupt edildiğinde generic bir arbitrary read ve write primitive'ine dönüşen size/pixel-buffer field'ları açığa çıkarıyor. Oradan saldırgan page-table base'ini de-randomize eder ve bir Page Table Entry'yi yeniden yazarak SMEP/NX'i aşıp code execution sağlar. Savunmacılar için kavramsal ders şu: bir length/pointer field'ını attacker'ın etkilediği veriyle yan yana koyan object tasarımları, tek bir dar write'ın tam bir R/W toolkit'i bootstrap etmesine izin vererek isolation garantisini çökertir.
Walkthrough¶
High-level, from the public Black Hat/DEF CON 2017 whitepaper
- Bir WWW vulnerability'sinden başla ("A adresine V değerini yaz" veren herhangi bir bug).
- Kernel pool'u groom et ki kontrol edilebilir bir Bitmap veya
tagWNDobject'i ikinci bir object'e göre öngörülebilir bir konumda otursun. - Tek WWW'yi kullanarak bir Bitmap'in size field'ını corrupt et; böylece komşu bir Bitmap'in pixel-buffer pointer/length'ine erişilebilir. İlk object'in pixel'lerini okuyup yazmak artık arbitrary kernel memory'ye ulaşır — kararlı bir arbitrary R/W primitive ("manager/worker" Bitmap çifti pattern'i).
- Arbitrary read ile, bir info-leak syscall'a gerek kalmadan KASLR slide'ı geri kazanmak için kernel struct'ları / function pointer'ları gez.
- Page-table self-map base'ini de-randomize et, ardından R/W primitive'i ile bir PTE'yi flip ederek bir attacker page'inin ring-0'da executable olmasını sağla; bu SMEP'i bypass eder. Hijack edilmiş bir function pointer'ı oraya yönlendir.
- Token-steal yap ya da başka yolla elevate et, sonra corrupt olmuş object'leri onararak sistemi kararlı tut.
Detection¶
- Pool/object integrity anomalileri: mantıksız size field'larına sahip GDI bitmap veya window object'leri, ya da asla referans vermemesi gereken kernel adres aralıklarına yönlendirilmiş pixel-buffer pointer'ları.
- GDI yoğun aktivitenin hemen ardından, parent/integrity level'ı SYSTEM'a izin vermemesi gereken bir process üzerindeki token swap'ler için EDR telemetrisi.
- PTE / page-table self-map write'larına ve image olmayan, RWX page'lere ring-0 control transfer'ine dikkat et (SMEP/CFG ihlalleri, integrity-check fault'ları).
- Crash/bugcheck telemetrisi: corrupt olmuş
GDITAG/win32k pool allocation'ları faydalı bir adli sinyaldir.
Mitigation¶
- OS güncellemelerini uygula; sonraki Windows 10 sürümleri GDI object metadata'sını sertleştirdi/yeniden konumlandırdı ve Win32k filtering ekledi.
- Tekniğin bypass etmek zorunda olduğu hardware/OS savunmalarını etkinleştir: SMEP, Kernel CFG, HVCI/Hypervisor-protected Code Integrity ve type isolation; özellikle HVCI, unsigned ring-0 code-execution adımını engeller.
- GDI'ya ihtiyaç duymayan process'ler için Win32k syscall filtering / Win32k lockdown ile attack surface'i azalt; bu bitmap/
tagWNDobject'lerinin erişilebilirliğini daraltır. - KASLR-leak mitigation'larını güncel tut; geri gelen herhangi bir kernel-pointer disclosure'ı bir regresyon olarak değerlendir.
References¶
- Black Hat USA 2017 whitepaper — Taking Windows 10 Kernel Exploitation to the Next Level (Schenk)
- DEF CON 25 slides (Schenk)
- GitHub — MortenSchenk/BHUSA2017 whitepaper