Skip to content

Registry hive memory corruption -> arbitrary R/W (data-only)

Herhangi bir Windows registry hive memory corruption'ını bir KASLR bypass'a ve tamamen güvenilir arbitrary kernel read/write'a, sonra SYSTEM'e çevirmek için genel Project Zero tekniği — tümüyle bir data-only attack olarak, shellcode yok.

Mechanism

Note

Neden çalışır: bir hive'daki her cell reference'ı 32-bit bir cell index'tir ve HvpGetCellPaged, onu _CMHIVE structure'ında köklenen page-table benzeri bir cell map üzerinden bir virtual address'e çevirir. Index'ler [ Storage | Directory | Table | Offset ] olarak ayrışır. Translation path, tarihsel olarak index'e, release path'inin (HvpReleaseCellPaged) bounds check'ini yaptığından çok daha fazla güvenir. Eğer bir attacker (a) bir _CM_KEY_VALUE'nun byte'larını kontrol edebilir ve (b) cell-index bounds check'ini yenebilirse, sıradan bir RegQueryValueEx / RegSetValueEx, hive'dan attacker'ın seçtiği bir offset'te bir read/write olur — ve cell map, o offset'i arbitrary kernel memory'ye resolve edecek hale getirilebilir. Code pointer corruption'ı ya da ROP gerekmez: bu, hive'ın kendi translation makinesinin saf bir data-plane suistimalidir.

Bu, Windows Registry Adventure'ın "hive-based memory corruption hem bir KASLR bypass'a hem de tamamen güvenilir bir arbitrary read/write kapasitesine etkin biçimde dönüştürülebilir" iddiasının ardındaki birleştirici primitive'dir. Hive-cell bug'larından herhangi biri (örn. registry-hive-cell-corruption-lpe, registry-hive-corruption-lpe, registry-hive-double-fetch-under-memory-pressure) buna besleme yapabilir.

Walkthrough

Başlangıç koşulu: bir bug sana yanlış tipte bir hive cell'i ya da Data cell index'ini etkileyebildiğin kontrollü bir _CM_KEY_VALUE vermiştir.

1. Disable the bounds check.
   Corrupt _HHIVE.Storage[].Length to 0xFFFFFFFF so the index
   validation no longer constrains the cell-map walk.

2. Forge resolution structures.
   Plant synthetic _HMAP_ENTRY structures inside the _CMHIVE so that
   crafted out-of-bounds cell indexes resolve to chosen kernel VAs.

Bunu kontrol edilebilir kılan cell-index layout'u:

index = [ Storage (1 bit) | Directory (10) | Table (9) | Offset (12) ]

KASLR bypass — _CMHIVE, registry callback function pointer'ları dahil kernel pointer'larıyla doludur:

GetCellRoutine, ReleaseCellRoutine, Allocate, Free, FileWrite, FileRead

Bunlardan herhangi birini primitive üzerinden okumak bir ntoskrnl.exe adresini leak eder ve KASLR'ı yener. Project Zero #8, _CMHIVE.CmRm -> _CM_RM.CmHive -> _CMHIVE gibi self-referential bir path üzerinden _CMHIVE'ın kendisine ulaşmayı ve somut index'ler hesaplamayı (örn. _HHIVE.Storage[1].Length'i index 0xB260338C'de yazmayı) gösterir.

Arbitrary R/W -> SYSTEM (data-only), kavramsal:

3. Use the controlled _CM_KEY_VALUE.Data index + forged _HMAP_ENTRY
   to read/write arbitrary kernel addresses via Reg* value APIs.
4. Walk the _EPROCESS list (from nt!KiProcessListHead /
   PsActiveProcessHead) to find System and the attacker process.
5. Copy System's _EPROCESS.Token into the attacker's _EPROCESS.Token.

Warning

Bu, turnkey bir exploit değil, public Project Zero disclosure'ından çıkarılmış açıklayıcı bir path'tir. Tam offset'ler, 0xB260... index değerleri ve structure layout'ları build'e özgüdür ve yazarın hedefi için türetilmiştir; tekniğin şeklini aktarmak için gösterilmiştir, transplante edilmek için değil. Token theft, birkaç data-only bitirişten biridir (diğerleri process privilege'larını ya da security token'larını yerinde overwrite eder).

Bu primitive neden değerli: CFG'yi, kCET/shadow-stack'i ve çoğu exploit mitigation'ını atlar çünkü asla control flow'u hijack etmez — yalnızca read/write motoru olarak meşru registry operasyonlarını kullanarak kernel data'sını manipüle eder.

Detection

  • Arbitrary-R/W aşaması _EPROCESS token düzenlemelerini sürer; token-swap / privilege-field kurcalamayı izleyen EDR'ler, trigger görünmez olsa bile post-exploitation adımını yakalayabilir.
  • Offline hive integrity check'leri corrupt edilmiş _HHIVE.Storage[].Length'i ya da makul olmayan cell index'lerini tespit edebilir.

Mitigation

  • Altta yatan trigger bug'ını (corruption kaynağı) patch'le; primitive yalnızca bir hive bug'ı başlangıçtaki kontrollü cell'i verdiğinde ulaşılabilirdir.
  • Microsoft, Windows Registry Adventure fix dalgaları boyunca cell-index bounds check'ini ve hive validation'ını kademeli olarak sıkılaştırdı.

References