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:
- 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. - 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).
- Relative read → kASLR: OOB-read IOCTL'ini (
DeviceIoControl) oversized bir output length ile çağır, böyleceRtlCopyMemorysource 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);
- 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 alternatingCloseHandle), 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_HEADERtag'leriyleRtlCopyMemory/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.