[하루한줄] CVE-2021-26708: Linux 커널 가상 소켓 라이브러리의 Race Condition 취약점
URL
Four Bytes of Power: exploiting CVE-2021-26708 in the Linux kernel
Target
- Linux kernel
Explain
Zer0con 2021에서 Linux 커널의 로컬 권한 상승 취약점이 공개되었습니다.
취약점은 가상 머신과 하이퍼바이저 간의 통신을 위한 소켓 프로토콜인 virtual socket library에서 발견되었으며 net/vmw_vsock/af_vsock.c
의 다음 함수들에 존재합니다.
vsock_poll()
vsock_dgram_sendmsg()
vsock_stream_setsockopt()
vsock_stream_sendmsg()
vsock_stream_recvmsg()
이 중 vsock_stream_setsockopt()
의 코드입니다.
static int vsock_stream_setsockopt(struct socket *sock,
int level,
int optname,
sockptr_t optval,
unsigned int optlen)
/* ... */
struct sock *sk;
struct vsock_sock *vsk;
const struct vsock_transport *transport;
/* ... */
sk = sock->sk;
vsk = vsock_sk(sk);
transport = vsk->transport;
lock_sock(sk);
가상 소켓 전송 포인터인 vsk→transport
는 로컬 변수인 transport
에 저장되는데, 로컬 변수에 저장한 이후 소켓 sk
에 대한 lock을 획득하므로 vsk→transport
의 값이 변경될 수 있고 이는 race condition을 통해 로컬 권한 상승까지 이어집니다.
제보자는 5개의 함수에서 race condition을 유발하는 동일한 취약점을 발견했으며 아래와 같이 소켓 sk
에 대한 lock을 획득한 이후 로컬 변수에 저장하도록 패치되었습니다.
sk = sock->sk;
vsk = vsock_sk(sk);
- transport = vsk->transport;
lock_sock(sk);
+ transport = vsk->transport;
Github에 공개된 자세한 패치 히스토리는 https://github.com/torvalds/linux/commit/c518adafa39f37858697ac9309c6cf1805581446 에서 확인할 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.