FreeRDP — это бесплатная реализация протокола удаленного рабочего стола. До версии 3.24.0 переполнение буфера кучи на стороне клиента происходило в пути преобразования AVC420/AVC444 YUV-в-RGB клиента FreeRDP из-за отсутствия проверки горизонтальных границ координат регионаRects метаблока H.264. В yuv.c функция зажима() (строка 347) проверяет только верх/низ относительно поверхности/высоты YUV, но никогда не проверяет лево/право по ширине поверхности.
Когда avc420_yuv_to_rgb (строка 67) вычисляет указатели назначения и источника, используя rect->left, он выполняет непроверяемую арифметику указателей, которая может выходить далеко за пределы выделенного поверхностного буфера. Вредоносный сервер отправляет WIRE_TO_SURFACE_PDU_1 с кодеком AVC420, содержащим запись регионаRects, где left значительно превышает ширину поверхности (например, left=60000 на поверхности 128 пикселей). Битовый поток H.264 успешно декодируется, затем yuv420_process_work_callback вызывает avc420_yuv_to_rgb, который вычисляет pDstPoint = pDstData + rect->top * nDstStep + rect->left * 4, записывая 16-байтовые векторы SSE на 1888+ байт дальше выделенной области кучи.
Эта уязвимость исправлена в версии 3.24.0.
Показать оригинальное описание (EN)
FreeRDP is a free implementation of the Remote Desktop Protocol. Prior to 3.24.0, a client-side heap buffer overflow occurs in the FreeRDP client's AVC420/AVC444 YUV-to-RGB conversion path due to missing horizontal bounds validation of H.264 metablock regionRects coordinates. In yuv.c, the clamp() function (line 347) only validates top/bottom against the surface/YUV height, but never checks left/right against the surface width. When avc420_yuv_to_rgb (line 67) computes destination and source pointers using rect->left, it performs unchecked pointer arithmetic that can reach far beyond the allocated surface buffer. A malicious server sends a WIRE_TO_SURFACE_PDU_1 with AVC420 codec containing a regionRects entry where left greatly exceeds the surface width (e.g., left=60000 on a 128px surface). The H.264 bitstream decodes successfully, then yuv420_process_work_callback calls avc420_yuv_to_rgb which computes pDstPoint = pDstData + rect->top * nDstStep + rect->left * 4, writing 16-byte SSE vectors 1888+ bytes past the allocated heap region. This vulnerability is fixed in 3.24.0.
Характеристики атаки
Последствия
Строка CVSS v3.1
Тип уязвимости (CWE)
Уязвимые продукты 1
| Конфигурация | От (включительно) | До (исключительно) |
|---|---|---|
|
Freerdp Freerdp
cpe:2.3:a:freerdp:freerdp:*:*:*:*:*:*:*:*
|
— |
3.24.0
|