
Эксплойт для CVE-2023-5178
Эксплойт для
CVE-2023-5178: уязвимость NVMe-oF-TCP, которая представляет собой логическую ошибку в драйвере NVMe-oF-TCP при обработке повреждённого Initialize Connection Request. Она приводит к гонке с double-free в kmalloc-96, которую можно использовать для получения LPE (см. демо ниже).
Эксплойт нацелен на Ubuntu 23.10 с ядром 6.5.0-9-generic (последняя затронутая версия ядра).
v6, изменив символы ядра и подогнав ropchain.v5 требует некоторых незначительных доработок, которые я опишу в статье. Эксплуатация в ядре v5 проще (я расскажу об этом в статье) и надёжнее.Баг был обнаружен Алоном Захави (Alon Zahavi). Он опубликовал хорошее описание уязвимости в этой статье на openwall.
Смотрите видео здесь.

nvmet, nvmet-tcp в ядро.libfuse3-dev (по умолчанию он есть в Ubuntu, но тем не менее). Если его нет, лучше всего скачать и скомпилировать релиз с github.
Я использовал 3.14.0, но он должен работать и с другими версиями.SLUB, но состояние гонки (race condition) делает всё немного сложнее. В любом случае, я опишу в статье, как его можно улучшить для работы на многоядерных машинах.git clone https://github.com/rockrid3r/CVE-2023-5178
cd CVE-2023-5178
make
./build/xpl # run the exploit
libfuse3-dev, вам нужно вручную слинковать скомпилированный libfuse.
Смотрите Makefile для того, как компилировать. Замените -lfuse3 на -l:path-to-libfuse.so. Не забудьте добавить путь к заголовкам с помощью -I /path/to/libfuse-headers/.
Запустите эксплойт так:LD_PRELOAD_PATH=/path/to/libfuse.so ./build/exploit
Для тех, кто хочет проверить, присутствует ли уязвимость в их системе, есть файл src/poc.c, который просто инициирует баг.
Он предполагает стандартную конфигурацию ip/port для NVMe-oF-TCP в вашей системе.
Вам следует изменить их, если ваши значения нестандартные:
#define NVME_SERVER_IP "0.0.0.0" // ip of vulnerable host in LAN (localhost here).
#define NVME_SERVER_PORT 4420 // port on which NVMe-oF-TCP is set up on vulnerable host
Скомпилируйте и запустите его с помощью
make build/poc
./build/poc
Просто запустите его (возможно, несколько раз) и немного подождите. Если уязвимость присутствует, система упадёт.
Смотрите полный разбор здесь