中存在chroot环境/var/myroot
,攻击者在chroot中以root(EUID 0)身份运行的进程中获得了任意机器代码执行权限。但攻击者控制下的进程并未启用所有功能(仅文件系统功能)。攻击者想要逃避 chroot,并在/etc/passwd
chroot 之外附加一行。他怎么能做到呢?
已制定以下安全措施:
- 为了防止chdir("..") chroot 转义技术,使用进入 chroot 环境枢轴_根(2)而不是chroot(2)。参见jchroot.c如何做到这一点。
- 当 chroot 中的第一个进程启动时,它没有打开任何指向 chroot 外部的文件描述符。
- chroot 中的每个进程至多拥有
CAP_CHROOT
、CAP_FOWNER
、CAP_FSETID
、CAP_CHOWN
、CAP_DAC_OVERRIDE
、CAP_DAC_READ_SEARCH
、能力CAP_SETGID
,CAP_SETUID
并且无法获得其他进程。简而言之,攻击者能够绕过权限检查等进行任意文件系统读取和写入,但他无法向进程发送任意信号 (CAP_KILL
) 或在网络上发送任意数据包 (CAP_NET_RAW
) 或重新启动系统 (CAP_SYS_BOOT
) 或修改内存中的任意字节 (CAP_SYS_RAWIO
) 等。 unshare(CLONE_NEWUSER)
曾是不是调用时,chroot 进程的 UID 0 与 chroot 之外的 UID 0 相同。unshare(CLONE_NEWPID)
被调用,因此攻击者看不到在 chroot 之外运行的进程。unshare(CLONE_NEWNS)
在设置 chroot 时被调用,并且以下文件系统可见:/var/chroot
可见为/
,重新安装为MS_NODEV
和MS_NOSUID
。 (MS_NODEV
使用 以便攻击者无法写入/dev/sda
,MS_NOSUID
使用 以便攻击者无法从文件功能中获取新功能。)- proc 文件系统可见
/proc
,并删除了以下路径(通过使用绑定挂载将空文件放在那里):/proc/kcore
,/proc/latency_stats
,/proc/timer_list
,/proc/timer_stats
,/proc/sched_debug
,/proc/scsi
,并且以下路径设为只读:/proc/asound
,/proc/bus
,/proc/fs
,/proc/irq
,/proc/sys
,/proc/sysrq-trigger
。 - 未安装 sysfs 文件系统。
- 未安装 devpts 文件系统。
/dev
tmpfs 文件系统以without方式挂载MS_NODEV
,并预填充了一些设备。- 从 chroot 中看不到其他文件系统。
- 块设备节点在 chroot 中不可用(并且
CAP_MKNOD
不可用,因此攻击者无法创建它们)。 - 仅以下字符设备节点可用:
/dev/null
、/dev/zero
、/dev/full
、/dev/random
、/dev/urandom
、/dev/tty
、/dev/ptmx
(与 相同/dev/pts/ptmx
)和 a/dev/pts/X
(在 chroot 之外使用的终端)。 - 如果攻击者
ioctl(..., TIOCSTI, ...)
在 上调用(模拟键入的输入)/dev/pts/X
并退出 chroot,则 chroot 外部的交互式 shell 可能会读取这些模拟字节,因此模拟这一点可能很有用:sudo sh -c 'echo pwned::0:0:pwned:/:/bin/bash >>/etc/passwd'
。为了防止此操作成功,在 chroot 中创建进程的父进程将在返回 shell 之前刷新所有终端输入。
仅供参考我的用例如下:有一个 Debian 系统/var/myroot
(可能由反引导程序),并且我希望能够在那里安装不受信任的软件包,而不会使主机系统受到通过在恶意软件包中安装脚本的攻击。不幸的sudo chroot /var/myroot apt-get install MALICIOUS-PACKAGE
是不够安全,因为例如包的安装脚本可以创建块设备节点/dev/sda1
,/etc/passwd
在那里找到文件并修改它,从而有可能从 chroot 中逃脱。我现在正在探索哪些其他选项足够安全,如上所述的强化 chroot 是候选者之一。 (在这个问题中,我不是在寻找其他候选人。)在这个问题中,我想了解它的安全性。
仅供参考 有一个命令行工具chw00t逃离 chroot。关于其技术:
- -0 在这里不起作用,因为枢轴_根(2)被使用了。
- -1 不起作用,因为没有文件描述符指向可用的 chroot 之外。
- -2 可能有效,我需要检查它是否适用枢轴_根(2)。
- -3 不起作用,因为取消共享(CLONE_NEWPID)被称为。
- -4 不起作用,因为块设备不可用。
- -5 可能有效,我需要检查它是否适用枢轴_根(2)。
- -6 不起作用,因为取消共享(CLONE_NEWPID)被称为。
- -7 不起作用,因为没有文件描述符指向可用的 chroot 之外。