[하루한줄] Uninitialized kernel stack leaks in freeBSD
URL
CVE-2020-25578/CVE-2020-25579 freeBSD fsdisclosure
Target
freeBSD
Explain
BSD계열의 오픈소스 운영체제인 freeBSD의 여러 파일 시스템에서 커널 스택 주소를 유출할 수 있는 취약점이 공개되었습니다.
다음은 영향을 받는 파일 시스템입니다.
- tmpfs
- smbfs
- autofs
- mqueuefs
- msdosfs
커널 스택 주소가 유출되는 dirent 구조체는 다음과 같은 필드로 구성되어 있습니다.
struct dirent {
ino_t d_fileno; /* file number of entry */
off_t d_off; /* directory offset of entry */
__uint16_t d_reclen; /* length of this record */
__uint8_t d_type; /* file type, see below */
__uint8_t d_pad0;
__uint16_t d_namlen; /* length of string in d_name */
__uint16_t d_pad1;
#if __BSD_VISIBLE
#define MAXNAMLEN 255
char d_name[MAXNAMLEN + 1]; /* name must be no longer than this */
#else
char d_name[255 + 1]; /* name must be no longer than this */
#endif
};
이중 msdosfs의 취약점은 msdosfs_readdir 함수에서 발생합니다. 해당 함수에서는 MSDOS 파일 시스템의 루트에서 readdir 이 호출된 경우 dirent_terminate에서 d_pad0, d_pad1,d_name 필드를 초기화한 이후 uiomove 함수에서 struct dirent dirbuf 객체의 데이터를 유저 랜드로 복사합니다. 그러나 루트 이외의 MSDOS 파일 시스템에서 readdir을 호출한 경우 d_pad0, d_pad1 필드가 초기화되지 않은 상태로 uiomove 함수를 통해 데이터가 유저 랜드로 복사되어 커널의 스택 주소를 유출할 수 있습니다.
msdosfs를 제외한 파일 시스템은 다음 함수 목록에서 커널 스택에 struct dirent 객체를 할당합니다.
tmpfs_dir_getdotdenttmpfs_dir_getdotdotdentsmbfs_readvdirautofs_readdir_onemqfs_readdir
그러나 객체의 데이터를 유저 랜드로 복사하기 전에d_off 필드를 초기화하지 않아 커널의 스택 주소가 남아있으며 이를 유출할 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.