개요
이전 글에서 수행한 실습에서 이어서 진행됩니다.
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