[하루한줄] 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 에서 확인할 수 있습니다.