CVE-2026-33987FreeRDP是一个远程桌面协议的开源实现。在3.24.2版本之前,libfreerdp/cache/persistent.c文件中的persistent_cache_read_entry_v3函数存在一个逻辑漏洞。该函数在调用winpr_aligned_recalloc进行内存重分配之前,错误地先行更新了persistent->bmpSize变量。如果内存重分配操作失败(例如由于内存不足),bmpSize已经被更新为更大的值,但bmpData指针仍然指向旧的较小的缓冲区。这种状态不一致导致后续操作可能发生越界读写,进而引发拒绝服务或潜在的代码执行风险。
该漏洞属于典型的Check-then-Act或Order-of-Operations逻辑错误。在C语言编程中,调整内存大小时,应先尝试分配,成功后再更新记录大小的变量。漏洞代码中persistent->bmpSize = new_size;语句位于winpr_aligned_recalloc()调用之前。当recalloc返回NULL时,函数可能返回错误,但对象结构中的bmpSize字段已被修改为较大的数值,而bmpData仍指向旧的内存区域。攻击者可以通过构造特定的RDP数据流,迫使程序进入需要扩展缓存的分支,并耗尽系统内存导致分配失败。随后程序对bmpData的访问将基于错误的bmpSize进行,导致堆溢出。