QUIC-Herunterfahren: DoS-Schwachstelle in Windows-Servern mit SMB über QUIC
Zusammenfassung
Der Forscher Ben Barnea von Akamai fand eine wichtige Schwachstelle in Microsoft Windows Server 2022, die die Kennung CVE-2023-24898 und einen Basiswert von 7,5 erhalten hat.
Die Schwachstelle besteht in einer fehlenden Überprüfung in einer Pufferzuweisung im Treiber srvnet.sys.
Die Schwachstelle kann für Remote-DoS-Angriffe auf Computer mit Windows Server 2022 genutzt werden. Die Schwachstelle kann von einem nicht authentifizierten Angreifer über das Internet ausgelöst werden.
Nur Server, die SMB über QUIC verwenden, eine relativ neue Funktion, sind anfällig. Um diese Funktion zu aktivieren, ist ein Server mit Windows Server 2022 Azure Edition erforderlich.
Die Schwachstellen wurden verantwortungsvoll an Microsoft weitergegeben und im Patch Tuesday im Mai 2023 behoben.
Wir stellen eine Insight-Abfrage für Nutzer von Akamai Guardicore Segmentation bereit, um potenziell anfällige Server in ihren Netzwerken zu erkennen.
Einführung
QUIC ist ein relativ neues Transportprotokoll mit mehreren Implementierungen, das ursprünglich von Google entwickelt wurde. QUIC soll eine zuverlässigere und sicherere Verbindung bieten und gleichzeitig häufige Internetprobleme wie Latenz und Paketverlust lösen. Die Übertragung erfolgt über UDP.
Die Microsoft-Implementierung von QUIC heißt MsQuic. Windows beinhaltet QUIC und verwendet es als Transportschicht für das SMB-Protokoll (eine Funktion namens SMB über QUIC) und mit HTTP/3 in IIS. SMB über QUIC ist nur in der Windows Server 2022 Azure Edition verfügbar, während HTTP/3 für alle IIS-Bereitstellungen unter Windows Server 2022 verfügbar ist.
Die in diesem Blogbeitrag behandelte Schwachstelle liegt im Treiber, der die Transportschicht von SMB implementiert, srvnet.sys.
Die Schwachstelle
Um den Status einer Verbindung beizubehalten, verwendet QUIC eine Verbindungs-ID, die eine Verbindung zwischen dem Client und dem Server eindeutig identifiziert. Ein Client kann mehrere gleichzeitige Verbindungen erstellen. Eine QUIC-Verbindung wird ebenfalls multiplext, d. h. ein Client und ein Server können Daten über mehrere Ströme gleichzeitig über dieselbe Verbindung austauschen.
Der Code für SMB über QUIC ist in srvnet.sys implementiert. Wenn der Server neue Daten in einem Strom empfängt, wird die Funktion SrvNetQuicServerReceiveEvent aufgerufen. Der Zweck der Funktion besteht darin, eine vollständige SMB-Nachricht zu lesen, die vom Client gesendet wird. Nach erfolgreichem Abschluss wird die Nachricht zur weiteren Verarbeitung in die Liste der SMB-Nachrichten übertragen.
Um eine SMB-Nachricht zu lesen, versucht der Code zunächst, die Größe der SMB-Nachricht zu ermitteln, die durch eine vier Byte lange Ganzzahl dargestellt wird. Wenn dies erfolgreich ist, wird überprüft, dass die Größe nicht größer ist als die maximal zulässige Größe für eine Zuweisung. Wenn die Überprüfung erfolgreich ist, weist der Code einen Puffer mit dieser Größe zu und versucht, die verbleibenden Bytes aus dem Paket in den neu zugewiesenen Puffer zu lesen. Wenn er die gesamte SMB-Nachricht gelesen hat, zeigt er der SMB-Schicht an, dass eine neue SMB-Nachricht empfangen wurde.
Die Struktur einer SMB-Nachricht ist in Abbildung 1 dargestellt.
Die Schwachstelle tritt auf, wenn weniger als vier Byte für die SMB-Nachrichtengröße empfangen werden (Abbildung 2). In diesem Fall speichert der Code die X empfangenen Bytes und legt PendingMessageSize auf 4 minus X fest – X ist die Anzahl der Bytes, die für die Nachrichtengröße empfangen werden. Beim nächsten Empfang eines Pakets werden die für die SMB-Nachrichtengröße benötigten verbleibenden 4 minus X Byte gelesen.
Sobald der Code die Nachrichtengröße gelesen hat, weist er sofort eine SMB-Nachricht zu, ohne diese Größe mit der maximal zulässigen Größe zu vergleichen. Indem er die Größe der SMB-Nachricht in zwei Paketen statt in einem sendet, kann ein Angreifer die Überprüfung der maximal zulässigen Größe umgehen und eine außergewöhnlich große Zuweisung anfordern.
Exploit
Um diesen Fehler in eine DoS-Schwachstelle zu verwandeln, müssen wir kontinuierlich Pakete senden, die das beschriebene Problem auslösen.
Aber selbst wenn die maximal zulässige Größe umgangen werden kann, gibt es immer noch zwei Einschränkungen:
1. SrvNetAllocateBuffer hat eine feste Obergrenze von 16 MB für Zuweisungen.
2. Die Anzahl der zulässigen gleichzeitigen nicht authentifizierten Verbindungen ist entsprechend dem verfügbaren RAM auf dem Server begrenzt. Durch diese Begrenzung wird die Ausnutzung auf Server mit bis zu 32 GB RAM beschränkt. (Im nächsten Abschnitt werden wir theoretisch erläutern, wie diese Begrenzung umgangen werden kann.)
Um diese Schwachstelle auszunutzen, haben wir zuerst versucht, mehrere Verbindungen zu erstellen und jedes Mal zwei Pakete zu senden, damit der Server 16 MB zuweist. Bei wiederholter Anwendung führt dies zu einer Erschöpfung des Speichers. Da diese Schwachstelle in einem Treiber liegt und im Kernelmodus ausgeführt wird, wird das gesamte System instabil und reagiert nicht mehr.
Ein optimierter Exploit?
Diese Methode erfordert das Senden vieler Pakete. Wir glauben, dass es durch den Missbrauch der Funktionen von QUIC möglich ist, die Anzahl der benötigten Pakete zu reduzieren.
Während QUIC mehrere Ströme über eine einzige Verbindung ermöglicht, ermöglicht es auch, diese Anzahl über die Objekteigenschaft initial_max_streams_bidi zu reduzieren. SMB über QUIC begrenzt die Anzahl gleichzeitiger Ströme für eine Verbindung auf einen Strom.
Obwohl wir den Exploit nicht durch die Verwendung von mehreren gleichzeitigen Strömen verbessern können, können wir versuchen, die Schwachstelle auf andere Weise auszunutzen. Anstatt mehrere gleichzeitige Ströme zu erstellen, erstellen wir ein QUIC-Paket mit mehreren Frames, sodass die folgende Sequenz seriell und wiederholt auftritt:
1. Strom erstellen
2. Zum Auslösen der 16-MB-Zuweisung zwei DATEN-Frames senden
3. Strom schließen
Auf diese Weise können wir auch die Begrenzung nicht authentifizierter Verbindungen umgehen. Aber das überlassen wir den Lesern als Herausforderung.
Erkennung und Beseitigung
Um einen Server mit SMB über QUIC zu finden, können Nutzer von Akamai Guardicore Segmentation die folgende einfache Insight-Abfrage ausführen:
select * from registry where
path="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\EnableSMBQUIC" and data=1
Wir empfehlen Ihnen das Patchen Ihres Windows-Server-Computers, da es keine anderen Abwehrmaßnahmen oder Workarounds für diese Schwachstelle gibt, außer das Deaktivieren von SMB über QUIC.
Zusammenfassung
QUIC ist ein relativ neues Netzwerkprotokoll, das eine bessere Performance und weniger Latenz garantiert. Es wurde offensichtlich bereits übernommen und in zwei sehr prominente Protokolle integriert: IIS (für HTTP/3) und SMB.
Wir halten QUIC für eine interessante neue Angriffsfläche unter Windows und im Allgemeinen. Abgesehen von dem hier beschriebenen Problem, wurde eine weitere Schwachstelle, CVE-2023-23392, in HTTP/3 behoben.
Wir ermutigen andere Forscher, sich mit den verschiedenen Komponenten, die MsQuic verwenden, und mit MsQuic selbst zu befassen.