여기서 내가 한 것은 init
프로세스 의 루트 (PID 1)가 현재 프로세스의 루트와 같은지 테스트하는 것입니다. 하지만 /proc/1/root
항상에 대한 링크입니다 /
(하지 않는 init
자체가 chroot에,하지만 그게 내가 약을 신경 경우이 아니다)는 "마스터"루트 디렉토리에 이르게 다음,. 이 기술은 데비안의 일부 유지 보수 스크립트에서 사용됩니다 (예 : chroot에서 설치 후 udev 시작을 건너 뛰는 등).
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(이것은 chroot
chroot 된 프로세스가 루트 액세스 권한을 가진 경우 보안에 쓸모없는 이유의 또 다른 예입니다 . 루트가 아닌 프로세스는 읽을 수 없지만 PID 1234가 동일한 프로세스로 실행중인 프로세스가있는 경우 /proc/1/root
따를 수 있습니다 /proc/1234/root
사용자.)
루트 권한이없는 경우에, 당신은 볼 수 /proc/1/mountinfo
와 /proc/$$/mountinfo
(에 설명 간단히 filesystems/proc.txt
리눅스 커널 문서에 ). 이 파일은 세계적으로 읽을 수 있으며 프로세스의 파일 시스템보기에서 각 마운트 지점에 대한 많은 정보를 포함합니다. 해당 파일의 경로는 독자 프로세스 (있는 경우)에 영향을 미치는 chroot에 의해 제한됩니다. 프로세스 읽기 /proc/1/mountinfo
가 전역 루트와 다른 파일 시스템으로 chroot 된 경우 (pid 1의 루트가 글로벌 루트라고 가정)에 대한 항목이 /
나타나지 않습니다 /proc/1/mountinfo
. 프로세스 읽기 /proc/1/mountinfo
가 글로벌 루트 파일 시스템의 디렉토리에 chroot 된 경우에 대한 항목이 /
표시 /proc/1/mountinfo
되지만 마운트 ID가 다릅니다. 또한 루트 필드 ($4
)는 chroot가 마스터 파일 시스템에서 어디에 있는지 나타냅니다.
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
이것은 순수한 리눅스 솔루션입니다. 충분히 비슷한 다른 유닉스 변종에 일반화 할 수 있습니다 /proc
(Solaris는 비슷 /proc/1/root
하지만 그렇지는 않습니다 mountinfo
).