Skip to content

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 bir FsStreamReg gibi 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:

  1. mskssrv.sys tarafından açığa çıkarılan frame-server cihazına bir handle aç.

  2. Handle üzerinde yanlış küçük object'i allocate et:

    // FsContext2 <- FsContextReg (0x78 bytes)
    DeviceIoControl(hDev, IOCTL_FRAMESERVER_INIT_CONTEXT,
                    inBuf, inLen, outBuf, outLen, &bytes, NULL);
    
  3. 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 alarak FsStreamReg alanlarını out of bounds okur.

  4. 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.

  5. OOB write'ı bir privilege primitive'ine çevir. Kamuya açık analiz, mevcut thread'in PreviousMode'unu 0'a düşürmeyi (decrement) anlatır. PreviousMode == KernelMode olunca kernel, sonraki NtReadVirtualMemory / NtWriteVirtualMemory çağrılarını güvenilir sayar ve user/kernel adres validation'ını atlar — bu da arbitrary bir kernel read/write primitive'idir.

  6. Read/write'ı kullanarak active process listesini gez, System process'inin EPROCESS'ini bul, onun Token pointer'ını attacker process'inin Token'ı ü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.sys içinde FindStreamObject ile 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ından IOCTL_FRAMESERVER_PUBLISH_RX gö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.

References