CVE-2026-43128Linux内核的RDMA子系统在处理DMA缓冲区时存在一个严重的双重释放漏洞。在`ib_umem_dmabuf_get_pinned_with_dma_device`函数执行过程中,如果页面映射操作失败,代码会立即取消固定缓冲区,但未更新`pinned`状态标志。这导致后续在释放内存时,系统会再次尝试取消固定同一个缓冲区,从而触发双重释放错误。该漏洞允许本地低权限攻击者利用此缺陷破坏系统内存完整性,可能导致内核崩溃或潜在的权限提升。
该漏洞位于Linux内核的RDMA用户内存管理模块。具体而言,漏洞触发点在于`ib_umem_dmabuf_get_pinned_with_dma_device`函数的错误处理路径。当该函数尝试通过`ib_umem_dmabuf_map_pages`映射DMA缓冲区页面时,如果映射操作失败(例如由于`dma_resv_wait_timeout`超时),函数会立即调用`dma_buf_unpin`来释放资源。问题在于,此次失败时的立即释放操作没有将`umem_dmabuf`结构体中的`pinned`标志位重置为false。当后续执行清理操作(如调用`ib_umem_release`)时,代码逻辑会检查`pinned`标志。由于该标志仍处于设置状态,系统会误认为缓冲区仍处于固定状态,进而调用`ib_umem_dmabuf_revoke`,该函数内部会再次调用`dma_buf_unpin`。这种重复的`unpin`操作破坏了引用计数的正确性,属于典型的双重释放漏洞。在内核上下文中,这会导致严重的内存损坏,攻击者可通过精心构造的本地请求触发该逻辑,进而导致内核崩溃(DoS)或结合其他技术实现代码执行与权限提升。