Skip to content

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

  1. Bir WWW vulnerability'sinden başla ("A adresine V değerini yaz" veren herhangi bir bug).
  2. Kernel pool'u groom et ki kontrol edilebilir bir Bitmap veya tagWND object'i ikinci bir object'e göre öngörülebilir bir konumda otursun.
  3. 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).
  4. Arbitrary read ile, bir info-leak syscall'a gerek kalmadan KASLR slide'ı geri kazanmak için kernel struct'ları / function pointer'ları gez.
  5. 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.
  6. 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/tagWND object'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

See also