Win32k Elevation of Privilege (CVE-2023-29336)¶
Nested bir
menuobject'in tutarsızreference counting'inden kaynaklanan bir win32k privilege-escalation bug'ı; Avast tarafından in-the-wild exploitation sonrası keşfedildi ve Microsoft'un Mayıs 2023 güncellemesinde patch'lendi.
Mechanism¶
Note
win32k, aktif olarak kullandığı UI object'leri kilitler (reference-count'lar), böylece devam eden bir işlemin altından yok edilmezler. Invariant şu: kernel'in bir user-mode transition sonrası hâlâ dokunacağı her object, işlem süresince locked olmalı.
CVE-2023-29336 bunu bir nested menu object için kırıyor. Bir menu işlemi çalıştığında, win32k onu içeren window object'i locked yapar ama içine nested edilmiş menu object'i lock'lamayı atlar. Menu enable/redraw işlemesi sırasında (xxxEnableMenuItem → MNGetPopupFromMenu / xxxMNUpdateShownMenu üzerinden menu traversal), kod user mode'a geçer (örneğin xxxRedrawTitle aracılığıyla) ve menu'nün reference'ı vaktinden önce release edilebilir.
Dönüşte, kernel kodu artık free edilmiş menu object'i dereference eder — bir use-after-free. Free edilen slot saldırgan-kontrollü veriyle reclaim edilebildiğinden, dangling reference bir crash yerine kontrollü bir read/write primitive'ine dönüşür.
Bu, Smash the Ref'te belgelenen reference-counting sınıfıyla aynı win32k zayıflık ailesi: kernel, yeterince korunmayan bir object'i tutarken yeniden user mode'a girer ve ayrıcalıksız bir thread, object'in free edilip yerine başkasının konmasını ayarlar.
Walkthrough¶
Numen Cyber Labs analizine dayalı kavramsal bir reproduction. Yalnızca mantıksal adımlar — offset veya struct layout yok.
Warning
Patch'lenmiş bir bug'ın eğitim amaçlı, savunma odaklı taslağı. Exploit seviyesindeki detayı bilerek atlıyor.
Step 1 — Hazırlanmış bir menu hierarchy kur.
Saldırgan, bir submenu'nün belirli bir system command identifier'ı (close/SC_CLOSE tarzı bir ID) taşıdığı çok seviyeli bir menu oluşturur. Onu seçmek, zafiyetli enable/redraw traversal yolunu tetikler.
Step 2 — Yeterince lock'lanmayan yolu tetikle. Menu-enable işlemini çağırmak win32k'yı nested menu'ye girmeye yönlendirir. Window locked; menu değil.
Step 3 — User-mode transition sırasında free et.
Kernel xxxRedrawTitle üzerinden dönerken park hâldeyken, saldırgan nested menu'nün reference'ını düşürür ve kernel onunla işini bitirmeden object'i free eder.
Step 4 — Free edilen slot'u reclaim et. Free edilen menu belleği, saldırgan-kontrollü window-class extra-bytes verisiyle yeniden doldurulur, böylece dangling pointer artık şekillendirilmiş veriye işaret eder. Bkz. heap grooming / feng shui.
Step 5 — Read/write'tan token hırsızlığına.
Reclaim edilmiş object'e karşı GetMenuBarInfo (read) ve SetClassLongPtr (write) kullanarak saldırgan kernel read/write'ı kurar, SYSTEM token'ı bulur ve SYSTEM ayrıcalıkları için onu mevcut process'e takas eder. Bkz. EPROCESS token stealing ve use-after-free.
Detection¶
- Menu-object lifecycle anomalileri.
xxxEnableMenuItem/xxxRedrawTitleişlemesi sırasında bir menu object'in free edilip hemen yeniden reference edildiğini gösteren telemetry veya crash analizi. win32kfullbugcheck'leri, menu traversal rutinlerine atıfta bulunuyorsa — özellikle Windows 10 / Server 2008–2016 host'larında — başarısız exploitation girişimlerinin bir parmak izidir.- Exploitation sonrası token takası. Henüz privilege escalation yapmamış bir GUI process'in aniden
SYSTEMtoken'ıyla çalışması; EDR token-context monitoring bu data-only yetki değişikliğini yakalar. - Şüpheli window-class extra-bytes şekillendirmesi (büyük
cbWndExtra,GetMenuBarInfotarafından tüketilen sahte menu-bar yapıları) güvenilmeyen bir process'ten çıkıyorsa.
Mitigation¶
- CVE-2023-29336'yı ele alan Mayıs 2023 Patch Tuesday güncellemesini uygula; fix, nested menu object üzerindeki eksik lock'u ekler, böylece callback penceresi sırasında free edilemez.
- Etkilenen platformlardan yukarı çık. Bug Windows 11'i etkilemiyor; etkilenen küme eski Windows 10, Windows 8 ve Windows Server 2008/2012/2016.
- GUI çağrılarına ihtiyaç duymayan process'ler için Win32k syscall filtering, menu yollarının erişilebilirliğini tamamen ortadan kaldırır. Bkz. Disable Win32k system calls.
- Modern win32k'daki type isolation, reclaim-the-freed-slot stratejilerini körleştirmek için object sınıflarını ayırır. Bkz. Win32k type isolation.
- Defense in depth. Credential/token-theft monitoring, son data-only aşamanın değerini sınırlar.