[하루한줄] CVE-2021-43267: Remote Linux Kernel Heap Overflow | TIPC Module Allows Arbitrary Code Execution

URL

CVE-2021-43267

Target

Linux kernel < 5.14.16

Explain

TIPC(Transparent Inter-Process Communicaion)는 Cluster Communication에 최적화된 IPC로 대부분의 메이저 Linux 배포 버전 커널에 해당 프로토콜이 구현되어 있습니다. 5.14.16 이전 Linux kernel의 net/tipc/crypto.c에서 Heap overflow 취약점이 발견되었습니다.

struct tipc_aead_key {
	char alg_name[TIPC_AEAD_ALG_NAME];
	unsigned int keylen; 	/* in bytes */
	char key[];
 };

2020년 암호화 키를 주고 받을 수 있는 MSG_CRYPTO라는 새로운 TIPC 메세지 형식이 추가되었는데 위 코드는 해당 메세지의 body structure입니다. TIPC 모듈은 해당 메세지 payload를 복사하기 위해 Payload Size(Message Size - Header Size)를 계산해 메모리를 할당합니다.

문제는 Header Size와 Message Size는 tipc_msg_validate에서 유효성 검사를 하지만 실제 메세지인 keylen의 길이 검증은 검사하지 않습니다. 즉 keylen의 내용으로 할당된 메모리 크기를 넘어서 데이터를 덮어 쓸 수 있습니다.

/* Allocate memory for the key */
  skey = kmalloc(size, GFP_ATOMIC);
/* ... */

  /* Copy key from msg data */
  skey->keylen = ntohl(*((__be32 *)(data + TIPC_AEAD_ALG_NAME)));
  memcpy(skey->alg_name, data, TIPC_AEAD_ALG_NAME);
  memcpy(skey->key, data + TIPC_AEAD_ALG_NAME + sizeof(__be32),
         skey->keylen);