🇰🇷 한글 설명
Linux 커널의 net/rds 구성 요소에서 연결 생성 시 전송 계층(transport) 결정과 경로(path) 크기 계산 간의 불일치로 인해 발생하는 메모리 누수 취약점입니다. TCP 전송 계층을 사용하는 RDS 소켓이 로컬 주소로 연결될 때 루프백 전송 계층으로 교체되지만, 경로 크기는 기존 TCP 기준으로 할당되어 작업 큐(workqueue)가 제대로 해제되지 않습니다.
💡 쉬운 설명
컴퓨터가 통신 경로를 만들 때 실제 사용하는 방식과 기록해두는 방식이 서로 달라서 발생하는 문제입니다. 이로 인해 사용이 끝난 통신 통로가 메모리에서 완전히 삭제되지 않고 계속 쌓여 시스템 자원을 낭비하게 됩니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net/rds: size a connection's path set by the transport it ends up with
__rds_conn_create() computes npaths from the caller's transport before
it decides whether a connection to one of the host's own addresses is
to be handled by the loopback transport instead. That substitution is
what an RDS/TCP socket sending to a local address gets, and after it
the path init loop still runs for the TCP transport's RDS_MPATH_WORKERS
paths and allocates an ordered workqueue for each, while
rds_loop_conn_alloc() only ever provides transport data for path 0.
rds_conn_destroy() sizes its teardown from c_trans, by then the
loopback transport, so it visits path 0 only - and
rds_conn_path_destroy() would skip the other paths anyway, since it
returns before destroy_workqueue() for a path without transport data.
kfree(c_path) then drops the last pointers to seven workqueues. That
repeats for every such connection, on every netns teardown or module
unload, and every distinct local destination address is a separate
connection.
Recompute npaths once the transport is final, so that creation and
destruction agree on the set of paths. The c_path array stays sized
for the caller's transport; the unused entries are freed with it.
📍 영향받는 시스템
Linux kernel (net/rds 모듈을 사용하는 시스템)
⚔️ 공격 벡터
로컬 주소로 RDS/TCP 연결을 반복적으로 생성하여 커널 메모리 누수를 유도하는 방식
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 npaths 재계산 로직을 적용해야 합니다.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이상인지 확인합니다.