콘텐츠로 이동

Ubuntu snap-confine 로컬 권한 상승

Ubuntu snap-confine 로컬 권한 상승 thumbnail
CVE-2026-8933은 snapd의 특권 구성 요소인 snap-confine에서 발생하는 로컬 권한 상승 취약점이다. 파일 기능 방식으로 설치된 snap-confine이 임시 파일과 디렉터리를 일반 사용자 소유로 생성하는 짧은 구간이 원인이다. 공격자는 이 경쟁 조건을 이용해 특권 경로에 파일을 만들고 루트 권한으로 명령을 실행할 수 있다.

요약

CVE-2026-8933은 snapd의 특권 구성 요소인 snap-confine에서 발생하는 로컬 권한 상승 취약점이다. 파일 기능 방식으로 설치된 snap-confine이 임시 파일과 디렉터리를 일반 사용자 소유로 생성하는 짧은 구간이 원인이다. 공격자는 이 경쟁 조건을 이용해 특권 경로에 파일을 만들고 루트 권한으로 명령을 실행할 수 있다.

Canonical은 2026-07-21에 보안 공지를 게시했다. Ubuntu 22.04 LTS, 24.04 LTS, 26.04 LTS가 영향 대상으로 명시됐으며 CVSS 3.1 점수는 7.8이다.

항목 내용
CVE CVE-2026-8933
취약점 유형 로컬 권한 상승
영향 구성 요소 snapdsnap-confine
영향 환경 파일 기능 방식의 snap-confine
공격 전제 로컬 일반 사용자 권한
악용 결과 루트 권한으로 명령 실행
사용자 상호작용 필요 없음
공개일 2026-07-21
CVSS 3.1 7.8 높음

취약 지점

snap-confine은 스냅 애플리케이션을 실행하기 전에 마운트 네임스페이스와 격리 환경을 구성한다. 기존의 사용자 식별자 설정 방식 대신 파일 기능을 사용하는 구성에서는 프로세스의 유효 사용자 식별자가 일반 사용자로 유지된다. 이 때문에 프로세스가 생성한 일부 파일과 디렉터리도 처음에는 해당 사용자 소유가 된다.

sc_bootstrap_mount_namespace()mkdtemp()/tmp/snap.rootfs_XXXXXX 디렉터리를 만든다. 이후 sc_replicate_base_rootfs()가 디렉터리 소유권을 루트로 변경한다. 두 작업 사이에는 일반 사용자가 디렉터리를 제어할 수 있는 구간이 존재한다.

파일 복제 경로에도 같은 문제가 있다. open()으로 파일을 만든 뒤 fchown()으로 소유권을 변경하며, 파일을 여는 과정에서 심볼릭 링크 추적을 막는 O_NOFOLLOW가 사용되지 않았다.

char scratch_dir[] = "/tmp/snap.rootfs_XXXXXX";

if (mkdtemp(scratch_dir) == NULL) {
    /* 오류 처리 */
}

if (chown(scratch_dir, 0, 0) < 0) {
    /* 오류 처리 */
}

int fd = open(full_path, O_CREAT | O_TRUNC, 0644);

if (fchown(fd, 0, 0) < 0) {
    /* 오류 처리 */
}

Qualys가 공개한 분석에서는 다음 흐름이 확인됐다.

  1. 공격자는 임시 디렉터리가 생성된 직후 그 경로에 파일 시스템을 마운트한다.
  2. snap-confine이 수행하는 후속 마운트를 해제해 원래 디렉터리를 다시 노출한다.
  3. 생성될 파일 이름과 같은 심볼릭 링크를 디렉터리 안에 배치한다.
  4. snap-confine의 파일 생성 동작을 특권 경로로 유도한다.
  5. 소유권이 루트로 바뀌기 전에 파일 권한을 변경해 쓰기 권한을 유지한다.

