漏洞概述 该漏洞涉及FreeCounter()和miSyncDestroyFence()函数在遍历触发列表并调用每个触发的CounterDestroyed回调时的问题。CounterDestroyed回调(例如SyncWaitTriggerFired)可能会调用FreeSyncWait/Freewait,这会释放包含所有SyncWait结构的同一Await组。当多个条件在单个Await引用相同的sync对象(计数器或围栏)时,第一个回调会释放所有SyncWait结构,而后续的触发器列表节点仍然引用它们。在下一次迭代中,使用pti->next或pti->pTrigger会导致释放后的内存,从而引发use-after-free漏洞。 影响范围 该漏洞影响FreeCounter()和miSyncDestroyFence()函数,可能导致use-after-free漏洞,进而可能被利用进行内存破坏攻击。 修复方案 1. 使用空终止列表宏:确保下一个指针在释放后仍然有效(代码在释放后访问pti->next)。 2. 更新列表头:在删除触发器之前更新列表头,即使列表头是有效的列表,最终也会变成NULL。 3. 检查触发器:在解引用回调之前检查是否实际有触发器。 4. 设置触发器为NULL:如果触发器是共享的,则将所有触发器设置为NULL,以避免解引用释放后的内存。 代码块