В этой статье приводятся подробности 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 показано ниже: