关键信息 漏洞类型: 堆使用后释放 (Heap Use After Free) 受影响版本: handle 在 XSetWMNormalHints。 xf_SetWindowMinMaxInfo 引用 appWindow->handle,在线 1128 通过 XSetWMNormalHints(xfc->display, appWindow->handle, size_hints)。 在主线程(T2)上,通过更新流到达窗口删除顺序并发地触发 xf_rail_window_delete → xf_rail_del_window → HashTable_Remove。哈希表的值析构函数 rail_window_free 调用 xf_DestroyWindow,释放 appWindow 结构。 当 RAIL 通道线程随后在 xf_SetWindowMinMaxInfo 中访问 appWindow->handle 时,内存已经被释放,导致堆使用后释放。 PoC 1. 使用 AddressSanitizer 编译 xfreerdp。 2. 启动一个 RAIL 能力的 RDP 服务器,发送窗口创建顺序,然后快速发送 RAIL ServerMinMaxInfo PDUs,同时发送窗口删除顺序。 3. 使用 xfreerdp 连接到 v127.0.0.1,忽略证书。 4. RAIL 通道线程调用 xf_rail_get_window 并获得指向 appWindow 的指针,然后调用 xf_SetWindowMinMaxInfo。同时,主线程处理窗口删除顺序,删除释放 appWindow,RAIL 线程则引用释放的指针 → ASan 检测到堆使用后释放。 修复建议 使用引用计数或在整个 duration 的 xfAppWindow 使用期间保持哈希表锁,包括所有 RAIL SVC 处理器功能。 更简单的替代是,在单个锁作用范围内执行哈希表查找和所有 xfAppWindow 操作。 影响 恶意服务器可以触发客户端堆使用后释放,导致崩溃(DoS)和潜在的堆腐烂,存在代码执行风险。 修复提交 1994e98