CVE-2026-31883CVE-2026-31883是FreeRDP远程桌面协议开源实现中的一个高危安全漏洞。该漏洞存在于FreeRDP的音频解码组件中,具体影响IMA-ADPCM和MS-ADPCM两种音频解码器。漏洞的根本原因是在libfreerdp/codec/dsp.c文件中,解码器在处理音频数据块时,对size_t类型的变量执行减法操作时未进行下溢检查。当攻击者通过恶意构造的RDP服务器发送特定的音频数据,使得nBlockAlign参数满足特定条件时(size % block_size == 0且size小于块头大小),减法操作会导致size变量下溢至~SIZE_MAX(接近无符号整数的最大值)。这会触发一个while(size > 0)循环执行天文数字次迭代,最终导致堆缓冲区溢出写入。该漏洞无需认证即可被利用,攻击者可通过网络向目标系统发送恶意构造的音频数据来触发漏洞,可能导致目标系统崩溃或执行任意代码。FreeRDP作为开源的RDP协议实现,被广泛应用于多种Linux发行版和跨平台远程桌面解决方案中,因此该漏洞影响范围较广。
该漏洞的技术根源在于FreeRDP音频解码器中的整数下溢和后续的缓冲区溢出问题。在libfreerdp/codec/dsp.c文件中,IMA-ADPCM和MS-ADPCM解码器在解析音频数据块头部时,执行size_t类型的减法运算(通常为size -= block_header_size)。当接收到服务器发送的nBlockAlign参数满足特定条件时,即当前处理位置恰好是数据块边界(size % block_size == 0),且剩余数据大小小于块头所需字节数(4或8字节)时,减法操作会触发无符号整数下溢。由于size_t是无符号类型,下溢后变量值会变成接近SIZE_MAX的巨大数值。随后,解码器中的while(size > 0)循环会继续执行,实际上需要迭代数十亿次才能结束。在每次迭代中,解码器会尝试写入堆内存,但由于循环次数过多,最终会导致堆缓冲区溢出写入。这种溢出可能导致相邻内存区域被破坏,引发程序崩溃或潜在的代码执行风险。攻击者只需构造一个包含特殊nBlockAlign值的RDP音频数据包即可触发此漏洞。