2008-09-16 8 views
18

root 권한없이 chroot jail에 있음을 어떻게 감지 할 수 있습니까? 표준 BSD 또는 Linux 시스템을 사용합니다. 내가 생각한 가장 좋은 점은 "/"에 대한 inode 값을보고 합리적으로 낮은 지 아닌지를 고려하는 것이지만보다 정확한 탐지 방법을 원합니다.내부에서 chroot jail 검색

[edit 20080916 142430 EST] 감옥에있는 사용자를 속이기 위해/boot 및/dev와 같은 것을 복제하는 것이 어렵지 않기 때문에 단순히 파일 시스템을 둘러 보는 것만으로는 충분하지 않습니다.

[edit 20080916 142950 EST] Linux 시스템의 경우/proc에서 예기치 않은 값을 확인하는 것이 타당하지만, 처음에는/proc을 지원하지 않는 시스템은 어떻게됩니까?

+3

참고 [어떻게하면 chroot에서 작동하는지 알 수 있습니까?] (http://unix.stackexchange.com/questions/14345/how-do-i-tell-im-running-in-a- chroot/24248 # 24248) – Gilles

+0

완전히 이식 가능하지 않으며 (suid로만 작동 함) 데비안 기반 시스템에는 기본적으로'ischroot'가 설치되어 있습니다. 참조 : https://manpages.debian.org/jessie/debianutils/ischroot.1.en.html –

답변

14

파일 시스템의 루트 디렉토리 인 경우 /는 항상 2이지만, 전체 파일 시스템 내에서 chroot 될 수 있습니다. chroot (다른 가상화가 아닌) 인 경우 마운트 된 파일 시스템과 마운트 된 파일 시스템을 비교할 수 있습니다. 모든 마운트 포인트가 inode 2인지 확인하십시오.

+8

호기심에서 아이 노드 1을 얻는 방법은 무엇입니까? – Topaz

+6

불량 블록 (historical/legacy) – user10392

+6

리눅스에서/sys와/proc는 모두 inode == 1. devtmpfs는 inode == 3. 멋진 트릭이지만 "실제"파일 시스템에서만 신뢰할 수 있습니다. – SpamapS

3

그런 것들을 예방하는 것은 요점입니다. chroot에서 실행해야하는 코드라면 시작할 때 플래그를 설정하십시오. 해킹하는 경우 해킹 : 알려진 위치에서 몇 가지 일반적인 사항을 확인하고/etc에있는 파일 수,/dev에있는 파일 수를 계산하십시오.

1

나는 그것이 chroot에있는 이유와 그것이 어떤 방법으로 그것을 위장 시켰는지에 달려 있다고 생각한다.

/proc을 확인하면 자동으로 시스템 정보 파일이 생성됩니다. 커널은 루트 파일 시스템에서 이들을 채 웁니다. 그러나 chroot 파일 시스템에 존재하지 않을 수도 있습니다.

루트 파일 시스템의/proc가 chroot의/proc에 바인드 된 경우 해당 정보와 chroot 환경간에 약간의 불일치가있을 수 있습니다./proc/mounts를 확인하십시오.

마찬가지로/sys를 확인하십시오.

+0

/proc을 쉽게 바인딩 할 수 있지만 해당 데이터 내의 불일치는 마스크를 작성하는 것이 번거로울 수 있습니다. 답변을 수락했습니다. – Topaz

+0

실제로,/proc 및 친구가없는 비 리눅스 시스템은 어떨까요? – Topaz

+1

이 질문은 표준 Linux 또는 BSD 시스템을 사용한다고 가정합니다. 내가 아는 한,/proc을 가지고있다. – SpoonMeiser

3

BSD 시스템 (uname -a로 확인)에서 proc가 항상 존재해야합니다./proc/1/exe의 dev/inode 쌍 (해당 경로에 stat를 사용하면 텍스트로 심볼릭 링크를 따르지 않고 기본 훅에 의해 실행되지 않음)이/sbin/init와 일치하는지 확인하십시오.

inode # 2의 루트를 검사하는 것도 좋은 방법입니다.

대부분의 다른 시스템에서 루트 사용자는 fchdir 루트 속임수를 사용하여 훨씬 빨리 찾을 수 있습니다. 그것이 어디든지 간다면 당신은 chroot 감옥에 있습니다.

+0

+1 ../proc/1/root 또는/proc/1/exe의 device + inode는 데비안과 우분투의 여러 프로그램이 그들은 chroot에서 실행되고 있습니다. – SpamapS

+0

'/ sbin/init'이 chroot 환경에 하드 링크되어 있으면 실행중인 것과 동일한 dev/inode를 가지게됩니다 : false negative. 시스템이 부팅 된 이후에'/ sbin/init'이 업그레이드 되었다면 실제 root에서도 다른 dev/inode를 갖습니다 : false positive. – caf

+0

위양성은 루트 inode가 2가 아니어야합니다. 위양성은 극히 드물습니다. – Joshua

4

루트 권한이있는 Linux에서 init 프로세스의 루트 디렉토리가 루트 디렉토리인지 테스트하십시오. /proc/1/root은 항상 /에 대한 심볼릭 링크이지만, 그 다음에는 "마스터"루트 디렉토리로 연결됩니다 (init 프로세스가 chroot되지 않았다고 가정합니다. /proc이 마운트되어 있지 않으면 chroot에 속한다고 확신 할 수 있습니다. init가 최종 부팅 후 업그레이드 된 또는 어지는 주요 루트 파일 시스템에 있고 경우 init이 거기에 하드 연결되어있는 경우 그 chroot로 외부 다를 수 있기 때문에

[ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ] 
# With ash/bash/ksh/zsh 
! [ -x /proc/1/root/. ] || [ /proc/1/root/. -ef/] 

이것은 looking at /proc/1/exe보다 더 정확하다.

루트 권한이없는 경우 /proc/1/mountinfo/proc/$$/mountinfo (간략하게는 filesystems/proc.txt in the Linux kernel documentation에 문서화되어 있음)을 볼 수 있습니다.이 파일은 세계에서 읽을 수 있으며 프로세스의 파일 시스템보기에서 각 마운트 지점에 대한 많은 정보를 포함합니다. 해당 파일의 경로는 독자 프로세스에 영향을주는 chroot에 의해 제한됩니다 (있는 경우). /proc/1/mountinfo을 읽는 프로세스가 글로벌 루트와 다른 파일 시스템으로 chroot되면 (pid 1의 루트가 글로벌 루트라고 가정) /에 대한 항목이 /proc/1/mountinfo에 나타납니다. /proc/1/mountinfo을 읽는 프로세스가 글로벌 루트 파일 시스템의 디렉토리로 chroot되면 /에 대한 항목이 /proc/1/mountinfo에 있지만 다른 마운트 ID로 표시됩니다. 부수적으로, 루트 필드 ($4)는 chroot가 마스터 파일 시스템에있는 곳을 나타냅니다. 다시 말하지만, 이는 Linux에만 해당됩니다.

[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ] 
0

chroot로 입력 한 경우에는 $ debian_chroot 값을 확인할 수 있습니다.

4

당신이 chroot에서하지 않은 경우, /의 아이 노드는 항상 당신은

stat -c %i/

또는

ls -id/

인터 휴식,하지만를 사용하는의는의 경로를 찾을 수 해보자 확인 할 수 있습니다 2. 것 chroot 디렉토리. 어떤 장치에/위치 stat에 질문

stat -c %04D/

첫 번째 바이트 장치의 주요이며, 바이트가 미성년자 않도록. 예를 들어 0802는 major 8, minor 1을 의미합니다./dev를 체크인하면이 장치가/dev/sda2라는 것을 알 수 있습니다. 루트 사용자 인 경우 chroot에 직접 해당 장치를 만들 수 있습니다.

mknode /tmp/root_dev b 8 1 

이제 chroot와 관련된 inode를 찾으십시오. debugfs는 inode 번호를 사용하여 파일 내용을 나열합니다. 나는 그것의 내용을 요청할 수 있습니다 915821. :

sudo debugfs /tmp/root_dev -R 'ls <923960>' 
923960 (12) .  915821 (32) ..  5636100 (12) var 
5636319 (12) lib 5636322 (12) usr 5636345 (12) tmp 
5636346 (12) sys 5636347 (12) sbin 5636348 (12) run 
5636349 (12) root 5636350 (12) proc 5636351 (12) mnt 
5636352 (12) home 5636353 (12) dev 5636354 (12) boot 
5636355 (12) bin 5636356 (12) etc 5638152 (16) selinux 
5769366 (12) srv 5769367 (12) opt 5769375 (3832) media 

재미있는 정보가 .. 항목의 아이 노드입니다 : exemple를 들어, ls -id /는 923960를 반환

sudo debugfs /tmp/root_dev -R 'ls <915821>' 
915821 (12) .    2 (12) .. 923960 (20) debian-jail 
923961 (4052) other-jail 

디렉토리라고 debian-jail 내 chroot 환경의 아이 노드 923960. 그래서 마지막 구성 요소가 dir은 debian-jail입니다. 의 지금은 상위 디렉토리 (아이 노드 2)를 보자 :

sudo debugfs /tmp/root_dev -R 'ls <2>' 
     2 (12) .   2 (12) ..   11 (20) lost+found 1046529 (12) home 
130817 (12) etc 784897 (16) media  3603 (20) initrd.img 
261633 (12) var 654081 (12) usr  392449 (12) sys   392450 (12) lib 
784898 (12) root 915715 (12) sbin 1046530 (12) tmp 
1046531 (12) bin 784899 (12) dev  392451 (12) mnt 
915716 (12) run  12 (12) proc 1046532 (12) boot    13 (16) lib64 
784945 (12) srv 915821 (12) opt  3604 (3796) vmlinuz 

opt라는 디렉토리는 아이 노드 915,821을 가지고 있으며, 아이 노드 (2) 파일 시스템의 루트입니다. 그래서 내 chroot 디렉토리는 /opt/debian-jail입니다. 물론 /dev/sda1은 다른 파일 시스템에 마운트 될 수 있습니다. 이를 확인하려면 lsof를 사용하거나 직접 정보를 선택하십시오 (/proc).

0

나는 Anabilities가이 시나리오를 감지하지 못하는 것처럼 FreeBSD에서 실행되는 감옥과 동일한 정보를 원했습니다.

FreeBSD 11의 FreeNAS 배포판에서는 /proc이 호스트에 마운트되어 있지만 감옥에 있습니다. 일반 FreeBSD에서도 이것이 확실한 가를 알지 못하지만, procfs: Gone But Not Forgotten이 그런 것 같습니다. 어느 쪽이든, 감옥 상태를 감지하기 위해 설치하려고하지 않으려 고하므로 감옥에 있다는 것을 예측할 수있는 확실한 증거는 아닙니다.

나는이 일반적이다 내가 기대 /에 아이 노드 4로 확실히 FreeNAS에서 모든 교도소가 주어진 자신의 파일 시스템 (예 : a ZFS dataset)를 따라서 호스트와 감옥 모두에서 / 노드를 통계를 사용 배제 FreeBSD 11에서.

그래서 0

[[email protected] ~]# procstat 0 
    PID PPID PGID SID TSID THR LOGIN WCHAN  EMUL   COMM   
    0  0  0  0  0 1234 -  swapin -    kernel  
[[email protected] ~]# echo $? 
0 
[[email protected] ~]# jexec guest tcsh 
[email protected]:/ # procstat 0 
procstat: sysctl(kern.proc): No such process 
procstat: procstat_getprocs() 
[email protected]:/ # echo $? 
1 

내가 0 항상 호스트의 커널이 될 것 PID 여기 가정을 만드는 중이라서 및 PID 없을 것 PID에 procstat를 사용했다에 정착 접근 감옥 안에서 0입니다.