Skip to content

Registry hive cell corruption LPE (CVE-2023-23420)

Windows registry'nin transactional key-rename path'inde bir key-node cell'inin use-after-free'i; hive cell/bin structure'larını user mode'dan corrupt ederek SYSTEM'e tamamen güvenilir, data-only bir LPE sağlar.

Mechanism

Note

Neden çalışır: bir registry hive, kendi içinde tutarlı bir obje veritabanıdır. Key'ler (_CM_KEY_NODE), value'lar (_CM_KEY_VALUE), subkey index'leri (_CM_KEY_INDEX) ve security descriptor'ların hepsi, 4 KiB-aligned bin'lerin (_HBIN) içinde cell'ler olarak yaşar ve birbirlerine yalnızca 32-bit cell index'leriyle referans verir, asla raw pointer'larla değil. Kernel bir index'i, page-table benzeri bir cell map üzerinden HvpGetCellPaged ile bir virtual address'e çevirir. Bir cell'in allocation state'i, onu önceleyen signed 32-bit bir size word'ünde encode edilir (negatif = allocated, pozitif = free). Bir transactional operasyon bir key-node cell'ini free edip ama parent'ının subkey listesinde ona stale bir reference bıraktığında, free edilen cell index'i canlı bir _CM_KEY_NODE olarak dereference edilmeye devam eder. Corruption hive'ın kendi self-referential graph'ının içinde yaşadığı için, tamamen belgelenmiş registry syscall'ları üzerinden sürülebilir.

CVE-2023-23420, Mateusz Jurczyk'in Windows Registry Adventure'ından "multiple issues with subkeys of transactionally renamed registry keys" bug'ıdır. Microsoft tarafından CWE-416 (Use After Free), CVSS 7.8 (AV:L/AC:L/PR:L) olarak sınıflandırılır. Transacted rename makinesi, yeniden adlandırılan key'in subkey'lerini tutarsız bir state'te bıraktı, böylece free edilmiş bir key-node cell transaction'dan sonra referans verilmiş halde kaldı.

Walkthrough

Bug, transacted key rename path'inde yaşar. Kavramsal olarak:

1. Create key  HKCU\A  with a subkey  HKCU\A\sub
2. Open a registry transaction (KTM) and call the transacted rename
   on A (or its subkey) so that prepare/commit leaves the subkey's
   key-node cell freed, while A's subkey index list still points at it.
3. After the transaction settles, the freed cell index is reused for
   a new, attacker-shaped cell -> classic type-confusion / UAF.

Cell index'leri bir CPU page table gibi ayrışır, bu yüzden bir out-of-bounds ya da attacker-controlled index'in seçilen kernel belleğinin içine düşmesi sağlanabilir:

index = [ Storage (1 bit) | Directory (10) | Table (9) | Offset (12) ]
            stable/volatile   cell-map dir    table       in-bin

Warning

Bu problemler "o kadar derindi ve registry'nin o kadar temel yönlerini etkiliyordu" ki CVE-2023-23420 ve kardeş CVE'ler CVE-2023-23421 / 23422 / 23423, transacted key rename operasyonları için desteği tamamen kaldırarak düzeltildi. Rename path'ini patch'li build'lerde hâlâ mevcutmuş gibi ele alma.

Bu sınıfı çekici kılan kilit bir özellik: corruption, hive'ın kendi data'sında ifade edilir, dolayısıyla etkileri standart registry araçlarıyla (regedit, reg query) gözlemlenebilir — kırılgan bir pool-grooming zinciri yerine debug edilebilir, tekrarlanabilir bir exploit inşa etmek için faydalı.

Hive corruption'dan data-only SYSTEM'e (kavramsal, Project Zero #8'e göre)
  1. Data cell index'i attacker-controlled olan bir _CM_KEY_VALUE elde etmek için UAF/type-confusion'ı kullan.
  2. _HHIVE.Storage[].Length'i corrupt et (0xFFFFFFFF'e ayarla) ki translation path'indeki cell-index bounds check artık read/write'ları kısıtlamasın.
  3. _CMHIVE içinde sentetik _HMAP_ENTRY structure'ları craft et ki out-of-bounds index'ler seçilen kernel adreslerine resolve olsun.
  4. _CMHIVE function pointer'ları (GetCellRoutine, ReleaseCellRoutine, Allocate, Free) üzerinden ntoskrnl.exe base'i leak et -> KASLR bypass.
  5. _EPROCESS listesini yürü, System token'ını attacker'ın _EPROCESS.Token'ına kopyala — saf bir data-only privilege escalation, shellcode yok, CFG/kCET endişesi yok.

Adım 1-5'te kullanılan genel hive-corruption'dan-R/W'ye primitive için bkz. registry-hive-memory-corruption-arbitrary-r-w.

Detection

  • Bir registry transaction açan ve key rename'leri yapan bir user-mode process, ardından anormal registry layout'ları, faydalı bir davranışsal sinyaldir (trigger yalnızca API/syscall'dır).
  • Patch'li sistemlerde transacted-rename code path'i yoktur, dolayısıyla kullanımı patch'lenmemiş bir hedefe işaret eder.

Mitigation

  • Mart 2023 Patch Tuesday güncellemesini uygula; CVE-2023-23420 ve kardeşleri, transacted key rename desteği tümüyle kaldırılarak remediate edilir.

References