这篇文章分析了 Linux 内核的 `AF_UNIX` 垃圾回收机制,该机制旨在回收那些在用户空间已不可达但仍处于“传输中”(通过 `SCM_RIGHTS` 传递)的内核对象。
内核最近用一种基于 Tarjan 算法、更高效的实现取代了传统的垃圾回收器。该新系统将传输中的套接字表示为图中的顶点,并利用强连通分量(SCC)来识别可回收的循环引用。通过为稳定的图状态维护快速路径,它避免了不必要的开销。
然而,此次重写引入了一个严重的释放后使用(Use-After-Free)漏洞(CVE-2025-40214)。其根本原因是 `unix_vertex` 结构体中的 `scc_index` 字段未初始化。由于该结构体是通过 `kmalloc` 分配的,新分配的顶点可能会意外继承之前被释放对象中残留的 `scc_index` 值。如果该残留值与某个活跃套接字的 `scc_index` 相匹配,垃圾回收器就会错误地将该活跃套接字标记为“已失效”,进而清除其接收队列并触发释放后使用漏洞。
修复方案确保了每个新顶点都会被分配一个唯一的、单调递增的 `scc_index`,从而避免了导致此次漏洞的意外别名问题。