🇰🇷 한글 설명
Linux 커널의 OVPN 모듈에서 UDP 소켓 파괴 시 잘못된 P2P 피어를 해제하여 발생하는 Use-After-Free 취약점입니다. 새로운 피어가 기존 피어를 대체하는 과정에서 소켓 불일치 발생 시, 현재 활성화된 피어의 참조 횟수를 잘못 감소시켜 메모리 오류를 유발할 수 있습니다.
💡 쉬운 설명
네트워크 연결을 끊는 과정에서 시스템이 엉뚱한 연결 정보를 삭제하여, 이미 사용 중인 메모리 영역을 건드리는 오류가 발생할 수 있습니다. 이로 인해 시스템이 불안정해지거나 보안 문제가 생길 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ovpn: avoid putting unrelated P2P peer on socket release
ovpn_peer_release_p2p() is called when an OVPN UDP socket is being
destroyed. It checks the currently published P2P peer and releases it only
if that peer still uses the socket being destroyed.
A peer replacement can publish a new peer before the old UDP socket is
destroyed. When the old socket destruction path runs afterwards,
ovpn_peer_release_p2p() observes the new peer through ovpn->peer. Since the
new peer uses a different socket, the function takes the socket mismatch
branch.
That branch still calls ovpn_peer_put(peer). At this point, however, peer
is the currently published replacement peer, not the peer associated with
the socket being destroyed. Dropping its reference can free it while
ovpn->peer still points to it, leading to later use-after-free accesses
from the peer and socket cleanup paths.
KASAN reports this as a slab-use-after-free on the kmalloc-1k ovpn_peer
object. In the reproducer, the object is allocated from ovpn_peer_new() via
ovpn_nl_peer_new_doit(), and freed through ovpn_peer_release_rcu() from RCU
callback processing. Observed access sites include ovpn_peer_remove(),
ovpn_socket_release(), ovpn_nl_peer_del_notify(), and unlock_ovpn().
Fix this by returning from the socket mismatch branch without putting the
peer.
📍 영향받는 시스템
Linux kernel with OVPN module (UDP socket functionality)
⚔️ 공격 벡터
특수하게 조작된 P2P 피어 교체 시퀀스를 유도하여 메모리 해제 후 사용(Use-After-Free) 유발
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 ovpn_peer_release_p2p() 함수 수정 사항 반영
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인하십시오.