Search

pivot_root와 탈옥

Tags
unix
pivot_root
root
jail-breaking
Created
2024/08/30 18:53
Created time
2024/08/30 09:52
category
unix

개요

chroot에서 발생한 탈옥 문제를 해결하고, 탈옥 불가능한 디렉토리 격리 방법을 기술
이전 글에서 수행한 실습에서 이어서 진행됩니다.

pivot_root

기존의 chroot는 주어진 경로를 루트로 단순히 인식시키는 형태로 동작했다면, pivot_root는 근본적으로 루트 파일 시스템의 마운트 포인트 자체를 바꿔버리면서 탈옥이 불가능하게 방어
매뉴얼 기술을 참고
pivot_root() changes the root mount in the mount namespace of the calling process. More precisely, it moves the root mount to the directory put_old and makes new_root the new root mount. The calling process must have the CAP_SYS_ADMIN capability in the user namespace that owns the caller's mount namespace.
pivot_root의 실행은 꼭 마운트 포인트에서 진행 필요

새로운 루트 구성

# 이전 실습에서의 proc을 언마운트 umount /tmp/new_root/proc # proc 디렉토리 삭제 rm -rf /tmp/new_root/proc
Shell
복사
chroot로 이용하던 기존 new_root의 일부 파일을 삭제
new_root의 다른 파일들은 그대로 pivot_root에서 이용
# /tmp 경로 이동 cd /tmp # 마운트 네임스페이스를 격리하여 /bin/bash를 실행 unshare --mount /bin/bash # /tmp/pivot_root 경로를 생성 mkdir pivot_root # tmpfs 파일 시스템을 생성하여 pivot_root에 마운트 mount -t tmpfs none pivot_root # /tmp/new_root에서 사용하던 파일들을 복사 cp -r /tmp/new_root/* pivot_root/ # 기존 루트를 옮길 put_old 경로 생성 mkdir pivot_root/put_old # 디렉토리 구조 확인 tree pivot_root # 새로운 루트가 될 pivot_root로 이동 cd pivot_root # pivot_root 실행 pivot_root . put_old # 새로운 루트로 전환되었는데, 프롬프트의 경로는 갱신 되지 않은 상태 ls . # / 경로의 디렉토리 목록을 확인했을 때 현재 경로와 동일한 결과임을 확인 ls / # / 경로로 이동 cd / # 다시 디렉토리 목록을 확인, 확실히 루트로 전환됨을 확인 ls # 루트 파일 시스템이 새로운 루트로 바뀜에 따라 기존에 사용되던 루트 파일 시스템은 put_old에 존재함을 확인 ls put_old
Shell
복사

탈옥 시도

# 탈옥을 위한 파일을 실행 ./jail_break
Shell
복사
루트 자체의 마운트를 바꾼 것이기 때문에 chroot 때처럼 탈옥되는 현상은 없음

결론

탈옥을 막기 위해선 chroot가 아닌 pivot_root를 이용
탈옥은 막았지만 도커 컨테이너와는 사뭇 다른 상태인데, 이는 여러 자원들이 격리되지 않은 상태이기 때문
격리는 unshare와 lsns 명령어들을 이용하게 되는데, 네임스페이스에 해당되는 아래 6 타입을 격리하면 도커 컨테이너와 동일한 형태로 구성 가능
mount
uts
ipc
pid
net
user