AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 492607
Accepted
pts
pts
Asked: 2019-01-05 16:46:57 +0800 CST2019-01-05 16:46:57 +0800 CST 2019-01-05 16:46:57 +0800 CST

如何在文件系统中在 Linux 上使用 chdir("..") 创建一个 root 无法逃脱的 chroot?

  • 772

我/var/mychoot在与 相​​同的文件系统上有一个目录/,并且我已将程序启动/var/mychroot/prog为sudo chroot /var/mychroot /prog,因此程序以 EUID 0 运行。

如果程序执行chdir("..") 转义技术,则它能够转义 chroot 并查看/. (我已经在 Linux 4.18 上验证了这一点。)

我想阻止这样的逃跑。事实上,我想防止各种 chroot 转义,但在这个问题中,我只对如何在现代 Linux 系统上防止chdir("..") 转义技术感兴趣。为此,我正在寻找chroot(2)系统调用的替代方案。

我找到了 2 个解决方案:pivot_root和MS_MOVE,但它们仅在/var/mychroot是挂载点时才有效,因此如果/var/mychroot只是/文件系统中的子目录,它们就会失败。在这种情况下还有其他解决方案吗?

我想避免使用技术LD_PRELOAD(因为LD_PRELOAD不影响静态链接的可执行文件),使用ptrace(2)的技术(因为这样我就无法strace在 chroot 中运行,而且ptrace(2)也很难正确处理:进程将崩溃或挂起)和真正的虚拟化(例如 Xen 或 KVM 或 QEMU;因为性能开销和不太灵活的内存配置)。

回顾一下,我需要:

  • chroot(2)系统调用的替代方案,
  • root 可以限制以 root 身份运行的进程(EUID 0),
  • 到文件系统的子目录/,
  • 这可以防止chdir("..") 转义技术,
  • 并且不使用LD_PRELOAD或
  • ptrace(2)或
  • 虚拟化(例如 Xen、KVM 或 QEMU),
  • 它运行在现代 Linux 系统上,
  • 带有未打补丁的内核。

它存在吗?

linux chroot
  • 2 2 个回答
  • 3950 Views

2 个回答

  • Voted
  1. Best Answer
    filbranden
    2019-01-05T23:51:19+08:002019-01-05T23:51:19+08:00

    为了防止chdir("..")您提到的特定逃生技术,您可以简单地放弃在chroot(2)您自己 chroot 后再次执行的能力/var/mychroot。转义技术需要再次调用chroot(),因此阻止它足以阻止它工作。

    您可以使用 Linux 功能来做到这一点,方法是删除CAP_SYS_CHROOT需要chroot(2)可用的功能。

    例如:

    outside# chroot /var/mychroot
    inside# capsh --drop=cap_sys_chroot --
    inside# ./escape_chroot
    chroot(baz): Operation not permitted
    

    (chroot 中的第二个提示符来自一个由 . 生成的 shell capsh。你可以让它运行另一个命令,例如capsh --drop=cap_sys_chroot -- -c 'exec ./escape_chroot',


    但是更好的技术是只使用pivot_root,因为它可以防止许多其他可能chroot(2)无法防止的漏洞。

    您提到它仅在/var/mychroot是挂载点时才有效,但是您可以通过简单地将挂载绑定到自身来使其成为挂载点。

    请注意,您需要创建一个挂载命名空间以用于pivot_root创建监狱,否则它将尝试更改文件系统中所有进程的根目录,这很可能不是您想要的...

    所以整个序列是:

    outside# unshare -m
    outside# mount --bind /var/mychroot /var/mychroot
    outside# cd /var/mychroot
    outside# mkdir old_root
    outside# pivot_root . old_root
    limbo# exec chroot .
    inside# umount /old_root
    

    (同样,这些命令中的许多都在生成新的 shell。unshare这样做,chroot本身也是如此。您可以通过将命令作为额外参数传递来解决这些问题。在某些情况下,您可能希望传递sh -c '...'完整的脚本。)

    在这一点上,你pivot_root在一个单独的挂载命名空间的监狱里,事实上它/var/mychroot只是原始根目录的一个目录(而不是一个单独的设备或循环设备的挂载)并没有真正阻止它工作,由于绑定安装到自身。

    运行转义码,你会看到监狱按预期工作(即使转义码声称不是这样):

    inside# touch /inside_jail
    inside# ./escape_chroot
    Exploit seems to work. =)
    inside# ls -ld /inside_jail /old_root
    -rw-r--r--.  1 0 0    0 Jan  5 23:45 /inside_jail
    dr-xr-xr-x. 20 0 0 4096 Jul  5 23:45 /old_root
    

    如您所见,仍然在监狱中......漏洞利用代码有点天真,并假设只要操作(chroot,chdir)成功,就足以逃离监狱,事实并非如此...... .

    所以考虑使用这种技术来创建一个优于chroot并且不需要使用 Linux 功能来阻止其中的操作的监狱(例如创建额外chroot的 s,这实际上可能对您实际尝试运行的内容有用或需要)监狱。)

    • 6
  2. sourcejedi
    2019-01-06T02:14:01+08:002019-01-06T02:14:01+08:00

    它们仅在 /var/mychroot 是挂载点时才有效,因此如果 /var/mychroot 只是 / 文件系统中的子目录,它们将失败。

    您可以将任何目录设置为挂载点:mount --rbind /var/mychoot /var/mychoot.

    这一步 - 以及您需要的其他步骤 - 在这里介绍:

    如何使用 Linux 命名空间执行 chroot?

    其实我想防止各种chroot逃逸

    将上述内容与用户命名空间结合起来。

    或者,seccomp。例如,这就是 Docker 阻止包含进程调用mount()的方式。(当您第二次挂载块设备时,您将获得该文件系统的第二个视图,这或多或少算作逃逸)。复制 Docker 允许的系统调用列表 - root 有很多不同的转义方式。

    https://docs.docker.com/engine/security/seccomp/

    https://github.com/moby/moby/blob/master/profiles/seccomp/default.json

    • 4

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve