【问题标题】:chroot + execvp + bashchroot + execvp + bash
【发布时间】:2010-09-20 05:55:44
【问题描述】:

更新

知道了!查看我的解决方案(第五条评论)

这是我的问题:

我创建了一个名为“jail”的小型二进制文件,并在 /etc/password 中将其设为测试用户的默认 shell。

这里是--简化的--源代码:

#define HOME "/home/user"
#define SHELL "/bin/bash"
...
if(chdir(HOME) || chroot(HOME)) return -1;
...
char *shellargv[] = { SHELL, "-login", "-rcfile", "/bin/myscript", 0 };
execvp(SHELL, shellargv);

好吧,不管我怎么努力,似乎当我的测试用户登录时,/bin/myscript 永远不会被获取。同样,如果我将.bashrc 文件放在用户的主目录中,它也会被忽略。

为什么要抨击这些人?

--

一些精度,不一定是相关的,但是为了清除cmets中提出的一些观点:

  • 'jail' 二进制文件实际上是 suid,因此可以成功地 chroot()。
  • 我使用 'ln' 来提供适当的二进制文件 - 我的牢房被很好地填充了 :)
  • 问题似乎与 chroot 用户无关...还有一些疏忽。

【问题讨论】:

    标签: bash chroot


    【解决方案1】:

    正如 Jason C 所说,执行后的 shell 不是交互式的。

    如果 shell 接受 -i 表示(并且 bash 确实如此),他的解决方案将强制 shell 进行交互:

    char *shellargv[] = { SHELL, "-i", "-login", ... };
    execvp(SHELL, shellargv);
    

    不过,我想补充一点,如果ARGV[0] 以破折号开头,传统上一个 shell 将充当登录 shell。

    char *shellargv[] = {"-"SHELL, "-i", ...};
    execvp(SHELL, shellargv);
    

    不过,通常 Bash 会自动检测它是否应该以交互方式运行。在您的情况下,它失败可能是因为缺少 /dev/* 节点。

    【讨论】:

      【解决方案2】:

      shell 不是交互式的。尝试将 -i 添加到参数列表中。

      【讨论】:

        【解决方案3】:

        我可以确定自己想要这样做,但如果您还没有这样做,请查看jail chroot projectjailkit 以了解一些用于创建jail shell 的工具。

        【讨论】:

          【解决方案4】:

          当您的用户登录并且他们的 shell 尝试获取此文件时,它已在他们的 UID 下运行。 chroot() 系统调用只能由 root 使用——你需要比这更聪明。

          此外,chroot 到用户的主目录将使他们的 shell 无用,因为(除非他们有很多东西在那里)他们将无法访问任何二进制文件。有用的东西,例如ls

          【讨论】:

            【解决方案5】:

            谢谢你们的帮助,伙计们,

            我想通了:

            我忘了setuid()/setgid(),chroot(),setuid()/setgid(),然后使用execve()传递一个合适的环境

            哦,而且,如果我不向 bash 传递任何参数,它会 source ~/.bashrc

            如果我通过“-l”如果将来源 /etc/profile

            干杯!

            【讨论】:

            • 啊,我(错误地)假设您的 chroot 将所有内容与典型系统放在相同的位置,或者您首先修复了环境。缺少 setuid/gid 不应破坏这一点(尽管它会消除 chrooting 的安全优势)。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-11-06
            • 1970-01-01
            • 1970-01-01
            • 2011-12-30
            • 2021-11-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多