CVE-2026-80849 in Linux
요약
\~에 의해 VulDB • 2026. 09. 04.
리눅스 커널에서 다음 취약점이 해결되었습니다:
net/tcp-ao: 다른 피어와의 재연결 시 current_key의 use-after-free 수정
tcp_inbound_ao_hash()는 bh_lock_sock_nested()이 획득되기 전에 호출되며, 이때 rcu_read_lock()만 보유됩니다. 확립된 소켓에 대한 빠른 경로에서 페어가 보낸 rnext_keyid가 current_key->sndid와 다른 경우, 페어가 요청한 키를 조회하여 current_key에 저장합니다. 이 조회는 RCU 읽기 사이드 내에서 수행되지만, current_key의 수명은 이를 초과합니다.
소켓이 연결 해제되고 다시 connect()가 호출되어 다른 피어로 연결할 때, tcp_ao_connect_init()은 새 페어와 일치하지 않는 모든 키를 언링크하고 call_rcu()로 해지합니다. 만약 current_key가 이러한 키를 가리키고 있다면, 해당 값은 NULL로 초기화됩니다.
빠른 경로는 진입 시 sk_state를 한 번만 읽으므로, 소켓이 여전히 확립된 상태일 때 발생한 softirq는 이미 루프가 실행된 후에 current_key를 업데이트할 수 있습니다. 이 업데이트는 RCU 읽기 사이드 내에서 발생하므로 call_rcu() 콜백보다 먼저 수행되며, 콜백이 키를 해지하면 current_key는 해제된 메모리를 가리킨 채로 남게 됩니다.
다음 전송 시 tcp_get_current_key()에서 해당 포인터가 참조됩니다. 이후 tcp_ao_transmit_skb()은 해제된 객체로부터 트래픽 키를 읽는데, 이것이 바로 use-after-free입니다.
키가 제거될 경우에만 언링크하기 전에 하나의 그race 기간을 기다립니다. tcp_connect()이 실행되는 시점에는 소켓이 이미 TCP_SYN_SENT 상태이며, TCP_AO_ESTABLISHED는 TCPF_SYN_SENT를 포함하지 않으므로, 대기 이후에 진입하는 softirq는 빠른 경로에 도달할 수 없으며, 이미 해당 경로에 있는 것들은 완료됩니다. 루프 내의 기존 NULL 처리가 충분해집니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.