CVE-2026-97476 in Linux
요약
\~에 의해 VulDB • 2026. 09. 25.
리눅스 커널에서 다음 취약점이 해결되었습니다:
rds: 호출자의 netns에 따라 RDS_INFO_* getsockopt를 필터링함
RDS_INFO_* 계열의 getsockopt(2) 옵션은 per-netns가 아닌 여러 파일 스코프 전역 리스트를 읽습니다.
rds_sock_info / rds6_sock_info, rds_sock_inc_info / rds6_sock_inc_info -> rds_sock_list rds_tcp_tc_info / rds6_tcp_tc_info -> rds_tcp_tc_list rds_conn_info / rds6_conn_info, rds_conn_message_info_cmn (*_SEND_MESSAGES 및 *_RETRANS_MESSAGES 변형체용), rds_for_each_conn_info (RDS_INFO_IB_CONNECTIONS용) -> rds_conn_hash[]
핸들러는 호출자의 네트워크 네임스페이스(netns)에 따라 필터링하지 않습니다. rds_info_getsockopt()에는 netns 또는 capable() 체크가 없으며, rds_create()에도 capable() 체크가 없습니다. 따라서 AF_RDS는 비특권 사용자 네임스페이스에서 접근 가능합니다. 그 결과, 새로운 user_ns 및 netns를 가진 비특권 호출자는 호스트의 모든 RDS 소켓에 바인딩된 주소와 sock inode, 호스트의 모든 RDS 소켓에서 들어오는 메시지의 피어 주소, 호스트의 모든 rds-tcp 연결의 피어 주소 및 TCP 시퀀스 번호, 그리고 호스트의 모든 RDS 연결의 피어 주소 및 RDS 시퀀스 번호를 읽을 수 있습니다.
rds-tcp 트랜스포트는 비초기 netns에서 접근 가능합니다(rds_set_transport() 참조). 따라서 rds_info_getsockopt()에서의 일회성 init_net 게이트는 rds-tcp 호출자에 대한 정당한 per-netns 가시성을 거부하게 됩니다. 대신 각 핸들러에서 호출자의 소켓의 netns를 리스트 엔트리의 netns 또는 연결 경로인 경우 rds_conn_net(conn)와 비교하여 필터링합니다. caller의 netns와 일치하는 엔트리만 복사합니다. 카운터(RDS_INFO_COUNTERS)는 집계 통계이므로 전역 상태로 유지됩니다.
재현 방법(KASAN VM, rds 및 rds_tcp 로드됨): 루트 권한으로 init_net에서 AF_RDS 소켓이 127.0.0.1:4242에 바인딩합니다. 자식 프로세스가 새로운 user_ns와 netns로 진입한 후 해당 위치에서 AF_RDS를 열고 getsockopt(SOL_RDS, RDS_INFO_SOCKETS)를 호출합니다. 이 변경 전에는 자식이 init_net 소켓을 보게 됩니다. 이 변경 후에는 자식이 0개의 엔트리를 보게 됩니다.
rds_sock_count, rds_tcp_tc_count 및 rds6_tcp_tc_count 전역 변수들을 제거합니다. v2에서는 크기 사전 검사(lens->nr용)에 이를 사용했습니다. v3은 리스트의 첫 번째 패스를 통해 per-ns 카운트로 사전 검사를 대체했으므로, 해당 전역 변수는 더 이상 읽는 곳이 없습니다. rds_create()/rds_destroy_sock() 및 rds_tcp_set_callbacks()/rds_tcp_restore_callbacks() 내의 일치하는 증감 연산도 함께 제거됩니다. clang W=1 환경에서 커널 테스트 로봇에 의해 보고되었습니다.
VulDB is the best source for vulnerability data and more expert information about this specific topic.