Bericht über CVE-2023-28218
Bug-Übersicht
Der Fehler führt zur Privilegieneskalation im Windows-Kernel. Der Fehler tritt im Treiber Windows Ancrillary Function Driver for WinSock (AFD.sys) auf. Der Fehler wurde im Patch vom 11.04.2023 veröffentlicht. Er hat eine Bewertung von CVSS:3.1 7.0 / 6.1 und wird als Important eingestuft.
Bug-Beschreibung
- Fehlertyp:
Double fetch und Integer overflow führen zu pool overflow.
- Der Fehler tritt in den Funktionen
Afd!AfdComputeCMSGLength und Afd!AfdCopyCMSGBuffer auf.

Diese beiden Funktionen erhalten beide v82 als Eingabeparameter. v82 ist eine vom Usermode kontrollierte Adresse. In der Funktion Afd!AfdComputeCMSGLength wird diese Adresse direkt referenziert, um den Wert zu erhalten. Anschließend wird die Länge des CMSG-Puffers berechnet und zurückgegeben. Danach wird ein Pool mit dieser Größe alloziert. Durch die Kontrolle der beiden Eingabeparameter a1 und a2 können wir die Größe steuern, die im Parameter a3 zurückgegeben wird.

In der Funktion Afd!AfdCopyCMSGBuffer wird die Adresse v82 direkt referenziert, um den Wert zu erhalten. Nach einigen Prüfungen wird dieser Wert als Größe für die memmove-Operation verwendet.

In dieser Funktion gibt es einen Integer overflow. In Kombination damit, dass beide Funktionen direkt von der Adresse im Usermode abrufen, können wir den Wert während der Laufzeit ändern. Dies führt zu einer sehr großen Größe bei memmove. Beim Kopieren in einen nicht zugänglichen Speicherbereich tritt ein try-catch auf. Aber das Kopieren der vorherigen Speicherbereiche ist bereits erfolgt. Dadurch können wir mit der gewünschten Größe kopieren.

- Um den PoC auszulösen, muss zunächst ein
Socket mit dem Parameter type = SOCK_DGRAM erstellt werden. Anschließend wird der Handle dieses Sockets als Parameter für die bind-Funktion verwendet. Zuletzt werden zwei Threads erstellt: Ein Thread ruft wiederholt DeviceControl mit dem IOCTL 0x120D3 auf. Richten Sie einen geeigneten Userbuffer ein, um einige Prüfungen zu umgehen. Der andere Thread ändert kontinuierlich den Wert an der Usermode-Adresse, der als Parameter für die beiden genannten Funktionen dient.
Exploit
- Mit diesem Fehler können wir einen Non-Paged-NX-Pool mit einer Größe überlaufen lassen, wobei die Daten vollständig vom Usermode kontrolliert werden können.
- Der Exploit-Ansatz besteht darin, viele Namedpipe-Objekte zu sprayen, dann einige Objekte freizugeben, um Löcher im Heap zu erzeugen. Anschließend wird ein Pool erstellt, dessen Größe aus der Funktion
Afd!AfdComputeCMSGLength berechnet wird. Diese Größe muss mit der Größe des Namedpipe-Objekts übereinstimmen. Dann wird der Pool in die gerade freigegebenen Objekte alloziert. Mit dem Bug werden benachbarte Namedpipe-Objekte überlaufen, um dann die Mechanismen von Namedpipe zu nutzen und Lese-/Schreibzugriff auf den Kernel-Speicher zu erhalten. Das Token des Systemprozesses wird gelesen und dann in das Token des aktuellen Prozesses geschrieben.
Betroffene Versionen
- Windows Server 2012 R2 (Server Core installation) Build vor Version 6.3.9600.20919
- Windows Server 2012 R2 Build vor Version 6.3.9600.20919
- Windows Server 2012 (Server Core installation) Build vor Version 6.2.9200.24216
- Windows Server 2012 Build vor Version 6.2.9200.24216
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation) Build vor Version 6.1.7601.26466
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 Build vor Version 6.1.7601.26466
- Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation) Build vor Version 6.0.6003.22015
- Windows Server 2008 for x64-based Systems Service Pack 2 Build vor Version 6.0.6003.22015
- Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation) Build vor Version 6.0.6003.22015
- Windows Server 2008 for 32-bit Systems Service Pack 2 Build vor Version 6.0.6003.22015
- Windows Server 2016 (Server Core installation) Build vor Version 10.0.14393.5850
- Windows Server 2016 Build vor Version 10.0.14393.5850
- Windows 10 Version 1607 for x64-based Systems Build vor Version 10.0.14393.5850
- Windows 10 Version 1607 for 32-bit Systems Build vor Version 10.0.14393.5850
- Windows 10 for x64-based Systems Build vor Version 10.0.10240.19869
- Windows 10 for 32-bit Systems Build vor Version 10.0.10240.19869
- Windows 10 Version 22H2 for 32-bit Systems Build vor Version 10.0.19045.2846
- Windows 10 Version 22H2 for ARM64-based Systems Build vor Version 10.0.19045.2846
- Windows 10 Version 22H2 for x64-based Systems Build vor Version 10.0.19045.2846
- Windows 11 Version 22H2 for x64-based Systems Build vor Version 10.0.22621.1555
- Windows 11 Version 22H2 for ARM64-based Systems Build vor Version 10.0.22621.1555
- Windows 10 Version 21H2 for x64-based Systems Build vor Version 10.0.19044.2846
- Windows 10 Version 21H2 for ARM64-based Systems Build vor Version 10.0.19044.2846
- Windows 10 Version 21H2 for 32-bit Systems Build vor Version 10.0.19044.2846
- Windows 11 version 21H2 for ARM64-based Systems Build vor Version 10.0.22000.1817
- Windows 11 version 21H2 for x64-based Systems Build vor Version 10.0.22000.1817
- Windows 10 Version 20H2 for ARM64-based Systems Build vor Version 10.0.19042.2846
- Windows 10 Version 20H2 for 32-bit Systems Build vor Version 10.0.19042.2846
- Windows 10 Version 20H2 for x64-based Systems Build vor Version 10.0.19042.2846
- Windows Server 2022 (Server Core installation) Build vor Version 10.0.20348.1668
- Windows Server 2022 Build vor Version 10.0.20348.1668
Der Patch
- Der Fehler wurde behoben, indem die beiden alten Funktionen durch zwei neue Funktionen ersetzt wurden. Die alten Funktionen erhielten das Suffix
_old an ihren Namen. Diese neuen Funktionen haben. In den neuen Funktionen gibt es zwar immer noch einen Double Fetch, aber der abgerufene Wert wird vor der Verwendung überprüft. Die Rtl-Funktionen werden verwendet, um die arithmetischen Operationen zu ersetzen und einen Integer overflow zu verhindern.
Fazit
- Der Fehler hat einen sehr weiten betroffenen Bereich und bedroht viele Systeme. Allerdings hat das Exploit-Payload beim Ausführen immer noch eine kleine Fehlerrate, die zu einem Windows-Absturz aufgrund des Heap-Sprays führt. Zudem führt das Beenden dieses Prozesses, nachdem die cmd-Prozessrechte auf System erhöht wurden, ebenfalls zu einem Windows-Absturz. Dies liegt daran, dass während des Exploits das Namedpipe-Objekt beschädigt wurde.
Anhänge
- Minimaler PoC

- Exploit PoC
