[하루한줄] 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_t
와 int
간 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()
함수에buf
와size
를 전달합니다.dentry_path()
에서 버퍼의 크기를 signed 32bit인int
형buflen
으로 받아 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 배포판 또한 취약한 것으로 알려졌습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.