CVE-2026-29774FreeRDP是Remote Desktop Protocol(RDP,远程桌面协议)的免费实现。在3.24.0之前的版本中,FreeRDP客户端的AVC420/AVC444 YUV到RGB转换路径存在客户端堆缓冲区溢出漏洞。漏洞源于yuv.c文件中的clamp()函数(第347行)仅对上下边界进行了表面/YUV高度验证,但未对左右边界进行表面宽度检查。当avc420_yuv_to_rgb函数(第67行)使用rect->left计算目标和源指针时,执行了未经验证的指针运算,可能超出分配的表面缓冲区范围。攻击者可通过恶意服务器发送包含AVC420编码的WIRE_TO_SURFACE_PDU_1,其中regionRects条目的left值远超表面宽度(例如在128像素表面上设置left=60000),导致写入超出分配堆区域1888+字节的数据。
漏洞位于FreeRDP的libfreerdp/codec/yuv.c文件中。在YUV到RGB转换过程中,avc420_yuv_to_rgb函数通过计算pDstPoint = pDstData + rect->top * nDstStep + rect->left * 4来获取目标写入位置。问题在于clamp()函数仅验证rect->top和rect->bottom是否超出表面高度,但完全未检查rect->left和rect->right是否超出表面宽度。当攻击者构造恶意的H.264位流解码数据时,可指定极大的left坐标值(如60000),而此时表面可能仅有128像素宽度。计算后的目标指针将指向堆分配区域之外,函数随后以16字节SSE向量形式写入数据,导致堆缓冲区溢出。攻击成功后可造成客户端崩溃或潜在代码执行。漏洞已在3.24.0版本中修复。