[하루한줄] 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_getdotdent
tmpfs_dir_getdotdotdent
smbfs_readvdir
autofs_readdir_one
mqfs_readdir
그러나 객체의 데이터를 유저 랜드로 복사하기 전에d_off
필드를 초기화하지 않아 커널의 스택 주소가 남아있으며 이를 유출할 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.