[하루한줄] CVE-2021-33909: Linux 커널 파일 시스템의 로컬 권한 상승 취약점

URL

Sequoia: A Local Privilege Escalation Vulnerability in Linux’s Filesystem Layer (CVE-2021-33909)

Target

  • linux kernel

Explain

Linux 커널의 seq_file 인터페이스는 개발자의 편의를 위해 proc 인터페이스에서의 파일 출력 interation을 제공하기 위해 설계되었습니다. 이러한 seq_file 인터페이스에서 size_tint 간 type conversion 취약점이 발견되어 세부 정보가 공개되었습니다.

권한이 없는 해커가 로컬에서 경로 길이가 1GB를 초과하는 디렉터리 구조를 생성/마운트 한 뒤 삭제하고 /proc/self/mountinfo 경로를 여는 경우 아래와 같이 취약점이 트리거 됩니다.

------------------------------------------------------------------------
135 static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt)
136 {
…
150                 seq_dentry(m, mnt->mnt_root, " \\t\\n\\");
------------------------------------------------------------------------
523 int seq_dentry(struct seq_file *m, struct dentry *dentry, const char *esc)
524 {
525         char *buf;
526         size_t size = seq_get_buf(m, &buf);
…
529         if (size) {
530                 char *p = dentry_path(dentry, buf, size);
------------------------------------------------------------------------
380 char *dentry_path(struct dentry *dentry, char *buf, int buflen)
381 {
382         char *p = NULL;
…
385         if (d_unlinked(dentry)) {
386                 p = buf + buflen;
387                 if (prepend(&p, &buflen, "//deleted", 10) != 0)
------------------------------------------------------------------------
11 static int prepend(char **buffer, int *buflen, const char *str, int namelen)
12 {
13         *buflen -= namelen;
14         if (*buflen < 0)
15                 return -ENAMETOOLONG;
16         *buffer -= namelen;
17         memcpy(*buffer, str, namelen);
------------------------------------------------------------------------
  • seq_read_iter()에서 2GB 버퍼가 큰 사이즈의 할당을 위해 vmalloc()으로 처리되고 show_mountinfo() 함수가 호출됩니다.
  • show_mountinfo()에서 호출된 seq_dentry() 함수는 버퍼의 크기 size_t size를 구해 dentry_path()함수에 bufsize를 전달합니다.
  • dentry_path()에서 버퍼의 크기를 signed 32bit인 intbuflen으로 받아 integer overflow가 발생하고 -2GB (INT_MIN)가 됩니다.
  • dentry_path()에서 호출하는 prepend()의 13행에서 *buflen이 10 감소하고 *buffer-2GB-10 오프셋을 가리켜 문자열 //deleted 가 범위를 벗어난 주소에 복사됩니다.

현재까지 Ubuntu 20.04, Ubuntu 20.10, Ubuntu 21.04, Debian 11 및 Fedora 34 Workstation에서 위 취약점을 악용해 전체 시스템의 root 권한을 획득할 수 있는 것으로 확인되었으며 다른 Linux 배포판 또한 취약한 것으로 알려졌습니다.