
Exploit für CVE-2023-5178
Der Exploit für
CVE-2023-5178: NVMe-oF-TCP-Sicherheitslücke, ein Logikfehler im NVMe-oF-TCP-Treiber bei der Verarbeitung einer korrupten Initialize Connection Request. Er führt zu einer racy double-free in kmalloc-96, was ausgenutzt werden kann, um LPE zu erlangen (siehe Demo unten).
Der Exploit zielt auf Ubuntu 23.10 mit Kernel 6.5.0-9-generic (die neueste betroffene Kernelversion).
v6-Kernel zurückportiert werden, indem man Kernel-Symbole ändert
und die ROP-Kette anpasst.v5 erfordert einige kleinere Modifikationen, die ich im Writeup besprechen werde. Die Ausnutzung im Kernel v5 ist einfacher (ich werde es im Writeup besprechen) und zuverlässiger.Der Bug wurde von Alon Zahavi entdeckt. Er hat eine gute Beschreibung der Sicherheitslücke in diesem Openwall-Artikel veröffentlicht.
Siehe Video hier.

nvmet, nvmet-tcp in den Kernel geladen haben.libfuse3-dev installiert ist (standardmäßig auf Ubuntu, aber trotzdem). Falls nicht, ist die beste Idee, die Version von github herunterzuladen und zu kompilieren.
Ich habe 3.14.0 verwendet, aber es sollte auch mit anderen Versionen funktionieren.SLUB, aber die Race-Condition macht die Sache etwas knifflig. Ich werde im Writeup beschreiben, wie es verbessert werden kann, um Multi-CPU-Maschinen zu unterstützen.git clone https://github.com/rockrid3r/CVE-2023-5178
cd CVE-2023-5178
make
./build/xpl # Exploit ausführen
libfuse3-dev nicht installiert haben, müssen Sie die kompilierte libfuse manuell verlinken.
Siehe Makefile für Anweisungen zum Kompilieren. Ersetzen Sie -lfuse3 mit -l:pfad-zu-libfuse.so. Vergessen Sie nicht, den Header-Pfad mit -I /pfad/zu/libfuse-headers/ hinzuzufügen.
Führen Sie den Exploit aus mit:LD_PRELOAD_PATH=/pfad/zu/libfuse.so ./build/exploit
Für diejenigen, die testen möchten, ob die Sicherheitslücke auf ihrem System vorhanden ist, gibt es die Datei src/poc.c, die einfach den Bug auslöst.
Es wird die Standardkonfiguration von IP/Port für NVMe-oF-TCP auf Ihrem System angenommen.
Sie sollten diese anpassen, wenn Ihre nicht dem Standard entsprechen:
#define NVME_SERVER_IP "0.0.0.0" // IP des verwundbaren Hosts im LAN (hier localhost).
#define NVME_SERVER_PORT 4420 // Port, auf dem NVMe-oF-TCP auf dem verwundbaren Host eingerichtet ist
Kompilieren und ausführen mit
make build/poc
./build/poc
Sie sollten es einfach ausführen (vielleicht mehrmals) und dann ein wenig warten. Wenn die Sicherheitslücke vorhanden ist, stürzt das System ab.
Siehe vollständiges Writeup hier