MSSKSRV.sys streaming service LPE (CVE-2023-36802)¶
Microsoft Kernel Streaming Server (mskssrv.sys) içindeki object type confusion, küçük bir
FsContextReg'in çok daha büyük birFsStreamReggibi işlenmesine yol açıyor; sonuç olarak kernel OOB read/write ve in-the-wild bir local SYSTEM escalation elde ediliyor.
Mechanism¶
Note
Microsoft Kernel Streaming Server (mskssrv.sys, tarihsel olarak
MSSKSRV diye anılır) camera/frame-server cihazlarını virtualize eder.
Bir user-mode client, bir device handle açar ve state'i bir dizi
IOCTL_FRAMESERVER_* control code üzerinden sürer. Her handle, sürücünün
handle başına bir object ile doldurduğu bir FsContext2 alanı taşır.
Bug, klasik bir object type confusion. Aynı handle'a iki ayrı object type bağlanabilir:
FsContextReg— bir context registration object'i, 0x78 bytes.FsStreamReg— bir stream registration object'i, 0x1d8 bytes.
IOCTL_FRAMESERVER_INIT_CONTEXT, FsContext2'yi küçük FsContextReg
ile initialize eder. Daha sonraki bir IOCTL_FRAMESERVER_PUBLISH_RX
(ve kardeş PUBLISH_TX / CONSUME_RX / CONSUME_TX yolları)
FSRendezvousServer::PublishRx() çağrısı yapar; bu da handle'ın
object'ini FindObject() ile alır ve onun bir FsStreamReg olduğunu
varsayar. Ardından, altta yatan allocation yalnızca 0x78 bytes olmasına
rağmen, 0x1d8 byte'lık bir object için geçerli offset'lerdeki alanları
okur ve yazar.
Sürücü, gerçek allocation'ın sonunu aşan FsStreamReg alanlarını
(pointer'lar, FSStreamReg::PublishRx() / FSStreamReg::GetStats() /
FSFrameMdl::UnmapPages() içindeki MDL referansları) dereference ettiği
için, saldırgan bitişik pool memory'yi kontrol eder ve confusion'ı
kontrollü bir kernel out-of-bounds read/write'a dönüştürür. Kodun ihlal
ettiği invariant şu: "bir handle tarafından referans verilen object,
operasyonun beklediği type'tır." Kullanımdan önce type tag'ini hiçbir
şey kontrol etmiyordu.
Eylül 2023 patch'i tam olarak bu kontrolü ekledi: FindObject(),
object'in type alanının 2 (stream) olarak set edildiğini doğrulayan ve
başka herhangi bir object için FALSE döndüren
FSRendezvousServer::FindStreamObject() ile değiştirildi; bu da
confusion'ı kırdı.
Walkthrough¶
Amaçlanan exploitation yolu (Google Project Zero'nun in-the-wild örnekten yeniden kurguladığı haliyle) şöyle:
-
mskssrv.systarafından açığa çıkarılan frame-server cihazına bir handle aç. -
Handle üzerinde yanlış küçük object'i allocate et:
-
Aynı handle üzerinde confused yolunu tetikle:
// PublishRx() treats FsContext2 as FsStreamReg (0x1d8 bytes) DeviceIoControl(hDev, IOCTL_FRAMESERVER_PUBLISH_RX, inBuf, inLen, outBuf, outLen, &bytes, NULL);FSRendezvousServer::PublishRx(), komşu non-paged pool'u object data gibi ele alarakFsStreamRegalanlarını out of bounds okur. -
Pool'u öyle groom et ki 0x78 byte'lık
FsContextReg'in hemen ardından gelen byte'lar attacker-controlled olsun. Confused field erişimleri o zaman kontrollü bir OOB read ve kontrollü bir OOB write'a dönüşür. -
OOB write'ı bir privilege primitive'ine çevir. Kamuya açık analiz, mevcut thread'in
PreviousMode'unu0'a düşürmeyi (decrement) anlatır.PreviousMode == KernelModeolunca kernel, sonrakiNtReadVirtualMemory/NtWriteVirtualMemoryçağrılarını güvenilir sayar ve user/kernel adres validation'ını atlar — bu da arbitrary bir kernel read/write primitive'idir. -
Read/write'ı kullanarak active process listesini gez,
Systemprocess'ininEPROCESS'ini bul, onunTokenpointer'ını attacker process'ininToken'ı üzerine kopyala ve bir SYSTEM shell başlat.
Warning
CVE-2023-36802 in the wild olarak exploit edildi ve CISA Known
Exploited Vulnerabilities (KEV) kataloğuna eklendi. Intrusion zincirlerinde
sık sık CVE-2023-36761 (Word information disclosure) ile birlikte
göründü. Eylül 2023 öncesi, patch'lenmemiş herhangi bir Windows
10/11 / Server 2019/2022 host'unu doğrulanmış-exploit-edilebilir bir LPE
hedefi olarak değerlendir.
Microsoft/MSRC tarafından raporlanan affected platform'lar arasında Windows 10 (1809, 21H2, 22H2), Windows 11 (21H2, 22H2) ve Windows Server 2019 / 2022 yer alıyor.
Detection¶
- Patch state: Eylül 2023 cumulative update'inin kurulu olduğunu doğrula;
fix,
mskssrv.sysiçindeFindStreamObjectile geliyor. - Driver telemetry: düşük yetkili bir process'in frame-server cihazını açıp
aynı handle üzerinde
IOCTL_FRAMESERVER_INIT_CONTEXT'in hemen ardındanIOCTL_FRAMESERVER_PUBLISH_RXgöndermesi, normal camera client'ları için anormaldir. - Post-exploitation: token-swap LPE'leri, parent'ı normal bir user
process iken token'ı aniden SYSTEM token'ıyla eşleşen bir process olarak
ortaya çıkar; EDR
PreviousMode/token-integrity kontrolleri, bug'ın kendisini değil yaygın payload aşamasını yakalar.
Mitigation¶
- Eylül 2023 Patch Tuesday update'ini uygula (yetkili fix budur).
- Camera virtualization kullanılmadığında, Kernel Streaming frame-server cihazı üzerindeki attack-surface reduction reachability'yi sınırlar.
- Genel kernel hardening (HVCI/VBS, kernel CFG),
PreviousMode/token primitive'inin maliyetini artırır ama kökteki confusion'ı çözmez.