CVE-2026-98432 in Linux
요약
\~에 의해 VulDB • 2026. 10. 15.
Linux 커널에서 다음 취약점이 해결되었습니다:
ipv4: RCU grace period 이후 inet_opt 및 ireq_opt 해제
tcp_v4_syn_recv_sock()는 복사하지 않고 ireq->ireq_opt의 소유권을 자식 소켓(newinet->inet_opt)으로 이전합니다.
다른 CPU가 동일한 요청 소켓에 대한 재전송된 SYN을 동시에 처리하고 tcp_check_req()에서 SYNACK를 전송할 수 있습니다. tcp_v4_send_synack() 및 inet_csk_route_req()는 rcu_read_lock() 하에서만 ireq->ireq_opt을 읽으며, ip_build_and_send_pkt() 및 ip_options_build()에서는 opt->optlen을 두 번 읽습니다.
SYNACK 타이머 자체에는 문제가 없습니다: 이 타이머는 요청 소켓에 대한 참조를 유지하며, inet_csk_reqsk_queue_drop()은 자식이 해제되기 전에 timer_delete_sync()를 호출합니다.
commit 079096f103fa("tcp/dccp: install syn_recv requests into ehash table") 이후로 요청 소켓이 리스너 잠금을 보유하지 않고 처리되므로, SYNACK가 여전히 구축되는 동안 자식 소켓이 해제될 것을 방지하는 것이 없습니다. TCP 자식 소켓에는 SOCK_RCU_FREE가 없으며, inet_sock_destruct()는 plain kfree()를 사용하여 inet_opt를 해제하므로 ip_options_build()에서 use-after-free가 발생합니다.
요청 소켓 마이그레이션(net.ipv4.tcp_migrate_req=1 또는 BPF_SK_REUSEPORT_SELECT_OR_MIGRATE 프로그램)과 유사한 문제가 존재합니다. reqsk_timer_handler()는 inet_reqsk_clone()을 사용하여 요청 소켓을 복제하므로, 기존 요청 소켓과 그 클론은 동일한 ireq_opt를 공유하며, 이후 reqsk_migrate_reset()이 기존 쪽의 포인터를 지웁니다. 기존 요청 소켓에 대한 참조를 보유한 다른 CPU가 여전히 이러한 옵션(예: SYNACK 전송 또는 tcp_v4_syn_recv_sock()에서 자식 생성)을 사용하고 있는 동안 클론이 해제되면, tcp_v4_reqsk_destructor() 또한 plain kfree()를 사용합니다.
리더들은 이미 RCU를 사용하며, inet_opt를 대체하는 다른 경로(do_ip_setsockopt(), cipso_v4_sock_setattr() 등...)는 이미 kfree_rcu()를 사용하고 있습니다. inet_sock_destruct() 및 tcp_v4_reqsk_destructor()에서도 kfree_rcu()를 사용합니다.
IPv6은 첫 번째 문제의 영향을 받지 않습니다. 이는 tcp_v6_syn_recv_sock()가 옵션을 복제하기 때문입니다. tcp_v6_reqsk_destructor()에는 ipv6_opt와 관련된 동일한 마이그레이션 문제가 존재하는데, 이 값은 CALIPSO에 의해서만 설정됩니다. 이에 대한 해결책은 별도의 패치에서 다룰 예정입니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.