🇰🇷 한글 설명
Linux 커널의 svcrdma 구성 요소에서 rdma_destroy_id 호출 전 rpcrdma_rn_unregister가 실행되지 않아 발생하는 Use-After-Free 취약점입니다. 이로 인해 이미 해제된 sc_cm_id에 대해 svc_rdma_xprt_done()이 호출될 수 있는 레이스 컨디션 위험이 존재합니다.
💡 쉬운 설명
컴퓨터의 통신 장치를 정리하는 순서가 잘못되어, 이미 사라진 통신 정보를 다시 사용하려고 시도하다가 시스템 오류가 발생할 수 있는 문제입니다. 이 과정에서 시스템이 충돌하거나 보안 문제가 생길 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
svcrdma: Reorder rpcrdma_rn_unregister before rdma_destroy_id
svc_rdma_free() caches rdma->sc_cm_id->device before teardown,
then calls rdma_destroy_id(sc_cm_id) which frees the cm_id.
rpcrdma_rn_unregister() follows, but between those two calls
the transport's sc_rn entry is still installed in the device's
rd_xa. A concurrent ib_unregister_device walk can dispatch
svc_rdma_xprt_done() against the now-freed sc_cm_id.
Move rpcrdma_rn_unregister() before rdma_destroy_id() so the
transport's notification entry is removed from the xarray before
the cm_id it references is destroyed.
Also guard the sc_cm_id dereference with a NULL check: the
following patches introduce paths that reach svc_rdma_free()
with sc_cm_id == NULL (listener create failure, ADDR_CHANGE
replacement failure).
📍 영향받는 시스템
Linux kernel (svcrdma 모듈을 사용하는 시스템)
⚔️ 공격 벡터
동시적인 장치 해제 작업(ib_unregister_device)을 유도하여 메모리 해제 후 참조(Use-After-Free)를 유발
🛡️ 대응 방법
커널 패치를 적용하여 rpcrdma_rn_unregister의 호출 순서를 변경하고 sc_cm_id에 대한 NULL 체크 로직을 추가해야 함
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 최신 보안 패치 버전인지 확인