CVE-2026-90201 in Linux信息

摘要

由 VulDB • 2026-09-17

在 Linux 内核中,已修复以下漏洞:

net: page_pool: 修复 xa_cmpxchg竞态条件下__page_pool_release_netmem_dma中的UAF(释放后使用)问题

该错误是在 arm64 平台上使用 iperf3 流量测试 hns3 驱动程序进行通道重新配置(`ethtool -L` / `ethtool -G`)时发现的。当 page_pool_destroy() 在不同 CPU 上并发执行 page_pool_scrub() 并通过 page_pool_put_netmem() 返回页面时,会间歇性地触发此竞态条件。page_pool_clear_pp_info() 中出现的 WARN(警告)揭示了由 cmpxchg 失败者留下的悬空 DMA 索引位,从而引发了此次调查。

page_pool_scrub() 使用 xa_for_each() 遍历 pool->dma_mapped,且未持有页面引用。__page_pool_release_netmem_dma() 目前在 xa_cmpxchg() 返回后读取和写入 netmem 字段(包括 dma_addr、pp_magic 中的 DMA 索引位)。无论 cmpxchg 结果如何,unref 路径都会无条件调用 put_page();当它失去 cmpxchg 时,在 scrub 获胜者完成这些 netmem 访问之前仍会释放页面,导致 scrub 触及已释放的页面——即 Use-After-Free(UAF)漏洞。

通过将 DMA 释放拆分为两个函数来修复此问题:

1. __page_pool_unmap_netmem_dma() 在 xa_cmpxchg() 之前缓存 dma_addr,执行 cmpxchg 以移除 DMA 映射,并在缓存的地址上调用 dma_unmap。它在 cmpxchg 之后从不触碰 netmem 字段,因此对于不持有页面引用的 scrub 路径是安全的。

2. __page_pool_release_netmem_dma() 封装了上述操作,并额外清除 netmem 字段中的 dma_addr 和 DMA 索引位。仅当调用者持有页面引用时此操作才是安全的,因此它由返回路径(page_pool_return_netmem)使用。

scrub 路径直接调用 __page_pool_unmap_netmem_dma();而返回路径则调用 __page_pool_release_netmem_dma()。

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

来源

Want to know what is going to be exploited?

We predict KEV entries!