chroot + execvp + bash

时间:2008-10-31 18:32:50

标签: bash chroot

更新

知道了!请参阅我的解决方案(第五条评论)

这是我的问题:

我创建了一个名为“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文件放在用户的主目录中,它也会被忽略。

为什么bash会打扰这些家伙?

-

一些精确性,不一定相关,但要清除评论中提出的一些观点:

  • 'jail'二进制文件实际上是suid,因此允许它成功地chroot()。
  • 我用'ln'来制作合适的二进制文件 - 我的jail单元很好地填充了:)
  • 这个问题似乎与chroot用户无关......还有其他事情是疏忽。

5 个答案:

答案 0 :(得分:4)

正如Jason C所说,exec'ed 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/*个节点。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

我可以确定自己想要这样做,但是如果你还没有,请查看jail chroot projectjailkit以获取创建jail shell的工具。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

感谢您的帮助,伙计们,

我明白了:

我忘了 setuid()/ setgid(),chroot(),setuid()/ setgid()返回,然后使用execve()传递适当的环境

哦,如果我没有将参数传递给bash,它将会提供〜/ .bashrc

如果我传递“-l”,如果要提供 / etc / profile

干杯!