[하루한줄] CVE-2021-44142: Samba 데몬 smbd의 코드 실행 취약점

URL

CVE-2021-44142: DETAILS ON A SAMBA CODE EXECUTION BUG DEMONSTRATED AT PWN2OWN AUSTIN

Target

  • smbd 4.9.5

Explain

파일 공유 프로토콜 Samba의 리눅스 서비스 데몬인 smbd에서 Heap OOB read/write 및 Heap Buffer Overflow 취약점이 발견되었습니다.

Samba의 fruit 모듈은 Samba와 Netatalk 간 통신을 지원해 Unix 계열 시스템을 애플 장치의 파일 서버로 사용할 수 있습니다.

Netatalk는 애플 장치에서 사용하는 AFP(Apple Filing Protocol)을 Unix 계열 시스템에서 사용할 수 있도록 구현된 오픈소스입니다.

이러한 fruit 모듈은 스트림 이름이 :AFP_AfpInfo 또는 :AFP_Resource인 파일에 액세스하는 요청을 처리하는데, 이 중 :AFP_AfpInfo 의 경우 해커는 파일의 Netatalk 메타데이터를 임의로 수정할 수 있어 이를 파싱하는 과정의 검증 부족으로 여러 취약점이 발견되었습니다.

아래는 Heap OOB read 취약점이 발생하는 fruid_pread_meta_adouble 함수의 코드의 일부입니다.

static ssize_t fruit_pread_meta_adouble(vfs_handle_struct *handle, files_struct *fsp, void *data, size_t n, off_t offset)
{
	AfpInfo *ai = NULL;
	struct adouble *ad = NULL;
	char afpinfo_buf[AFP_INFO_SIZE];
	char *p = NULL;
	ssize_t nread;
...
	ad = `ad_fget(talloc_tos(), handle, fsp, ADOUBLE_META);   // (1) create `adouble` struct
	if (ad == NULL) {...}

	p = ad_get_entry(ad, ADEID_FINDERI);                     // (2) p = ad->data + ad->ad_eid[ADEID_FINDERI].ade_off
	if(p == NULL) {...}

	memcpy(&ai->afpi_FinderInfo[0], p, ADEDLEN_FINDERI);    // <-- read 32 bytes from buffer `p`
...
	memcpy(data, afpinfo_buf, n);                            // (3) copy to out buffer, it will be sent back to user later
...
}

해당 함수는 해커가 임의로 수정한 :AFP_AfpInfo 파일의 메타데이터를 가져오는 과정에서 Heap OOB read 취약점이 발생합니다.

(1) : ad_fget 함수를 호출해 해커가 제어할 수 있는 데이터를 포함하는 adouble(AppleDouble) 구조체를 생성합니다.

(2) : ad_get_entry 호출로 adADEID_FINDERI 포인터가 반환되어 p에 저장되는데, 이때 pad→data 버퍼의 마지막 바이트를 가리키도록 할 수 있습니다.

(3) : memcpy 호출에서 할당된 버퍼를 넘어 최대 31bytes 의 메모리를 읽을 수 있습니다.

fruit_pwrite_meta_netatalk 함수에서 OOB write가, ad_setdate 함수에서 Heap Buffer Overflow가 유사한 방식으로 발견되었으며 해커는 해당 취약점들을 악용해 smbd 데몬 컨텍스트에서 임의의 코드를 실행할 수 있습니다.