В этой статье приводятся подробности CVE-2023-21822 — уязвимости Use-After-Free (UAF) в win32kfull, которая может привести к повышению привилегий. Отчёт о баге отправлен в рамках программы ZDI, а позже она была пропатчена компанией Microsoft.
В ядре Windows есть три API, предназначенные для общего использования драйверами устройств с целью создания растровых изображений (bitmap):
EngCreateBitmap,
EngCreateDeviceBitmap и
EngCreateDeviceSurface. Каждый из этих API возвращает дескриптор растрового изображения. Если вызывающая сторона хочет выполнить какие-то операции рисования на растровом изображении, то она должна сначала заблокировать это изображение, передав его дескриптор функции
EngLockSurface.
EngLockSurface увеличивает значение эталонного счётчика растрового изображения и возвращает указатель на соответствующую запись
SURFOBJ.
SURFOBJ — это расположенная в памяти ядра структура, содержащая всю информацию, связанную с растровым изображением, например, его размер, формат пикселей, указатель на пиксельный буфер и так далее. Подробнее структуру
SURFOBJ мы рассмотрим позже.
После вызова
EngLockSurface полученный указатель на
SURFOBJ может передаваться различным API рисования, например,
EngLineTo и
EngBitBlt. Полный список этих API рисования можно найти в winddi.h. После того, как вызывающая сторона завершит операции рисования, она должна вызывать
EngUnlockSurface. На этом этапе эталонный счётчик растрового изображения снова сбрасывается до нуля, и вызывающей стороне больше не разрешается использовать указатель на
SURFOBJ. В конце вызывающая сторона может удалить растровое изображение, вызвав для его дескриптора
EngDeleteSurface. Типичное использование этих API показано ниже: