当攻击者只能使用文件功能时,如何逃离 Linux 上强化的 chroot?

当攻击者只能使用文件功能时,如何逃离 Linux 上强化的 chroot?

中存在chroot环境/var/myroot,攻击者在chroot中以root(EUID 0)身份运行的进程中获得了任意机器代码执行权限。但攻击者控制下的进程并未启用所有功能(仅文件系统功能)。攻击者想要逃避 chroot,并在/etc/passwdchroot 之外附加一行。他怎么能做到呢?

已制定以下安全措施:

  • 为了防止chdir("..") chroot 转义技术,使用进入 chroot 环境枢轴_根(2)而不是chroot(2)。参见jchroot.c如何做到这一点。
  • 当 chroot 中的第一个进程启动时,它没有打开任何指向 chroot 外部的文件描述符。
  • chroot 中的每个进程至多拥有CAP_CHROOTCAP_FOWNERCAP_FSETIDCAP_CHOWNCAP_DAC_OVERRIDECAP_DAC_READ_SEARCH、能力CAP_SETGIDCAP_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_NODEVMS_NOSUID。 (MS_NODEV使用 以便攻击者无法写入/dev/sdaMS_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 文件系统。
    • /devtmpfs 文件系统以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 之外。

相关内容