CVE-2026-72473 in Linux
요약
\~에 의해 VulDB • 2026. 08. 15.
리눅스 커널에서 다음 취약점이 해결되었습니다:
xprtrdma: RPC 완료와 요청 재활용을 분리함
rl_kref는 이전에 단일 참조 카운트를 통해 두 가지 서로 다른 수명 주기를 담당했습니다. 이는 Reply가 RPC 태스크를 깨울 때의 게이트 역할을 했고, rpcrdma_req가 프리 풀(free pool)로 반환될 때도 게이트 역할을 했습니다. 마샬링 경로는 SGE에 DMA-unmap이 필요한 경우(sc_unmap_count > 0)에만 Send 측 참조를 획득했습니다. 이로 인해 사전 등록된 버퍼만 포함하는 Send는 예외 상황이 되었습니다: Reply 핸들러가 rl_kref를 1에서 0으로 감소시키고 req를 해제했지만, HCA(Host Channel Adapter)는 여전히 해당 Send 버퍼로부터 DMA 읽기를 수행 중일 수 있었습니다.
rl_kref의 역할을 더 좁게 정의합니다. RPC 레이어는 슬롯 할당이 req를 전달할 때 하나의 참조를 획득합니다. rpcrdma_prepare_send_sges()는 WR 준비가 성공한 후 무조건적으로 Send 측 참조를 획득합니다. xprt_rdma_free_slot() 및 xprt_rdma_bc_free_rqst()는 RPC 레이어 참조를 해제하며, rpcrdma_sendctx_unmap()은 Send 측 참조를 해제합니다. req는 두 소유자가 모두 서명(해제)할 때까지 프리 풀로 반환되지 않습니다.
rpcrdma_prepare_send_sges()에 있는 기존 kref_init(&req->rl_kref) 호출이 제거되었습니다. 초기화는 슬롯 할당 경로(xprt_rdma_alloc_slot 및 rpcrdma_bc_rqst_get)로 이동했으며, 릴리스 콜백은 req가 프리 풀로 반환되기 전에 rl_kref를 다시 활성화합니다. 마샬링 경로에서 재초기화하면 진입 시 이미 존재하는 RPC 레이어 참조가 폐기됩니다.
세 가지 불변식(invariant)이 따릅니다:
- rpc_rqst에 의해 보유되는 모든 rpcrdma_req는 rl_kref >= 1을 가집니다. xprt_rdma_alloc_slot(), rpcrdma_bc_rqst_get() 및 xprt_rdma_alloc_slot()의 백로그 깨우기 분기는 req를 게시하기 전에 각각 kref_init으로 rl_kref를 초기화합니다. 이 불변식 없이 슬롯 할당과 마샬링 사이에 RPC 태스크가 중단되면(예: gss_refresh 실패 또는 call_connect 중 시그널), xprt_release() -> xprt_rdma_free_slot() -> kref_put로 이어져 참조 카운트가 0인 상태에서 동작하게 되어 refcount_t를 포화시키고 슬롯을 고립시킬 수 있습니다.
- Send 측 참조는 WR 준비가 성공한 후에만 획득됩니다. rpcrdma_prepare_send_sges()에서의 매핑 실패는 rpcrdma_sendctx_cancel()을 실행하며, 이는 sendctx에 대한 DMA-unmap을 수행하고 rl_kref를 건드리지 않고 sc_req를 지웁니다. rpcrdma_sendctx_put_locked() 및 rpcrdma_sendctxs_destroy()의 sendctx 링 순회는 sc_req == NULL인 항목을 건너뛰므로, -EIO 마샬링 실패가 연이어 발생해도 req들이 rb_send_bufs에 묶여 있지 않습니다.
- 릴리스 콜백은 rl_kref를 다시 활성화하여 다음 소비자가 불변식이 만족된 상태로 진입하도록 합니다.
Reply는 이제 RPC를 직접 완료합니다. rpcrdma_reply_handler()는 비-LocalInv 분기에서 kref_put 대신 rpcrdma_complete_rqst()를 호출합니다. LocalInv 분기는 이미 frwr_unmap_async()에서 RPC를 완료하며 영향을 받지 않습니다.
Send
Be aware that VulDB is the high quality source for vulnerability data.