
Полная цепочка эксплойта для CVE-2025-7771 в ThrottleStop.sys, использующая невалидированные IOCTL-запросы чтения/записи физической памяти для повышения привилегий от администратора до SYSTEM в Windows.
Полноценный proof-of-concept для драйвера TechPowerUp ThrottleStop.sys (CVE-2025-7771).
Подписанный, всё ещё загружаемый драйвер ядра предоставляет непроверенное чтение и
запись физической памяти через два IOCTL. Этот репозиторий превращает данный примитив в
рабочую локальную эскалацию привилегий из администратора в SYSTEM и документирует
особенность именования устройства, которая ломает большинство детектов, основанных на
путях и именах файлов.
PoC для тех же IOCTL уже существовал (см. раздел «Благодарности»). Это независимая, полная цепочка эксплуатации, а не демонстрация примитива.
| Поле | Значение |
|---|---|
| SHA256 | 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0 |
| SHA1 | 82ED942A52CDCF120A8919730E00BA37619661A3 |
| MD5 | 6BC8E3505D9F51368DDF323ACB6ABC49 |
| Версия | 3.0.0.0 ("Low-Level Driver", 2004-2020) |
| Подписант | TechPowerUp LLC, DigiCert EV Code Signing |
| Отпечаток сертификата | 524EDA9C819321C66E22C7BABEB23DAEAFFB2182 |
| Срок действия сертификата | 2019-08-10 — 2022-06-15 |
Сертификат истёк в 2022 году, но подпись несёт доверенную контрассигнатуру с меткой времени, поэтому Windows всё ещё загружает драйвер. Отзыв помогает только если его дата предшествует времени подписи, что редко бывает для таких старых драйверов.
В ресурсе версии отсутствуют CompanyName, OriginalFilename и InternalName, поэтому
файл невозможно атрибутировать вендору по его собственным метаданным.
Два IOCTL читают и записывают физическую память без проверки границ или адреса:
| IOCTL | Операция |
|---|---|
0x80006498 | Чтение физической памяти |
0x8000649C | Запись физической памяти |
Оба используют METHOD_BUFFERED, поэтому разыменования пользовательского указателя нет;
дефект заключается в отсутствии проверки предоставленного вызывающим физического адреса,
а не в непроверенном указателе.
Стоит отметить: обработчик записи 0x8000649C объявлен как FILE_READ_ACCESS. Дескриптор,
открытый только для чтения, всё равно может выполнять запись в физическую память, поэтому
объявленная маска доступа не соответствует тому, что обработчик делает на самом деле.
Открытие устройства требует прав администратора, поэтому само по себе это не пересечение границы привилегий. Но атакующему, уже обладающему правами администратора, это даёт произвольное чтение/запись ядра из пользовательского режима, что обходит защиты, которые должны действовать выше уровня администратора: целостность кода HVCI, PPL и самозащиту EDR/AV. Классический bring-your-own-vulnerable-driver.
В качестве конкретной демонстрации PoC использует примитив чтения/записи для кражи токена SYSTEM и запуска оболочки SYSTEM.
CVSS 4.0: AV:L/AC:H/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H (8.7, High).
Всё выполняется из пользовательского режима через IOCTL физического чтения/записи драйвера. Обхода таблиц страниц и использования CR3 нет; оба процесса находятся прямым сканированием физической памяти:
ImageFileName равно System, а UniqueProcessId равно 4. Сканирование ограничено
диапазонами занятой оперативной памяти, прочитанными из ключа реестра прошивки
HARDWARE\RESOURCEMAP\...\Physical Memory, а не угаданным окном, поэтому дыры MMIO
никогда не затрагиваются и ничего выше установленной оперативной памяти не пропускается.Token (EPROC_TOKEN) из найденного
EPROCESS.Token.
Токен является _EX_FAST_REF, поэтому младшие биты счётчика ссылок по умолчанию
маскируются (--mask выбирает поведение).cmd.exe; whoami возвращает NT AUTHORITY\SYSTEM.Смещения (EPROC_TOKEN, EPROC_PID, EPROC_IMG_NAME и т. д.) предназначены для
конкретной сборки и должны быть подтверждены через dt nt!_EPROCESS на целевой версии
Windows.
Имя исполняемого файла имеет значение. Шаг 3 находит наш собственный процесс путём
сопоставления его ImageFileName в физической памяти, а это поле ограничено 15 символами,
при этом сканирование сопоставляет первые 8. Держите скомпилированное имя коротким и
уникальным; если переименовываете бинарник, оставайтесь в этих пределах, иначе
самосканирование не найдёт процесс.
Драйвер не использует фиксированное имя устройства. Он выводит имя объекта устройства из
имени службы, под которой зарегистрирован; имя файла на диске не имеет значения.
Регистрация бинарника под службой TRIXX даёт \\.\TRIXX независимо от того, как файл
называется на диске.
Таким образом, любой детект, завязанный на \Device\ThrottleStop или ThrottleStop.sys,
тривиально обходится. Детектирование должно основываться на хеше файла или сертификате
подписи:
SHA256: 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0
Thumbprint: 524EDA9C819321C66E22C7BABEB23DAEAFFB2182
Subject: CN=TechPowerUp LLC, O=TechPowerUp LLC, L=Spokane, S=Washington, C=US
Список DEVICE_NAMES в исходном коде — это лишь проба для известных установок продукта.
Передайте имя устройства аргументом, чтобы нацелиться на службу, зарегистрированную вами
самостоятельно.
| CVE | Драйвер |
|---|---|
| CVE-2019-7245 | GPU-Z.sys |
| CVE-2025-5324 | GPU-Z.sys |
| CVE-2025-7771 | ThrottleStop.sys (этот репозиторий) |
Бинарник здесь не поставляется. Проверяйте любую копию по SHA256 выше. Образец каталогизирован в LOLDrivers.
cl /nologo /EHsc /W4 /O2 src\ThrottleStop.cpp /Fe:myLittleLpe.exe /link advapi32.lib
Только для лабораторного использования. Запускайте внутри изолированной виртуальной машины со снимком для отката.
sc.exe create <name> type= kernel binPath= C:\path\to\ThrottleStop.sys
sc.exe start <name>
myLittleLpe.exe
sc.exe stop <name>
sc.exe delete <name>
Бинарник не принимает аргументов. Он выводит карту физической памяти, сканирует в поисках
EPROCESS SYSTEM и локального процесса, подменяет токен и запускает cmd.exe от имени
NT AUTHORITY\SYSTEM.

Другие публичные работы по тому же драйверу для сравнения:
Опубликовано для защитных исследований и инженерии детектирования. Уязвимость уже публична как CVE-2025-7771. Всё здесь тестировалось на системах, принадлежащих автору. Не запускайте это против систем, которыми вы не владеете или не имеете разрешения тестировать.