CVE-2026-31806FreeRDP是Remote Desktop Protocol(RDP)协议的开源实现,广泛应用于远程桌面连接场景。该漏洞存在于FreeRDP的gdi_surface_bits()函数中,在处理RDP服务器发送的SURFACE_BITS_COMMAND消息时,当使用NSCodec编解码器处理命令时,服务器提供的bmp.width和bmp.height值未与实际桌面尺寸进行正确验证。攻击者可利用此漏洞通过恶意RDP服务器向客户端发送精心构造的位图尺寸参数,使其超出预期表面大小。由于这些尺寸值在位图解码和内存操作过程中缺乏适当的边界检查,最终导致堆缓冲区溢出。攻击者同时控制服务器传输的像素数据,溢出的数据可能覆盖相邻堆内存区域,从而可能实现远程代码执行或进一步攻击。该漏洞CVSS评分高达9.8,属于严重级别,无需任何认证即可远程利用。
漏洞根源在于FreeRDP的NSCodec解码器处理SURFACE_BITS_COMMAND消息时的边界验证缺失。当RDP客户端接收到服务器发送的位图数据时,gdi_surface_bits()函数会调用NSCodec解码器处理位图信息。问题在于,服务器提供的bmp.width和bmp.height值直接被用于分配和解码位图缓冲区,而没有与客户端实际桌面尺寸进行验证。攻击者可以构造超大的宽度和高度值(如65535x65535),导致程序分配一个远小于实际需要的缓冲区,但按照攻击者指定的大尺寸进行数据写入。NSCodec解码过程中,像素数据按照指定的宽度和高度被写入缓冲区,由于缓冲区实际大小不足,最终造成堆缓冲区溢出。攻击者可以精心构造像素数据,通过溢出覆盖关键的堆元数据、函数指针或其他敏感数据结构,实现代码执行。