CVE-2026-22852CVE-2026-22852是FreeRDP客户端中的一个严重堆缓冲区溢出漏洞。FreeRDP是Remote Desktop Protocol(RDP)的开源实现,广泛应用于远程桌面连接场景。漏洞存在于音频输入(Audio Input, AUDIN)模块的格式列表处理功能中,攻击者可通过搭建恶意RDP服务器,在客户端连接时触发该漏洞。当FreeRDP客户端与恶意服务器建立连接并接收Audio Input格式列表时,audin_process_formats函数存在边界检查缺陷。该函数在处理多个MSG_SNDIN_FORMATS协议数据单元(PDU)时,错误地重用了callback->formats_count变量,导致写入数据超出新分配的formats数组边界,形成堆缓冲区溢出。此漏洞可造成目标系统的内存损坏、进程崩溃,甚至可能被利用执行任意代码。CVSS 3.1评分高达9.8,属于最严重的漏洞级别,对机密性、完整性和可用性均造成严重影响。由于攻击复杂度低且无需认证和用户交互,网络可达范围内的任意RDP服务器都可被利用发起攻击。
漏洞根源在于FreeRDP的audin_process_formats函数存在逻辑错误。该函数负责处理RDP音频输入(AUDIN)通道的格式列表。在RDP协议中,音频输入重定向功能允许服务器请求客户端提供可用的音频输入设备格式列表。当客户端收到MSG_SNDIN_FORMATS消息时,会分配一个formats数组来存储支持的格式。问题在于:audin_process_formats函数在处理多个连续的MSG_SNDIN_FORMATS PDU时,复用了callback->formats_count变量而未进行边界验证。第一次调用时分配了formats_count大小的数组,但在后续处理中,如果服务器发送的格式数量超过首次分配的数组大小,函数仍按照callback->formats_count的值写入数据,导致越界写入。攻击者控制的恶意RDP服务器可以构造特制的Audio Input格式列表响应,指定较大的格式数量但实际发送更多数据,触发堆缓冲区溢出。这会导致相邻堆内存区域被覆盖,破坏堆管理结构,引发崩溃或可能被利用进行堆喷射等高级攻击技术。FreeRDP版本3.20.1通过重置formats_count变量和增加边界检查修复了此问题。