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