Skip to content

NDIS network driver attack surface

NDIS, ndis.sys ile miniport + protocol driver'ları arasındaki ring0 network stack'idir; OID request handling, NET_BUFFER/NBL processing ve packet path'leri hem local IOCTL hem adjacent packet input ile attacker-influenced olduğu için tekrar tekrar OOB read/write ve UAF bug class'larının kaynağı olmuştur (örn. CVE-2015-6098, CVE-2019-0707 NDIS EoP; CVE-2024-38048 NDIS OOB-read DoS).

Mechanism

Neden bu boundary kırılıyor — bir bug class olarak NDIS input handling

NDIS (Network Driver Interface Specification), Windows'un kernel-mode network abstraction katmanıdır. ndis.sys ortada durur; altta miniport driver'lar (NIC donanımını süren vendor kodu), üstte protocol driver'lar (TCPIP, filter/LWF driver'ları) oturur. İki taraf birbiriyle iki ana kanaldan konuşur:

  1. OID requests — control-plane. Bir protocol veya user-mode component NdisOidRequest ile bir OID (object identifier) query/set eder; NDIS bunu miniport'un MiniportOidRequest callback'ine iletir. Request'in gövdesinde attacker'ın etkileyebildiği bir InformationBuffer + InformationBufferLength taşınır. Kritik invariant Microsoft'un kendi dokümanında yazılıdır: "NDIS does not validate the OID-specific contents at OidRequest. Therefore, the driver itself must validate these contents." Yani length/bounds kontrolü driver'ın sorumluluğu; miniport InformationBufferLength'i güvenmeden output buffer'a kopyalarsa klasik input-buffer > output-buffer overflow doğar. CVE-2019-0707 ve CVE-2018-8342 tam olarak bu sınıftır: "ndis.sys fails to check the length of a buffer prior to copying memory to it."

  2. Data-plane / packet pathNET_BUFFER_LIST (NBL) ve NET_BUFFER (NB) zincirleri. Receive/send path'inde her NB, bir MDL chain'e + offset/length alanlarına sahiptir. Bu length/offset alanları wire'dan gelen (adjacent) veya bir alt driver'ın ürettiği veriden türeyebilir. Parser bir header uzunluğunu, bir MDL span'ini veya bir metadata (OOB data, checksum, LSO) alanını yanlış hesaplarsa buffer sınırının öncesini/sonrasını okur — CVE-2024-38048 (CWE-125, OOB read, adjacent, DoS) bu kategoriye örnektir.

Yüzeyin tehlikesi reachability + tetiklenebilirlik: OID path'i local IOCTL/WMI'dan, packet path'i ise adjacent network'ten sürülebilir. ndis.sys ve vendor miniport'ları PASSIVE/DISPATCH IRQL'de ring0'da çalıştığı için bir OOB write veya UAF, pool grooming ile kontrollü hale getirildiğinde LPE'ye; bir OOB read ise info-leak ya da bugcheck'e (DoS) döner. Kalıp Linux'taki "AF_PACKET/socket length-field OOB" ailesinin Windows karşılığıdır; kaldıraç unvalidated length in a delegated-validation model.

Walkthrough

Altitude

Aşağıdakiler public, patch'li malzemeden (NVD + MSRC + Microsoft NDIS docs) türetilmiş kavramsal adımlardır. Struct offset, gadget chain veya kopyala-çalıştır exploit yok — yalnızca defender için mantık zinciri.

Step 1 — attack surface'e ulaş. Control-plane için OID request'i miniport'a ulaştıran bir path seç (protocol/WMI/IOCTL). Yüksek seviyede:

// Conceptual only — real OID codes / buffers elided.
NDIS_OID_REQUEST req = {0};
req.RequestType = NdisRequestSetInformation;   // or QueryInformation
req.DATA.SET_INFORMATION.Oid = OID_XXX;        // an OID the miniport handles
req.DATA.SET_INFORMATION.InformationBuffer = buf;
req.DATA.SET_INFORMATION.InformationBufferLength = attacker_len; // <-- key field
NdisOidRequest(bindingHandle, &req);

