Kernel-hack-drill and exploiting CVE-2024-50264 in the Linux kernel
CVE-2024-50264: кратко о сложнейшей гонке в AF_VSOCK
Уязвимость введена в 2016 г. (ядро 4.8); это race между connect()
AF_VSOCK и POSIX-сигналом, приводящий к UAF 80-байтового объекта virtio_vsock_sock
. Триггер доступен обычному пользователю без user-ns. Ограничения: объект быстро освобождается, UAF-запись делает kworker, система легко падает. За это баг получил Pwnie 2025 «Best Privilege Escalation».
Управление сигналом без самоубийства процесса
Вместо SIGKILL
, который убивает эксплойт, используется «бессмертный» сигнал 33:
sev.sigev_signo = 33;
timer_create(CLOCK_MONOTONIC, &sev, &race_timer);
timer_settime(...); // точный момент прерывания connect()
Сигнал 33 зарезервирован NPTL, процесс его не видит и не завершается.
kernel-hack-drill: тренажёр для ядерных атак
Проект https://github.com/a13xp0p0v/kernel-hack-drill автоматизирует:
- сборку нужных версий ядра Ubuntu 24.04 (6.11 OEM/HWE) с разными конфигурациями KASLR/KCFI/SLAB_QUARANTINE;
- запуск в KVM с заданным RAM/CPU и ssh-форвардингом;
- однокнопочный запуск PoC и сбор crash-дампов.
Инструмент позволил быстро перебирать стратегии перераспределения kmalloc-96
, искать объекты-спрей, тестировать разные техники обхода защит и отлаживать эксплойт без ручной пересборки ядра.
Новый путь эксплуатации
Автор отказался от сложной цепочки @v4bel и @qwerty и применил упрощённую схему:
- Спрей
sendmsg()
-controlled объектами размером 96 байт, чтобы перехватить освобождённыйvirtio_vsock_sock
. - UAF-запись переписывает поле
sk_prot
, указывая на поддельную структуруproto
в userspace-буфере. - При последующем вызове
close()
ядро переходит по контролируемому указателю и исполняет ROP-цепочку, поднимая shell до root.
kernel-hack-drill сократил время от идеи до рабочего PoC с недель до нескольких часов.