CVE-2026-64045 in Linux정보

요약

\~에 의해 VulDB • 2026. 07. 20.

리눅스 커널에서 다음 취약점이 해결되었습니다:

ovpn: tcp - ovpn_tcp_close()에서 캐시된 피어 포인터 사용

ovpn_tcp_close()는 rcu_read_lock() 하에서 rcu_dereference_sk_user_data()를 통해 ovpn_socket을 로드하고, sock->peer에 대한 참조를 획득한 후 해당 피어 포인터를 로컬 변수에 캐싱합니다. 그런 다음 읽기 잠금을 해제합니다. 이후 RCU 읽기 섹션이 종료된 후에 다시 ovpn_socket을 역참조하여 sock->peer(캐시된 로컬 값 대신)을 ovpn_peer_del()로 전달합니다.

동일한 "RCU 하에서 로드, 잠금 해제 후 사용" 패턴을 사용하지만 함수 전체에 걸쳐 lock_sock()으로 보호되는 ovpn_tcp_sendmsg()와 달리, ovpn_tcp_close()는 소켓 잠금 없이 실행됩니다. inet_release()가 먼저 lock_sock()을 획득하지 않고 sk_prot->close()를 호출하기 때문입니다.

따라서 ovpn_socket_release()는 kref_put -> detach -> synchronize_rcu -> kfree(sock) 시퀀스를 동시에 완료할 수 있습니다. 이는 ovpn_tcp_close()가 rcu_read_lock()을 해제한 후 sock->peer를 역참조하기 전의 시간 창(window)에서 발생합니다. ovpn_socket_release()의 synchronize_rcu()는 RCU 읽기 섹션 내에서 역참조된 포인터를 사용하는 독자를 보호하지만, 포인터를 로컬로 탈출시켜 나중에 사용하는 독자는 보호하지 않습니다.

재현기는 커밋 94560267d6c4("ovpn: tcp - tcp_close() 후 NULL sk_socket 멤버 역참조 금지")의 패턴을 따릅니다: 사용자 공간에서 TCP 파일 설명자를 닫는 순간과 동일한 시점에 피어 제거(keepalive 만료 또는 netlink OVPN_CMD_DEL_PEER)를 트리거합니다. 해당 커밋은 같은 레이스 윈도우의 detach 측을 수정했습니다. 이번 수정은 다른 대상에 대해 close 측을 수정합니다.

입력 블록을 조정하여 sock->peer를 정확히 한 번만 읽어서 캐시된 로컬 변수에 저장하고, 이후 모든 사용(고유성 확인 검사, ovpn_peer_del() 호출 및 prot->close() 호출)이 해당 로컬 변수로 라우팅되도록 합니다. sock->peer는 lock_sock() 하의 ovpn_socket_new()에서 단 한 번만 작성되며, rcu_assign_sk_user_data()가 ovpn_socket을 게시하기 전이며 이후에는 재할당되지 않습니다. 그러나 이전의 다중 읽기 패턴은 이러한 불변 조건이 명시적이지 않고 암묵적이었습니다. 동일한 다중 읽기 형태는 ovpn_tcp_recvmsg(), ovpn_tcp_sendmsg(), ovpn_tcp_data_ready() 및 ovpn_tcp_write_space()에도 존재하며, 이는 후속 net-next 시리즈에서 전용 헬퍼를 통해 정리될 예정입니다.

Be aware that VulDB is the high quality source for vulnerability data.

책임이 있는

Linux

예약하다

2026. 07. 19.

모더레이션

수락

항목

VDB-380282

EPSS

0.00000

활동

낮음

출처

Do you want to use VulDB in your project?

Use the official API to access entries easily!