Step 2 — invariant'i zorla. attacker_len ile miniport'un beklediği sabit output buffer boyutu arasında bir uyumsuzluk yarat: length'i büyüt (SET path'inde input→internal copy overflow) ya da beklenenden küçük ver (QUERY path'inde kısa buffer'a yazılan/okunan tam boy → OOB). Delegated-validation modelinde miniport bounds check'i atlamışsa boundary burada kırılır.

Step 3 — data-plane varyantı. Packet path'te bir NBL/NB üret; header length, MDL offset veya bir metadata alanını (LSO/checksum/OOB) tutarsız bırak. Parser bu alanı doğrulamadan MDL span'i üzerinde yürürse buffer'ın dışını okur (OOB read → leak/DoS) veya yazar (OOB write → corruption).

Step 4 — primitive'e çevir (kavramsal). OOB write ise: free/adjacent pool slot'unu attacker-kontrollü bir yapı ile groom et, corruption'ı bir pointer/refcount üzerine yönlendir, oradan kontrollü R/W'ye. OOB read ise: sızan kernel pointer ile KASLR bypass veya doğrudan bilgi ifşası. Bu adımların ayrıntısı bu KB'nin altitude'u dışındadır — burada sadece bir length/offset field'ının neden ring0 corruption'a kadar zincirlenebildiğini göstermek istiyoruz.

Detection

Host / telemetry sinyalleri

  • Bugcheck / crash pattern. ndis.sys ya da bir vendor miniport (*.sys) frame'inde tekrarlayan SYSTEM_THREAD_EXCEPTION_NOT_HANDLED, DRIVER_OVERRAN_STACK_BUFFER, PAGE_FAULT_IN_NONPAGED_AREA bugcheck'leri — özellikle OOB read/write class'ının imzasıdır. WER/minidump'ları network driver stack'i için topla ve baseline'a göre anomaliyi işaretle.
  • Driver Verifier / Special Pool. Şüpheli miniport'a Verifier (pool bounds, IRQL checks, DMA verification) uygulandığında ilk hatalı access'te bugcheck üretmesi — CI/lab tarafında proaktif tespit.
  • ETW. Microsoft-Windows-NDIS ve Microsoft-Windows-Kernel-Network provider'larından anormal OID request hacmi/oranı, beklenmedik OID kodları ve reset/hang indication'ları (MiniportResetEx) telemetri anomalisi olarak.
  • BYOVD korelasyonu. Bilinen-zayıf vendor NDIS/LWF driver'larının (imzalı ama vulnerable) yüklenmesi; loaded-driver inventory'yi Microsoft vulnerable-driver blocklist'i ile karşılaştır.

Mitigation

Patch + hardening

  • Patch. İlgili MSRC güncellemelerini uygula: CVE-2015-6098 (MS15-117), CVE-2019-0707, CVE-2024-38048 hepsi NDIS length/bounds handling düzeltmeleridir. Vendor miniport'ları için OEM firmware/driver update'lerini takip et.
  • Driver-side validation. Miniport kodunda Microsoft'un kuralına uy: InformationBufferLength'i her zaman doğrula, out-of-bounds set değerinde NDIS_STATUS_INVALID_DATA / kısa buffer'da NDIS_STATUS_BUFFER_TOO_SHORT döndür. NBL/NB path'inde MDL span + offset/length'i buffer'a karşı yeniden hesapla; wire-derived length'e güvenme.
  • Build-time defense. Miniport'ları /GS, control-flow guard ve Static Driver Verifier + NDIS DDI compliance kuralları (NdisOidComplete, NdisTimedOidComplete, ...) ile derle; runtime'da Driver Verifier ve Special Pool ile validate et.
  • Attack-surface reduction. HVCI / memory-integrity ve Microsoft vulnerable-driver blocklist ile bilinen-zayıf NDIS driver'larının yüklenmesini engelle; gereksiz protocol/LWF driver'larını unbind et.

References