如何在没有root权限的情况下检测到chroot监狱?假设标准的BSD或Linux系统.我想出的最好的方法是查看"/"的inode值并考虑它是否相当低,但我想要一种更准确的检测方法.
[edit 20080916 142430 EST]
简单地查看文件系统是不够的,因为复制诸如/ boot和/ dev之类的东西以欺骗被监禁的用户并不困难.
[edit 20080916 142950 EST]
对于Linux系统,在/ proc中检查意外值是合理的,但是那些首先不支持/ proc的系统呢?
如果它是文件系统的根目录,则/的inode将始终为2,但您可能在一个完整的文件系统中被chroot.如果它只是chroot(而不是其他一些虚拟化),你可以运行mount并将安装的文件系统与你看到的相比较.验证每个安装点是否具有inode 2.
如果您不在chroot中,/的inode将始终为2.您可以检查使用
stat -c %i /
要么
ls -id /
Interresting,但让我们试着找到chroot目录的路径.询问stat
位于哪个设备上:
stat -c %04D /
第一个字节是设备的主要字节,最小字节是次要的.例如,0802表示主要8,次要1.如果您检入/ dev,您将看到此设备是/ dev/sda2.如果您是root用户,可以直接在chroot中创建对应的设备:
mknode /tmp/root_dev b 8 1
现在,让我们找到与我们的chroot相关联的inode.debugfs允许使用inode编号列出文件的内容.例如,ls -id /
返回923960:
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
有趣的信息是..
入门名称:915821.我可以问它的内容:
sudo debugfs /tmp/root_dev -R 'ls <915821>' 915821 (12) . 2 (12) .. 923960 (20) debian-jail 923961 (4052) other-jail
调用的目录debian-jail
有inode 923960.所以我的chroot目录的最后一个组件是debian-jail
.我们现在看一下父目录(inode 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
有inode 915821,inode 2是文件系统的根目录.所以我的chroot目录是/opt/debian-jail
.当然,/dev/sda1
可能会安装在另一个文件系统上.您需要检查(使用lsof或直接挑选信息/proc
).
在具有root权限的Linux上,测试init进程的根目录是否是您的根目录。尽管/proc/1/root
它始终是的符号链接/
,但其后会指向“主”根目录(假设init进程未进行chroot,但几乎从未这样做)。如果/proc
未安装,则可以打赌您位于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 / ]
这比查看/proc/1/exe
更为精确,因为如果init
从上次启动以来已升级chroot,或者如果chroot在主根文件系统上并且init
在其中进行了硬链接,则在chroot 之外可能会有所不同。
如果您没有root权限,则可以查看/proc/1/mountinfo
和/proc/$$/mountinfo
(简要记录在filesystems/proc.txt
Linux内核文档中)。该文件是世界可读的文件,并且在文件系统的进程视图中包含许多有关每个安装点的信息。该文件中的路径受chroot限制,该chroot影响读取器进程(如果有)。如果将进程读取/proc/1/mountinfo
更改为与全局根不同的文件系统(假设pid 1的根为全局根),则不会在其中/
显示任何条目/proc/1/mountinfo
。如果将进程读取/proc/1/mountinfo
更改为全局根文件系统上的目录,则的条目将/
出现在中/proc/1/mountinfo
,但具有不同的装载ID。顺便说一下,根字段($4
)表示chroot在其主文件系统中的位置。同样,这是特定于Linux的。
[ "$(awk '$5=="/" {print $1}'