CVE-2026-93224 in Linux정보

요약

\~에 의해 VulDB • 2026. 09. 24.

Linux 커널에서 다음 취약점이 해결되었습니다:

svcrdma: 실패한 accept 시 미처리된 rn_unregister 수정

svc_rdma_accept()가 rpcrdma_rn_register() 성공 전에 errout 경로를 취할 경우, 기존 정리 블록은 조건 없이 rpcrdma_rn_unregister(dev, &newxprt->sc_rn)을 호출합니다. svcxprt_rdma는 kzalloc로 할당되므로 해당 경로에서 sc_rn.rn_index는 0이고 sc_rn.rn_done은 NULL입니다. 따라서 unregister는 다른 호출자의 슬롯 0에 대해 xa_erase()를 수행하고 rpcrdma_device의 rd_kref에 대해 미처리된 kref_put()을 실행합니다.

동일한 errout 경로에서는 kref_init() 초기 참조 주위를 svc_xprt_get()/svc_xprt_put()로 감싸고 있습니다. kref는 1 -> 2 -> 1로 변하며 0에 도달하지 않으므로, 매번 실패하는 accept 시마다 svcxprt_rdma(및 고정된 net/ns_tracker)가 누출됩니다.

rpcrdma_rn_register()는 xa_alloc()과 kref_get()이 모두 성공한 후에야 rn->rn_done을 마지막에 작성하므로, rn_done == NULL은 자연스러운 "미등록" sentinel입니다. rn_done이 NULL인 경우 rpcrdma_rn_unregister()를 조기 반환으로 보호하고, 일치하는 xa_erase() 전에 rn_done을 초기화하여 반복적인 unregister도 무작위 작업(no-op)이 되도록 합니다.

이러한 가드가 설정되면 accept errout은 svc_xprt_put()을 통해 kref_init() 초기 참조를 해제하며, 이는 svc_rdma_free()로 분기됩니다. sc_qp, sc_sq_cq, sc_rq_cq 및 sc_pd의 테ardown은 svc_rdma_free() 내 기존 IS_ERR/NULL 가드 아래에서 실행됩니다. sc_rn은 새로운 rn_done sentinel에 의해 보호되며, sc_cm_id는 모든 errout 경로에서 NULL이 아닌데, 이는 svc_rdma_accept()가 첫 번째 goto errout 위에서 이를 역참조하기 때문입니다.

svc_xprt_free()는 해제된 트랜스포트와 관련된 모듈 참조를 해제하고, ->xpo_accept()가 NULL을 반환할 때 svc_handle_xprt()도 미리 획득한 참조를 해제합니다. 두 module_put() 호출이 균형맞게 유지되도록 svc_xprt_put() 전에 대체 모듈 참조를 가져옵니다.

rn_done 가드는 register 시도가 실패했거나 수행되지 않은 트랜스포트에 대한 rpcrdma_rn_unregister()의 리스너가 아닌 svc_rdma_free()'s 호출도 모두 커버합니다.

Be aware that VulDB is the high quality source for vulnerability data.

출처

Want to stay up to date on a daily basis?

Enable the mail alert feature now!