
Минимальный proof-of-concept для CVE-2026-29923 — уязвимости в драйвере ядра pstrip64.sys (EnTech Taiwan PowerStrip ≤ 3.90.736), которая позволяет непривилегированному процессу в режиме пользователя повысить привилегии до NT AUTHORITY\SYSTEM.
pstrip64.sys предоставляет IOCTL (0x80002008), который принимает физический адрес, указанный пользователем, и напрямую отображает его в виртуальное адресное пространство вызывающего процесса, открывая \Device\PhysicalMemory и вызывая ZwMapViewOfSection с дескриптором текущего процесса. Никакой проверки привилегий, никакой валидации адресов, кроме той, что выполняет HalTranslateBusAddress, и никакого контроля доступа к символической ссылке \\.\PSTRIP64.
В результате непривилегированный процесс получает неограниченный примитив чтения/записи физической памяти.
Имея произвольное чтение/запись физической памяти, эксплойт выполняет четыре шага.
1. Поиск структур EPROCESS
Физическая память сканируется блоками по 2 МБ. В каждом блоке ищется тег пула ядра Proc (0x636F7250), который отмечает выделение пула, содержащее структуру _EPROCESS процесса. Кандидаты проверяются с помощью трёх лёгких эвристик, прежде чем PID начинает считаться достоверным:
PriorityClass == 0x2 — все активные процессы работают с обычным приоритетомProcessLock == 0x0 — поле блокировки сброшено у стабильного процессаImageFileName[0] — печатный ASCII; мусорные данные редко удовлетворяют этому условию2. Поиск обоих указателей на токен
Нужны два целевых значения:
Token нашего собственного процесса внутри _EPROCESS_EPROCESS системного процесса (PID 4)3. Перезапись нашего токена
Страница 4 КБ, содержащая наше поле Token, отображается, и поле перезаписывается значением системного токена. С этого момента ядро Windows обрабатывает наш процесс как NT AUTHORITY\SYSTEM.
4. Запуск оболочки
cmd.exe запускается через CreateProcessA. Поскольку дочерние процессы наследуют токен родительского процесса, полученная оболочка работает как SYSTEM.
Окно физических адресов от 3 до 4 ГБ на системах x86 зарезервировано под MMIO. Попытка отобразить страницы в этом диапазоне приводит к тому, что драйвер возвращает ошибку 74 (сбой HalTranslateBusAddress). Сканирование пропускает это окно и продолжается с 0x100000000, чтобы перехватить структуры ядра, которые Windows размещает выше отметки 4 ГБ.
Обработчик отображения драйвера записывает возвращаемый виртуальный адрес в поле DWORD (LowPart), усекая 64-битный VA до 32 бит. 64-битная сборка получает повреждённый указатель и немедленно падает. Компилируйте как x86.
| Программное обеспечение | Версии |
|---|---|
| EnTech Taiwan PowerStrip | ≤ 3.90.736 |
Хэш драйвера (SHA-256):
ab01485bb7c8bc1a9c86096eeea6d31d8fad557bf4d44072b46373d2203faa6e
Жёстко заданные смещения рассчитаны на Windows 10 22H2 x64. Для других сборок требуются обновлённые значения — используйте dt nt!_EPROCESS в WinDbg для проверки.
Откройте командную строку разработчика x86 Visual Studio и выполните:
cl /EHsc /O2 exploit.c /Fe:poc.exe
Или установите целевую платформу x86 в Visual Studio и соберите проект в конфигурации Release. Бинарный файл не требует внешних зависимостей, кроме Windows SDK.
Сначала загрузите pstrip64.sys (для загрузки драйвера требуются права администратора, но не для запуска самого эксплойта после его загрузки), затем:
poc.exe
Откроется новое окно cmd.exe, работающее от имени NT AUTHORITY\SYSTEM.
Заблокировать загрузку драйвера (рекомендуется)
Обнаружение попыток эксплуатации
SYSTEMNT AUTHORITY\SYSTEM вне легитимного события аутентификацииЭтот код опубликован только в образовательных и защитных исследовательских целях. Используйте его только на системах, которыми вы владеете или на тестирование которых у вас есть явное письменное разрешение. Автор не несёт ответственности за любое неправомерное использование.
| Поле | Смещение |
|---|
PriorityClass | 0x5B7 |
ProcessLock | 0x438 |
UniqueProcessId | 0x440 |
ImageFileName | 0x5A8 |
Token | 0x4B8 |