Linux Kernel의 overlayfs 파일시스템 구현에 있어서 user namespace와 관련한 파일시스템 capability 적용에 대해 적절히 검증하지 않았다. Ubuntu의 로컬 공격자는 해당 취약점을 사용해서 Ubuntu의 권한없는 overlayfs 마운트의 허가로 권한 상승으로 이어질 수 있다.
Affected Kernel Version
Ubuntu specific
Linux Kernel v5.11 이전
확인되는 바로는 현재 5.8 버전은 패치되었다. 5.4는 영향을 받는다.
Background
Union Mount Filesystem
하나의 디렉터리에 여러 파일시스템을 마운트하는 기술
마운트한 여러 파일시스템 내용이 합쳐진다. 먼저 마운트한 파일시스템의 디렉터리 구조가 나중에 마운트한 파일시스템 디렉터리와 합쳐진다. 동일한 파일 이름을 가진다면 나중에 마운트한 파일시스템 내용을 우선으로 보여주고,
투명한 셀로판지를 여러 개 겹쳐서 위에서 내려다보는 것과 비슷하다.
union mount는, 마운트 시 —union 옵션을 줄 때 파일 시스템을 병합(merge)해서 마운트한다.
Overlayfs (오버레이 파일 시스템)
Union Mount File System
overlayfs(overlay 파일시스템)이 linux kernel 3.18 버전부터 통합되었다.
overlay 파일시스템은 upper와 lower 파일시스템을 하나의 파일시스템 네임스페이스로 합친다.변화는 upper 파일시스템에서 이루어진다.
다른 union 파일시스템과 다른 점은, 파일이 열린 후 모든 연산은 바로 lower나 upper 파일시스템으로 간다.
lower, upper, merge, work의 4개의 디렉토리 레이어로 나뉜다.
lower filesystem: upper directory 아래에 깔려있는 1개 이상의 디렉토리 (read-only) lower 파일시스템은 다른 overlayfs가 될 수도 있다.
lower directory에서의 파일 변경은 upper에 copy된다.
upper filesystem: 가장 위쪽의 디렉토리로, 최종적으로 사용자에게 보이는 파일을 변경할 수 있다. (read/write 가능)
프로세스는 파일을 읽을 때(read), overlayfs 파일시스템은 upper 디렉토리에서 해당 파일이 있으면 upper 디렉토리에서 읽고, 없으면 lower 디렉토리에서 찾는다.
프로세스는 파일을 쓸 때(write), overlayfs 파일시스템은 upper 디렉토리에만 쓴다.
work directory: 레이어 사이에서 전환될 때 파일을 준비하는데 사용한다. work 디렉터리는 upper 디렉토리와 동일한 파일시스템에 있어야 한다. (upper 디렉토리와 동일한 파일시스템에 마운트 되는 빈 디렉토리)
merge directory
cap_convert_nscap
네임스페이스에 대해 권한이 있는지 체크한다.
Vulnerability Analysis
linux에서 파일에 대해 file capability를 적용하는 과정은 다음과 같다.
setxattr(...):
if cap_convert_nscap(...) is not OK:
then fail
vfs_setxattr(...)
cap_convert_nscap을 통해 네임스페이스에 대한 권한이 있는지 체크한 후 파일에 capability를 세팅한다.
하지만 Overlayfs에서 파일 시스템에 대해 file capability를 적용할 때, vfs_setxattr() 함수만 호출하고 cap_convert_nscap()을 호출 하지 않아 네임스페이스에 대한 권한 체크가 부재하다.
이것은 해당 파일들에 대해 외부 네임스페이스나 마운트를 할 수 있도록 capability를 설정할 수 있도록 한다.