8

更新

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

这是我的问题:

我创建了一个名为“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' 来提供适当的二进制文件 - 我的牢房被很好地填充了 :)
  • 问题似乎与 chrooting 用户无关……还有其他事情是疏忽的。
4

5 回答 5

4

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

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

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

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

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

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

于 2008-10-31T18:56:49.667 回答
2

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

于 2008-10-31T19:05:18.620 回答
2

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

于 2008-10-31T18:36:24.467 回答
1

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

我想到了:

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

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

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

干杯!

于 2008-10-31T21:23:21.493 回答
1

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

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

于 2008-10-31T19:02:54.770 回答