
Драйвер ядра pstrip64.sys предоставляет IOCTL, который позволяет пользователям с низкими привилегиями отображать произвольные диапазоны физической памяти в своё собственное виртуальное адресное пространство. Этот примитив обеспечивает полный доступ на чтение и запись к физической ОЗУ системы, позволяя злоумышленникам изменять критические структуры ядра и повышать привилегии до NT AUTHORITY\SYSTEM.
Драйвер ядра pstrip64.sys предоставляет IOCTL, позволяющий пользователям с низкими привилегиями отображать произвольные диапазоны физической памяти в своё собственное виртуальное адресное пространство. Этот примитив обеспечивает полный доступ на чтение и запись к физической оперативной памяти системы, что позволяет атакующим изменять критически важные структуры ядра и повышать привилегии до NT AUTHORITY\SYSTEM.
Драйвер создаёт объект устройства \Device\PSTRIP64 и символическую ссылку \DosDevices\PSTRIP64, доступные пользователям.
Уязвимость находится в подпрограмме DispatchDeviceControl, а именно в обработчике IOCTL 0x80002008. Функция sub_11000 открывает дескриптор \Device\PhysicalMemory и отображает его напрямую в адресное пространство вызывающего процесса через ZwMapViewOfSection. Она принимает физический адрес и длину из входного буфера, преобразует их через HalTranslateBusAddress и отображает с помощью ZwCurrentProcess(). Атакующий может просканировать физическую память, чтобы найти структуру _EPROCESS своего процесса, и перезаписать security-токен на токен System, либо пропатчить код ядра напрямую.
Похожая уязвимость была впервые обнаружена в CVE-2008-5725 для файла pstrip.sys в предыдущих версиях приложения: драйвер PowerStrip через IOCTL 0x800020A8 позволял атакующему передать целевой адрес (например, HalDispatchTable) и данные для записи по этому адресу. Обнаруженная на этот раз в последней версии уязвимость явно позволяет пользователю отобразить любую физическую память в свой собственный процесс. Атакующий отображает физическую оперативную память, ищет структуру своего процесса и вручную изменяет свой токен для получения прав администратора. Работая с памятью напрямую.
RtlInitUnicodeString(&DestinationString, L"\\Device\\PhysicalMemory");
// ...
result = ZwOpenSection(&SectionHandle, 0xF001Fu, &ObjectAttributes);
// ...
v8 = ZwMapViewOfSection(..., (HANDLE)0xFFFFFFFFFFFFFFFFLL, ...);
Для демонстрации повышения привилегий был разработан PoC, однако публично код предоставляться не будет, чтобы избежать злоупотреблений.

