[하루한줄] Privilege escalation in firejail overlayfs

URL

Firejail: root privilege escalation in OverlayFS code

Target

Firejail 0.9.30

Explain

Firejail은 Linux 환경에서 애플리케이션의 실행 환경을 제한하는 SUID 샌드박싱 애플리케이션입니다. Linux용 통합 마운트 파일 시스템인 overlayfs 기능이 활성화된 Firejail에서 race condition을 통해 root 권한으로 임의 파일을 수정할 수 있는 취약점이 발견되었습니다.

아래는 fs_overlayfs() 함수의 취약점이 발생하는 소스코드입니다

    943 void fs_overlayfs(void) {
...
    969         // we disable overlayfs for now, pending fixing
    970         if (major >= 4 &&minor >= 19) {
    971                 fprintf(stderr, "Error: OverlayFS disabled for Linux kernels 4.19 and newer, pending fixing.\\n");
    972                 exit(1);
    973         }
...
   1033         if (mkdirat(basefd, "odiff", 0755) == -1 && errno != EEXIST) {
   1034                 perror("mkdir");
   1035                 fprintf(stderr, "Error: cannot create overlay directory         %s\\n", odiff);
   1036                 exit(1);
   1037         }
   1038         ASSERT_PERMS(odiff, 0, 0, 0755);
...
   1065         else { // kernel 3.18 or newer
   1066                 if (asprintf(&option, "lowerdir=/,upperdir=%s,workdir=%s        ", odiff, owork) == -1)
   1067                         errExit("asprintf");
   1068                 if (mount("overlay", oroot, "overlay", MS_MGC_VAL, optio        n) < 0) {

Firejail은 overlayfs를 사용하기 위해 사용자 홈 디렉터리에서 시작하는 마운트 대상 디렉터리를 찾아 이동하며 root 소유이고, 다른 사용자/그룹 권한이 없는지 확인한 뒤 마운트 합니다. 이때 디렉터리 참조에 파일 디스크립터를 사용하지 않고 절대 경로를 사용하는데, 권한 체크와 마운트 사이 시간 동안 마운트 대상 디렉터리를 해커가 조작한 디렉터리로 교체할 수 있습니다.

이를 악용하면 교체된 디렉터리의 심볼릭 링크를 통해 root 권한으로 샌드박스 외부 시스템 파일을 임의로 수정할 수 있습니다.

Firejail 개발사는 overlayfs 기능을 일시적으로 비활성화 한 업데이트를 릴리스했으며, 해당 패치는 https://github.com/netblue30/firejail/commit/97d8a03cad19501f017587cc4e47d8418273834b에서 확인할 수 있습니다.