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)
Datacell index'i attacker-controlled olan bir_CM_KEY_VALUEelde etmek için UAF/type-confusion'ı kullan._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._CMHIVEiçinde sentetik_HMAP_ENTRYstructure'ları craft et ki out-of-bounds index'ler seçilen kernel adreslerine resolve olsun._CMHIVEfunction pointer'ları (GetCellRoutine,ReleaseCellRoutine,Allocate,Free) üzerindenntoskrnl.exebase'i leak et -> KASLR bypass._EPROCESSlistesini 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.