🇰🇷 한글 설명
Linux 커널의 nvmet-rdma 구성 요소에서 RDMA 전송을 사용하는 NVMe 타겟이 I/O 작업 중 제거될 때 응답 리소스가 해제되지 않는 취약점입니다. 이로 인해 할당된 RDMA 읽기/쓰기 컨텍스트와 요청 SGL(Scatter Gather List)이 메모리에 남아 메모리 누수가 발생합니다.
💡 쉬운 설명
데이터를 주고받는 도중에 연결이 갑자기 끊기면, 사용하던 메모리를 돌려주지 않고 계속 붙잡고 있는 문제입니다. 이 현상이 반복되면 시스템의 메모리가 점차 부족해질 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
nvmet-rdma: fix response resource leak on queue teardown
When an nvme target with rdma transport is removed while I/Os are in
flight, a response can be posted but its send completion is never
delivered before the connection is torn down. As a result
nvmet_rdma_send_done() and nvmet_rdma_release_rsp() are never called for
the response, and this leaks the allocated RDMA read/write context and
request SGLs.
These leaks are recreated by running blktests nvme/061 with the rdma
transport and the siw driver. Kernel kmemleak feature reports them as
follows:
unreferenced object 0xffff88812bc490c0 (size 32):
comm "kworker/2:1H", pid 409, jiffies 4307744490
backtrace (crc 89afd339):
__kmalloc_noprof+0x5f9/0x890
sgl_alloc_order+0x7b/0x380
nvmet_req_alloc_sgls+0x290/0x4f0 [nvmet]
nvmet_rdma_map_sgl_keyed+0x241/0x12e0 [nvmet_rdma]
nvmet_rdma_handle_command+0x73e/0xb80 [nvmet_rdma]
__ib_process_cq+0x149/0x4c0 [ib_core]
ib_cq_poll_work+0x49/0x160 [ib_core]
process_one_work+0x8b2/0x1640
worker_thread+0x5fd/0xfe0
kthread+0x367/0x460
ret_from_fork+0x655/0x9d0
ret_from_fork_asm+0x1a/0x30
unreferenced object 0xffff88814bd05e80 (size 64):
comm "kworker/3:1H", pid 148, jiffies 4295195428
backtrace (crc e35510cb):
__kmalloc_noprof+0x5f9/0x890
rdma_rw_ctx_init+0x333/0x1fa0 [ib_core]
nvmet_rdma_map_sgl_keyed+0x5c8/0x12e0 [nvmet_rdma]
nvmet_rdma_handle_command+0x73e/0xb80 [nvmet_rdma]
__ib_process_cq+0x149/0x4c0 [ib_core]
ib_cq_poll_work+0x49/0x160 [ib_core]
process_one_work+0x8b2/0x1640
worker_thread+0x5fd/0xfe0
kthread+0x367/0x460
ret_from_fork+0x655/0x9d0
ret_from_fork_asm+0x1a/0x30
To avoid the memory leaks, reclaim the memory of the in-flight responses
when the queue QP is torn down. Call nvmet_rdma_free_rsp_resources()
that frees up the RDMA read/write context and the request SGLs of such
responses.
📍 영향받는 시스템
Linux kernel (nvmet-rdma component using RDMA transport)
⚔️ 공격 벡터
RDMA를 사용하는 NVMe 타겟 환경에서 I/O가 진행 중인 상태로 연결을 강제로 종료하여 메모리 누수 유도
🛡️ 대응 방법
커널 업데이트를 통해 큐(QP) 해제 시 인플라이트(in-flight) 응답의 리소스를 재할당하도록 패치 적용
🔧 검증 코드
커널 버전을 확인하고 해당 심볼이 커널에 포함되어 있는지 확인하여 패치 적용 여부를 검토합니다.
uname -r && grep -i 'nvmet_rdma' /proc/kallsyms