BYOVD - Lenovo driver arbitrary R/W (CVE-2025-8061)¶
Lenovo'nun signed
LnvMSRIO.sysDispatcher driver'ını kötüye kullanarak user mode'dan arbitrary MSR ve physical-memory erişimi elde etme, ardından SYSTEM'a escalate etme.
Mechanism¶
Signed bir driver neden bir privilege oracle'a dönüşür
Bring-Your-Own-Vulnerable-Driver (BYOVD), yeni bir kernel bug bulmayı gerektirmez. Dayandığı nokta şu: geçerli şekilde Authenticode-signed bir kernel driver default bir Windows kurulumunda zaten yükleniyor ve bu driver, IOCTL interface'i üzerinden güçlü primitive'leri çağıranın privilege'larını kontrol etmeden dışarı açıyor.
Lenovo'nun LnvMSRIO.sys driver'ı ("Dispatcher" driver, v3.1.0.36'ya kadar olan sürümler) \\.\WinMsrDev olarak erişilebilen bir device object kaydeder. Bu device'ı CreateFile ile açabilen herhangi bir process, MmMapIoSpace() (physical memory map) ile __readmsr/__writemsr intrinsic'lerini süren IOCTL'ler gönderebilir. Driver ring 0'da çalıştığı için bunlar herhangi bir local user için unauthenticated arbitrary kernel read/write ve arbitrary MSR erişimi haline gelir.
Belirleyici invariant şudur: IA32_LSTAR (0xC0000082) gibi model-specific register'lar kernel tarafındaki syscall entry pointer'ını (KiSystemCall64) tutar. Bu MSR'ı user mode'dan hem okuyup hem yazabiliyorsan, kernel base'i leak edebilir (KASLR'ı defeat ederek) ve her syscall'ı kendi koduna redirect edebilirsin.
Walkthrough¶
Driver'ın dışa açtığı dört IOCTL:
| IOCTL Code | Primitive |
|---|---|
0x9c406104 |
MmMapIoSpace() ile physical memory read |
0x9c40a108 |
MmMapIoSpace() ile physical memory write |
0x9c402084 |
__rdmsr ile MSR read |
0x9c402088 |
__wrmsr ile MSR write |
1. Device'ı aç:
HANDLE h = CreateFileA("\\\\.\\WinMsrDev",
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
2. Kernel base'i leak et (KASLR bypass). IOCTL 0x9c402084 ile IA32_LSTAR'ı oku. Bu MSR, KiSystemCall64'ün runtime adresini tutar; image base'i geri elde etmek için static offset'ini çıkar:
Offset build'e özgüdür
Buradaki 0x6b8740 sabiti yalnızca belirli bir ntoskrnl.exe build'i için geçerlidir; KiSystemCall64'ün image base'inden offset'i Windows sürümleri (ve hatta aynı sürümün patch level'ları) arasında değişir. Güvenilir bir exploit bu değeri hardcode etmez; hedefteki gerçek ntoskrnl.exe'nin PDB symbol'ları ya da runtime resolution ile build'e özgü olarak çözer.
Token-stealing payload taslağı
Kernel base bilindiğinde exploit, IA32_LSTAR'ı overwrite eder (IOCTL 0x9c402088); böylece bir sonraki syscall attacker shellcode'una düşer. Shellcode:
- PID 4'ü (System process) bulmak için
EPROCESSActiveProcessLinkslistesini gezer. EPROCESS'inTokenfield'ındaki System token'ını okur ve low bit'leri0xf0ile maskeler. (EPROCESS.Tokenoffset'i build'e özgüdür; örn. Windows 10 1909–2004'te+0x248'dir, ancak daha sonraki build'lerde değişir — hedef sürüm için PDB symbol'larına ya da dynamic enumeration'a bakın, bkz.win10-2004-eprocess-offset-changes-for-token-payloads.0xf0maskesi, x64EX_FAST_REFencoding'inde low 4 bit'in reference count'u tuttuğu varsayımına dayanır ve clean pointer'ı geri verir.)- O token'ı current process'in
EPROCESS'ine kopyalayarak SYSTEM verir.
User mode'a dönüş, leak edilen base'den offset ile bulunan ROP gadget'larıyla aşamalandırılır (örn. swapgs ; iretq, pop rcx ; ret, mov cr4, rcx ; ret, swapgs ; sysret). Offset'ler build'e özgüdür ve hedefteki gerçek ntoskrnl.exe'ye göre resolve edilmelidir.
Warning
IA32_LSTAR global bir CPU register'ıdır: onu redirect etmek her core'un syscall entry'sini etkiler. Güvenilir bir exploit, execution'ı tek bir logical CPU'ya pinler, payload çalıştıktan hemen sonra orijinal LSTAR'ı geri yükler ve makineyi bugcheck'lememek için corruption window'u minimumda tutar.
Detection¶
- Driver-load telemetry:
LnvMSRIO.sys(veya herhangi bir MSR/physmem driver) kurulu bir Lenovo utility'sinin parçası olmadığı bir host'ta yüklendiğinde alert üret. - Microsoft'un önerdiği vulnerable driver blocklist'i (WDAC / HVCI), bilinen kötüye kullanılmış driver'ların hash'lerini içerir; enabled ve güncel olduğundan emin ol.
- Sysmon Event ID 6 (driver loaded) ve non-vendor process'lerin yaptığı sıra dışı
\\.\WinMsrDevopen'ları için handle-open auditing.
Mitigation¶
- Lenovo Dispatcher driver'ını access check'ler ekleyen v3.1.0.41 veya sonrasına güncelle (Lenovo advisory LEN-200860).
- HVCI / Memory Integrity ve Microsoft vulnerable-driver blocklist'i etkinleştir ki patch'lenmemiş kopyalar yüklenemesin.
- Driver kurulumunu kısıtla; MSR/physmem driver getiren kullanılmayan OEM utility'lerini kaldır.