sc_replicate_base_rootfs()의 파일 생성 동작은 이 과정에서 임의 파일 생성 수단이 된다. AppArmor 정책이 일반적인 /etc 쓰기를 차단하지만 /run/udev/**에는 읽기·쓰기 권한이 허용돼 있었다. 공개된 검증에서는 /run/udev/rules.d에 규칙 파일을 만들고 장치 이벤트를 발생시켜 systemd-udevd가 명령을 루트 권한으로 실행하도록 했다.

영향 구성 확인

사용자 식별자 설정 방식의 /usr/lib/snapd/snap-confine만 확인해서는 영향 여부를 판단할 수 없다. Ubuntu 24.04 LTS에서는 /snap/snapd/current/usr/lib/snapd/snap-confine이 파일 기능 방식으로 설치된 사례가 확인됐다.

악용 조건과 영향

원격 요청만으로는 취약점을 실행할 수 없다. 공격자는 대상 호스트에서 일반 사용자 권한으로 프로세스를 실행할 수 있어야 한다.

Canonical 공지의 영향 범위는 Ubuntu 22.04 LTS, 24.04 LTS, 26.04 LTS다. Qualys는 Ubuntu Desktop 24.04 LTS, 25.10, 26.04의 기본 설치에서 파일 기능 방식의 snap-confine과 실제 권한 상승을 확인했다. 사용자 식별자 설정 방식의 snap-confine은 이 취약점의 영향 대상이 아니다.

Ubuntu 릴리스 수정된 snapd 버전
22.04 LTS 2.76+ubuntu22.04.1
24.04 LTS 2.76+ubuntu24.04.1
26.04 LTS 2.76+ubuntu26.04.3

상위 프로젝트의 수정 버전은 snapd 2.76.1이다.

자산 식별

설치된 패키지 버전과 두 위치의 snap-confine을 함께 확인한다.

dpkg-query -W -f='${Package}\t${Version}\n' snapd

for path in \
    /usr/lib/snapd/snap-confine \
    /snap/snapd/current/usr/lib/snapd/snap-confine
do
    if [ -e "$path" ]; then
        stat -c '%A %a %U:%G %n' "$path"
        getcap "$path"
    fi
done

getcap 결과에 기능 집합이 표시되고 stat 결과에 사용자 식별자 설정 비트가 없다면 파일 기능 구성이다. 공개 분석에서 관측된 기능 집합에는 cap_chown, cap_dac_override, cap_fowner, cap_sys_admin 등이 포함됐다.

패키지 소유 관계와 무결성도 확인한다.

dpkg-query -S /usr/lib/snapd/snap-confine
dpkg --verify snapd
snap version

스냅으로 배포된 바이너리는 기존 패키지 경로와 별도로 조사한다. /snap/snapd/current가 가리키는 실제 리비전도 기록한다.

대응

보안 저장소에서 수정된 snapd 패키지를 설치하고 시스템을 재부팅한다.

sudo apt update
sudo apt install --only-upgrade snapd
sudo reboot

재부팅 후 패키지 버전과 바이너리 속성을 다시 확인한다.

dpkg-query -W -f='${Package}\t${Version}\n' snapd

for path in \
    /usr/lib/snapd/snap-confine \
    /snap/snapd/current/usr/lib/snapd/snap-confine
do
    if [ -e "$path" ]; then
        stat -c '%A %a %U:%G %n' "$path"
        getcap "$path"
    fi
done

패키지 관리 시스템 밖에서 복사된 snap-confine이나 별도로 기능이 설정된 실행 파일도 제거 또는 교체 대상에 포함한다.

탐지 포인트

엔드포인트

공개된 공격 흐름에서 직접 나타나는 흔적은 다음과 같다.

  • /tmp/snap.rootfs_ 접두사의 디렉터리에 대한 비정상적으로 빈번한 접근
  • 해당 디렉터리에 대한 사용자 프로세스의 마운트 및 지연 해제 작업
  • fusermount 또는 fusermount3snap-confine의 근접 실행
  • /run/udev/rules.d 아래에 생성된 출처 불명의 규칙 파일
  • 일반 사용자가 생성한 뒤 소유자가 루트로 변경된 쓰기 가능 파일
  • systemd-udevd가 셸이나 예상하지 못한 실행 파일을 자식 프로세스로 생성한 기록
  • snap-confine 실행 직후 루트 권한 프로세스가 생성된 계보

다음 명령은 남아 있는 파일 흔적을 점검하는 데 사용할 수 있다.

find /run/udev/rules.d -maxdepth 1 -type f \
    -printf '%M %u:%g %TY-%Tm-%Td %TH:%TM:%TS %p\n'

find /tmp -maxdepth 1 -type d -name 'snap.rootfs_*' \
    -printf '%M %u:%g %TY-%Tm-%Td %TH:%TM:%TS %p\n'

systemd-udevd의 자식 프로세스와 관련 로그도 확인한다.

journalctl -u systemd-udevd --since '2026-07-21'
ausearch -x snap-confine
ausearch -x fusermount
ausearch -x fusermount3

단일 파일이나 프로세스 이름만으로 악용을 판정하지 않는다. 원래 로그인 사용자, 부모·자식 프로세스, 마운트 작업, 파일 소유권 변경, 설치된 snapd 버전을 같은 시간대에서 비교한다.

서버

중앙 자산 관리에서 다음 항목을 수집한다.

  • Ubuntu 릴리스와 snapd 버전
  • 두 경로에 존재하는 snap-confine의 실제 대상
  • 사용자 식별자 설정 비트와 파일 기능
  • /run/udev/rules.d의 파일 목록, 소유권, 생성 시각
  • fusermountsnap-confine 실행 기록
  • systemd-udevd가 생성한 비정상 자식 프로세스

개발 시스템, 장기 미접속 호스트, 보안 저장소가 비활성화된 호스트도 같은 기준으로 분류한다.

참고 자료