[하루한줄] 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
호출로 ad
의 ADEID_FINDERI
포인터가 반환되어 p
에 저장되는데, 이때 p
가 ad→data
버퍼의 마지막 바이트를 가리키도록 할 수 있습니다.
(3) : memcpy
호출에서 할당된 버퍼를 넘어 최대 31bytes 의 메모리를 읽을 수 있습니다.
fruit_pwrite_meta_netatalk
함수에서 OOB write가, ad_setdate
함수에서 Heap Buffer Overflow가 유사한 방식으로 발견되었으며 해커는 해당 취약점들을 악용해 smbd 데몬 컨텍스트에서 임의의 코드를 실행할 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.