Skip to content

Swimming in the Kernel Pool - low-integrity pool LPE

Bir pool out-of-bounds read'i (low-integrity bir kASLR bypass'ı için) bir pool overflow ile zincirleyerek arbitrary read/write elde et; sandbox-seviyesi bir process'ten modern Windows segment-heap (kLFH) pool exploitation'ını göstererek.

Mechanism

Note

Bir low-integrity / AppContainer process'ine (bir browser renderer sandbox'ı canonical modeldir) kolay kernel-base oracle'ları — EnumDeviceDrivers, NtQuerySystemInformation — verilmez, dolayısıyla attacker kASLR'yi yalnızca isteyemez. Connor McGarr'ın serisi, kernel pool'un kendisinin sızdırılabilir hâle getirilebileceğini gösterir: kernel Low-Fragmentation Heap'i (kLFH), controlled, OOB-readable bir chunk bir kernel pointer içeren bir object'in yanında duracak şekilde groom'lanarak, bitişik bir over-read low integrity'den çalışan bir kASLR bypass'ı olur. Güvenlik sınırı tek bir bug'la değil, deterministik biçimde yerleştirilmiş pool chunk'ları boyunca bir relative read ve bir relative write besteleyerek aşılır. "Yüzme" teması: Windows segment heap altında, kLFH'de coalescing kalktı ve _POOL_HEADER unencoded'dır, dolayısıyla aynı-boyutlu komşular stabil ve öngörülebilirdir — ki hassas grooming'i mümkün kılan tam olarak budur.

Tekniğin dayandığı temel segment-heap gerçekleri:

  • kLFH, 1–16,368-byte allocation'ları sabit boyutlu bucket'lar üzerinden servis eder; free edilmiş slot'lar coalesce edilmez ve aynı-boyutlu allocation'larca yeniden kullanılır — deterministik komşu yerleşimi.
  • 0x10-byte _POOL_HEADER (x64), kLFH'de unencoded'dır, dolayısıyla bitişik bir chunk'ın over-read'i yorumlamak için basittir.
  • Aynı-bucket'taki bir komşuya yapılan bir pool overflow, öngörülebilir bir object tipini corrupt eder.

Walkthrough

Public, kasten-vulnerable target olarak HEVD (HackSys Extreme Vulnerable Driver) kullanan high-level yeniden kurulum. Yalnızca mantıksal adımlar:

  1. kLFH'yi tetikle ve groom et: bucket'ı aktive etmek için çok sayıda aynı-boyutlu pool object'i spray et (seri, CreateEventA üzerinden binlerce event object kullanır), sonra düzenli delikler oluşturmak için her ikincisini free et.
  2. Sızdıran bir komşu yerleştir: delikleri bilinen bir kernel function pointer içeren object'lerle doldur (örn. callback'i driver'ın içine işaret eden bir UAF object'i).
  3. Relative read → kASLR: OOB-read IOCTL'ini (DeviceIoControl) oversized bir output length ile çağır, böylece RtlCopyMemory source chunk'ı geçip komşuya kopyalasın ve function pointer'ı döndürsün; driver/kernel base'ini kurtarmak için bilinen offset'i çıkar.
/* conceptual: oversized output length walks into the adjacent groomed chunk */
DeviceIoControl(hDev, IOCTL_OOB_READ, inBuf, inLen,
                outBuf, /* attacker-chosen, larger-than-source */ bigLen, &ret, NULL);
  1. Relative write → arbitrary R/W: layout bilinirken, corruption'ı controlled bir read/write veren bir komşuya bir pool overflow sürükle (seri, VBS/HVCI altında SMEP/DEP'i bypass etmek için bir PTE corruption'ına doğru ilerler).
Segment heap toolbox'ı neden daralttı

Windows 7 pool'larında, header/quota-process-pointer overwrite'ları pek çok generic tekniği mümkün kılardı. Segment heap altında bunlar mitigate edilir, dolayısıyla seri, header smashing yerine data-only tarzı relative R/W ve page-table corruption'a dayanır.

İlgili yapı taşları: kernel low-fragmentation heap exploitation, segment heap exploitation, ve page table entry overwrite for SMEP/NX bypass üzerinden SMEP-bypass finisher'ı.

Detection

  • Aynı pool object'lerinin toplu allocation/free'i (örn. binlerce CreateEventA'yı izleyen alternating CloseHandle), EDR'ye gözlemlenebilir anormal bir grooming parmak izidir.
  • Output buffer length'i makul herhangi bir response boyutunu aşan DeviceIoControl çağrıları, ya da low-integrity bir token'dan bir third-party driver'ı yoklayan tekrarlı IOCTL'ler.
  • Corrupt bitişik _POOL_HEADER tag'leriyle RtlCopyMemory/driver IOCTL handler'ları içindeki bugcheck'ler, overflow girişimlerine işaret eder.

Mitigation

  • Driver hijyeni: copy length'i gerçek allocation boyutuna karşı validate et; ExAllocatePool2'yi (zero-init eder, modern Windows'ta zorlanır) ve bounds-checked kopyaları tercih et.
  • Platform: VBS + HVCI ve kCFG, R/W'yi code execution'a çevirmenin maliyetini artırır; SMEP/SMAP ve KASLR yürürlükte kalır.
  • Surface azaltma: third-party kernel driver'larını patch'li tut ve vulnerable signed driver'ları blokla; hangi process'lerin attack-surface IOCTL'lerine ulaşabileceğini kısıtla.

References