[하루한줄] 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 필드를 초기화하지 않아 커널의 스택 주소가 남아있으며 이를 유출할 수 있습니다.