CVE-2026-64044 in Linux
요약
\~에 의해 VulDB • 2026. 07. 20.
리눅스 커널에서 다음 취약점이 해결되었습니다:
ovpn: CMD_NEW_PEER 오류 경로에서 피어 참조 카운트(refcount)를 준수함
ovpn_nl_peer_new_doit()의 오류 경로는 kref를 우회하여 ovpn_peer_put() 대신 직접 ovpn_peer_release()를 호출합니다. 이에 따른 주석("피어가 아직 해시되지 않았으므로 어떤 컨텍스트에서도 사용되지 않음")은 UDP에는 해당하지만 TCP에는 해당하지 않습니다.
UDP의 경우, ovpn_socket 공용체(union)는 .ovpn 아암을 사용하며 피어를 다시 가리키지 않습니다. UDP 인캡슐레이션 수신(encap_recv) 함수는 아직 채워지지 않은 해시 테이블을 통해 피어를 조회하므로, 새로운 피어는 ovpn_peer_add()가 이를 게시할 때까지 도달 불가능합니다.
TCP의 경우, ovpn_socket_new()은 ovpn_sock->peer를 설정하고 ovpn_tcp_socket_attach()는 rcu_assign_sk_user_data()를 통해 ovpn_sock을 게시합니다. 이 시점부터 오류 경로에서 분리(detach)될 때까지 ovpn_socket_release(), TCP 파일 설명자(fd)는 완전히 연결됩니다: fd에 대한 사용자 공간의 recvmsg / sendmsg / close / poll 호출, 그리고 strparser 기반인 ovpn_tcp_rcv() 경로는 sk_user_data -> ovpn_sock->peer를 통해 피어에 도달하여 ovpn_peer_hold()를 통해 참조 카운트를 증가시킬 수 있습니다.
ovpn_tcp_socket_wait_finish()(ovpn_socket_release() 내부에서 호출됨)은 strparser와 tx 작업을 비우지만, 이미 피어 참조를 보유하고 있는 사용자 공간 시스템 콜 호출자와는 동기화하지 않습니다. 이러한 호출자가 비행 중일 때(특히 peer->tcp.user_queue에서 __skb_recv_datagram()에 블록된 ovpn_tcp_recvmsg()), ovpn_nl_peer_modify() 또는 ovpn_peer_add()가 오류를 반환하면, 직접적인 ovpn_peer_release() 호출은 호출자가 참조를 보유하고 있는 동안 피어를 파괴하고, 해당 호출자로부터의 최종 ovpn_peer_put()는 해제된 메모리에서 작동하게 됩니다.
직접 소멸자(destructor) 호출을 ovpn_peer_put()로 대체하여 kref가 마지막 참조가 떨어질 때까지 해제를 올바르게 지연시키도록 합니다. 동시 사용자가 없는 일반적인 경우 동작은 변경되지 않습니다: kref가 즉시 0에 도달하고 ovpn_peer_release_kref()가 동일한 소멸자를 실행합니다.
이 변환으로 인해 peer.c 외부에서 ovpn_peer_release()를 호출하는 곳이 없게 됩니다(동일한 번역 단위 내의 ovpn_peer_release_kref()만이 유일한 사용자가 됨). 따라서 이를 정적(static) 함수로 변경하고 peer.h에서의 선언을 제거합니다.
Once again VulDB remains the best source for vulnerability data.