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

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

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

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

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

Категории

Все категории
Loading categories
KVM-Januscape — Патч для уязвимости CVE-2026-53359 | Kitploit
Инструменты/GitHubGitHub/xj2268-ta/kvm-januscape
Анализ уязвимостейЭксплуатацияАнализ Бинарных Файлов
GitHubxj2268-ta/kvm-januscape

KVM-Januscape

Патч для уязвимости CVE-2026-53359

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

Популярное

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

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

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

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

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

KVM-XJ горячий патч

dump_tool.py — это инструмент для автоматического поиска смещений. Как им пользоваться, смотрите в коде.

Обзор уязвимости

CVE-2026-53359 (Januscape) — это уязвимость use-after-free (UAF) в теневом MMU KVM ядра Linux.

  • Время скрытого существования: 16 лет (август 2010 — июль 2026)
  • Сфера влияния: все системы Intel/AMD x86 с включённой вложенной виртуализацией
  • Степень опасности: высокая — root-пользователь внутри VM может выйти в хост и получить root-доступ к хосту
  • Способ эксплуатации: паника ядра хоста (DoS) или полный выход из VM (публичного PoC нет)

Принцип уязвимости

Функция kvm_mmu_get_page() при поиске повторно используемой теневой таблицы страниц в хеш-таблице сравнивает только gfn (гостевой номер кадра страницы), но не сравнивает role (роль таблицы/роль MMU), что приводит к ошибочному повторному использованию таблицы с несовпадающей ролью и вызывает UAF.

root@kitploit:~
До исправления (уязвимо):
┌──────────────────────────────────────┐
│ kvm_mmu_get_page()                   │
│   обход хеш-таблицы                  │
│   if (child->gfn == gfn)             │
│       return child  ← сравнивается только gfn!
│       несовпадение роли → повторное использование → UAF!
│   выделение новой страницы (безопасно)|
└──────────────────────────────────────┘

В коммите вышестоящего ядра 81ccda30b4e8 добавлена одна строка сравнения role:

root@kitploit:~
// До исправления
if (... && spte_to_child_sp(*sptep)->gfn == gfn)

// После исправления
if (... && spte_to_child_sp(*sptep)->gfn == gfn
       && spte_to_child_sp(*sptep)->role.word == role.word)

Мой метод исправления

Метод: бинарный горячий патч text_poke (NOP Patch)

Без изменения исходного кода ядра, без замены функций — напрямую модифицируем уязвимую инструкцию в памяти работающего ядра.

Принцип

root@kitploit:~
На бинарном уровне:
смещение 0x104: 49 39 47 28          cmp %rax, 0x28(%r15)   ← сравнение gfn
смещение 0x108: 0f 84 9f 01 00 00    je   +0x19f            ← при совпадении переход на повторное использование

После наложения патча:
смещение 0x108: 66 0f 1f 44 00 00    NOP × 6               ← ничего не делает
root@kitploit:~
После исправления:
┌──────────────────────────────────────┐
│ kvm_mmu_get_page()                   │
│   обход хеш-таблицы                  │
│   if (child->gfn == gfn)             │
│       NOP (переход стёрт, проскальзываем)
│   выделение новой страницы (принудительно безопасный путь)
│   → нет повторного использования = нет UAF = уязвимость исправлена
└──────────────────────────────────────┘

Техническая реализация

  1. Находим адрес функции kvm_mmu_get_page через kallsyms_lookup_name
  2. Находим адрес функции text_poke (API горячей модификации кода ядра) через kallsyms_lookup_name
  3. Используем stop_machine, чтобы приостановить все CPU и обеспечить безопасность модификации
  4. С помощью text_poke заменяем 6-байтовую инструкцию je на 6-байтовую инструкцию NOP
  5. При выгрузке восстанавливаем исходную инструкцию с помощью text_poke

Почему не использованы другие решения

РешениеПроблема
Обновление ядра с перезагрузкойТребуется перезагрузка хоста, все VM останавливаются
nested=0 (отключение вложенной виртуализации)Потеря функциональности вложенной виртуализации, невозможность запуска VM внутри VM
Метод kpatchТребуется kernel-debuginfo, компиляция занимает 10-20 минут, сложные зависимости
Замена функции через ftracekvm_mmu_get_child_sp встраивается (inlined) GCC, нет отдельной точки входа
Мой подход text_pokeКомпиляция за 10 секунд, один .c-файл, прямое исправление уязвимой инструкции

Оценка влияния

ФункцияВлияние
Перезагрузка хостаНе требуется
Перезагрузка/миграция VMНе требуется
Вложенная виртуализация (VM внутри VM)Сохраняется, работает нормально
Создание/запуск VMНормально
Слияние памяти KSMНе затрагивается, независимая функция
Производительность CPUПочти не влияет (NOP не потребляет CPU)
ПамятьТеневые таблицы страниц больше не повторно используются, каждый раз выделяется новая страница, небольшое дополнительное потребление памяти
Выгрузка модуля KVMНормально (rmmod автоматически восстанавливает исходный код)

Требования к развёртыванию

УсловиеОписание
Версия ядраLinux 4.18+ (CentOS 8 / RHEL 8 / Rocky 8 и т.д.)
Среда сборкиkernel-devel + gcc + make
Перезагрузка хостаНе требуется
Остановка VMНе требуется
Вложенная виртуализацияСохраняется

Компиляция и загрузка

root@kitploit:~
# Компиляция
make

# Загрузка горячего патча
insmod KVM-XJ.ko

# Просмотр статуса
dmesg | grep KVM-XJ
cat /sys/module/kvm_intel/parameters/nested   # должно быть 1
lsmod | grep KVM_XJ

# Выгрузка (восстановление исходного кода)
rmmod KVM_XJ

Адаптация к другим версиям ядра

Разные версии ядра дают разную оптимизацию компиляции, поэтому смещение je также различно. Используйте dump_tool.py для автоматического анализа:

root@kitploit:~
# 1. Скачать kvm.ko с хоста
scp root@хост:/lib/modules/.../kvm.ko.xz .
xz -d kvm.ko.xz

# 2. Запустить инструмент анализа
python dump_tool.py kvm.ko

# 3. Инструмент выведет смещение для патча, измените 0x108 в KVM-XJ.c

Проверенные версии ядра

Версия ядраСмещение jeСтатус
4.18.0-496.el8.x86_640x108Протестировано
4.18.0-358.el8.x86_640xe8Протестировано

Примечания

  1. Тем, кто не умеет пользоваться и не смотрит код, использовать не рекомендуется.
Скачать инструмент