答案1
它不是必要的,这是一种方法。
通过更改根目录,您将使系统组件所做的假设无效。
/bin/su
假设用户数据库位于/etc/passwd
/中/etc/shadow
,libc
(或它链接到的任何库)位于某个固定位置,/lib
普通用户无法修改。
如果您能够创建不同的文件系统布局,其中/bin/su
可以运行相同的命令,但可以随意修改不同的命令,那么您可以做任何事情(如/etc/passwd
使用或可以使用(可能间接)来验证用户,并运行 libc 中的代码)。libc
su
/etc/passwd
现在,有了这种方法,拥有CAP_CHROOT
并不是你唯一需要的东西。你还需要对文件系统上的目录具有写权限(因为硬链接只能完成之内一个给定的文件系统),至少有一个动态链接的 setuid-root 可执行文件。
系统分区没有用户可写区域(甚至是只读区域)的系统并不少见。文件系统的用户可写区域挂载有标志也很常见nosuid
。许多系统还禁止硬链接不属于您的文件(fs.protected_hardlinks
例如,请参阅 Linux 3.6+ 上的 sysctl)。
但您不需要在 chroot 监狱内硬链接 setuid 可执行文件。您还可以这样做:
chdir("/");
chroot("/tmp/myjail");
execl("bin/su", "su", 0);
因为即使进程的根目录被更改chroot
,当前工作目录之后仍然可用,即使该/
目录和bin/su
从那里解析的目录不可用里面监狱。并且/bin/su
仍然会在你的监狱中寻找ld.so
,/etc/passwd
或 libc 因为它们是通过绝对路径访问的,所以相对于改变根目录。让当前工作目录或任何文件描述符在监狱外的文件上保持打开状态,将为您提供一扇离开监狱的门。