FlawOpen

flawopen.com/Teardowns/cve-2023-2640-ubuntu-overlayfs-privilege-escalation

● CVE-2023-2640 · CVSS 7.8 · 높음
보안 연구 · FlawOpen

CVE-2023-2640: Ubuntu OverlayFS 권한 상승

CVE-2023-2640은 일부 Ubuntu 커널의 OverlayFS 권한 검사를 우회합니다. 커널 종류를 확인하고 공급업체 수정판을 설치하세요.

💡 알기 쉬운 설명 (ELI5)

직원이 방문자가 문서에 공식 도장을 찍을 수 있는지 확인하는 건물을 떠올려 보세요. 로컬 지름길은 건물 관리 라벨에 대해서만 검사를 생략하도록 만들어졌습니다. 이후 변경으로 제한된 보안 도장을 포함한 모든 요청이 그 지름길을 통과했습니다. 수정은 마운트된 파일시스템의 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 정책에 따라 노출 여부가 달라집니다.

단계별 공격 실행 흐름

단계 1

영향받는 Ubuntu 커널 구성

커널에 c914c0e27eb0과 trusted.overlayfs.* xattr 검사를 생략하는 Ubuntu SAUCE 패치가 모두 있어야 합니다. upstream 버전 번호만으로 노출을 판단할 수 없습니다.

단계 2

로컬 사용자가 xattr 경로에 접근

호스트의 namespace 및 mount 정책에 따라 로컬 비특권 사용자가 취약한 OverlayFS 경로를 사용할 수 있어야 합니다. Ubuntu는 이를 로컬 공격으로 설명합니다.

단계 3

권한 우회가 다른 xattr에도 적용

변경된 래퍼는 xattr 업데이트를 OverlayFS 내부 메타데이터용 _noperm helper로 보냈습니다. upstream 변경 뒤 다른 xattr도 적절한 검사를 받지 않을 수 있었습니다.

단계 4

특권 속성이 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;
}

엔지니어링 및 시스템 보안 강화 체크리스트

출처