Skip to content

BYOVD - Lenovo driver arbitrary R/W (CVE-2025-8061)

Lenovo'nun signed LnvMSRIO.sys Dispatcher 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:

Kernel_Base = MSR(IA32_LSTAR) - 0x6b8740

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 EPROCESS ActiveProcessLinks listesini gezer.
  • EPROCESS'in Token field'ındaki System token'ını okur ve low bit'leri 0xf0 ile maskeler. (EPROCESS.Token offset'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. 0xf0 maskesi, x64 EX_FAST_REF encoding'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ışı \\.\WinMsrDev open'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.

References