Skip to content

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).

  1. "Manager" ve "worker" olarak adlandırılan iki bitmap allocate et, onları session pool'da groom et.
  2. Manager bitmap'in pvScan0'ını worker bitmap'in pvScan0 alanına işaret edecek şekilde overwrite etmek için kernel vulnerability'sini kullan.
  3. Worker'ın pvScan0'ını herhangi bir hedef kernel adresiyle overwrite etmek için manager üzerinde SetBitmapBits çağır.
  4. O adresteki arbitrary kernel memory'yi read / write etmek için worker üzerinde GetBitmapBits / SetBitmapBits çağır.
  5. Worker'ı yeniden nişanlamak için 3. adımı tekrarla; bu, kararlı, tekrarlanabilir bir arbitrary kernel R/W verir.
  6. 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/GetBitmapBits kullanı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ı).
  • pvScan0 overwrite'ı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.

References