flawopen.com/Teardowns/cve-2023-2640-ubuntu-overlayfs-privilege-escalation
CVE-2023-2640: Ubuntu OverlayFS 권한 상승
CVE-2023-2640은 일부 Ubuntu 커널의 OverlayFS 권한 검사를 우회합니다. 커널 종류를 확인하고 공급업체 수정판을 설치하세요.
직원이 방문자가 문서에 공식 도장을 찍을 수 있는지 확인하는 건물을 떠올려 보세요. 로컬 지름길은 건물 관리 라벨에 대해서만 검사를 생략하도록 만들어졌습니다. 이후 변경으로 제한된 보안 도장을 포함한 모든 요청이 그 지름길을 통과했습니다. 수정은 마운트된 파일시스템의 user namespace에서 일반 권한 검사를 복구합니다.
핵심 개념 및 용어
OverlayFS- OverlayFS는 lower 계층의 파일을 보여 주고 변경 사항을 upper 계층에 기록하는 Linux union filesystem입니다.
Extended attribute (xattr)- 확장 속성(xattr)은 파일시스템 객체에 연결되는 메타데이터입니다. Linux 보안 모듈과 파일 capability는 특정 xattr namespace를 사용합니다.
ovl_do_setxattr()- upper 계층 객체에 xattr를 쓰는 OverlayFS helper입니다. 취약한 래퍼는 권한 검사 없는 VFS helper를 지나치게 넓게 사용했습니다.
Copy-up- 쓰기 작업에 lower 객체의 수정 가능한 복사본이 필요할 때 upper 계층에 복사본을 만드는 OverlayFS 작업입니다.
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 CWE 참조: CWE-863
근본 원인 분석 (Root Cause)
Ubuntu CVE 기록에 따르면 취약한 구성에는 upstream 커밋 c914c0e27eb0과 Ubuntu SAUCE 패치 “Skip permission checking for trusted.overlayfs.* xattrs”가 모두 필요합니다. SAUCE 패치는 OverlayFS xattr 래퍼를 VFS _noperm helper로 바꾸어 내부 trusted.overlayfs.* 메타데이터에 대해서만 검사를 생략하려 했습니다. upstream 래퍼 변경 뒤 helper가 다른 xattr에도 사용되었습니다. 그 결과 로컬 비특권 사용자가 마운트된 파일에 특권 확장 속성을 설정하고 적절한 검사 없이 upper 계층 파일로 복사하게 할 수 있었습니다. Canonical 수정은 광범위한 무검사 경로를 되돌리고 upper mount의 user namespace를 사용해 vfs_setxattr()를 호출합니다. Ubuntu 커널에 한정된 로컬 권한 상승 문제이며 release, 커널 종류, namespace 및 mount 정책에 따라 노출 여부가 달라집니다.
단계별 공격 실행 흐름
영향받는 Ubuntu 커널 구성
커널에 c914c0e27eb0과 trusted.overlayfs.* xattr 검사를 생략하는 Ubuntu SAUCE 패치가 모두 있어야 합니다. upstream 버전 번호만으로 노출을 판단할 수 없습니다.
로컬 사용자가 xattr 경로에 접근
호스트의 namespace 및 mount 정책에 따라 로컬 비특권 사용자가 취약한 OverlayFS 경로를 사용할 수 있어야 합니다. Ubuntu는 이를 로컬 공격으로 설명합니다.
권한 우회가 다른 xattr에도 적용
변경된 래퍼는 xattr 업데이트를 OverlayFS 내부 메타데이터용 _noperm helper로 보냈습니다. upstream 변경 뒤 다른 xattr도 적절한 검사를 받지 않을 수 있었습니다.
특권 속성이 upper 객체에 도달
Ubuntu는 특권 확장 속성이 마운트된 파일에 설정된 뒤 필요한 검사 없이 upper 파일로 복사될 수 있어 로컬 권한 상승으로 이어질 수 있다고 설명합니다. 모든 구성의 도달 가능성이 같지는 않습니다.
소스 코드 비교: 취약한 구현 vs 보안 패치
영향받은 SAUCE 경로는 upstream 변경으로 범위가 넓어진 뒤 모든 xattr에 __vfs_setxattr_noperm()을 호출했습니다. 수정은 upper mount의 user namespace와 함께 vfs_setxattr()를 사용해 일반 VFS 검사를 복구합니다. Canonical 패치의 핵심 발췌이며 주변 debug 출력은 생략했습니다.
소스 코드 발췌: fs/overlayfs/overlayfs.h
/* SAUCE 변경을 되돌리기 전 Ubuntu 표준 패치의 관련 부분입니다. */
static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
const char *name, const void *value,
size_t size, int flags)
{
struct inode *inode = dentry->d_inode;
int err;
inode_lock(inode);
err = __vfs_setxattr_noperm(&init_user_ns, dentry, name,
value, size, flags);
inode_unlock(inode);
return err;
}
/* Ubuntu 표준 수정: 권한을 확인하는 VFS 래퍼를 복원합니다. */
static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
const char *name, const void *value,
size_t size, int flags)
{
int err = vfs_setxattr(ovl_upper_mnt_userns(ofs), dentry, name,
value, size, flags);
return err;
}
엔지니어링 및 시스템 보안 강화 체크리스트
- ✓정확한 release, 커널 종류, 패키지를 Ubuntu CVE 추적 페이지에서 확인하세요. Ubuntu와 upstream 변경의 특정 조합이 조건입니다.
- ✓영향받는 Ubuntu release와 커널 종류에 맞는 수정 패키지를 설치하고 재부팅한 뒤 실행 중인 커널을 확인하세요.
- ✓업데이트를 미뤄야 한다면 비특권 user namespace 생성을 제한하는 Ubuntu 문서의 임시 완화책을 검토하고 앱 및 컨테이너 영향을 시험하세요.
- ✓OverlayFS xattr 래퍼에서 사용자 제어 속성에는 올바른 mount user namespace와 권한 검사를 갖춘 VFS API를 사용하고, 무검사 helper는 정당화된 내부 메타데이터에 한정하세요.