在没有得到我喜欢的答案后这个关于 chroot 的问题 https://stackoverflow.com/questions/3737008/how-run-in-a-chroot-jail-not-as-root-and-without-sudo,我去推出了自己的解决方案:
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>
extern char **environ;
int main(int argc, char** argv, char** envp) {
char* path = "/";
char* name = "nobody";
char* exe = "/bin/false";
struct passwd *pass;
if(argc < 4) { printf("Need more args: username chroot exe args...\n"); return 1; }
name = argv[1];
path = argv[2];
exe = argv[3];
if(!(pass = getpwnam(name))) { printf("Unknown user %s", name); return 2; }
if(chroot(path)) {
if(errno == EPERM) { printf("chroot not allowed\n"); return 3; }
printf("chroot failed\n");
return 4;
}
chdir("/");
if(setgid(pass->pw_gid)) { printf("setgid failed: %d\n", pass->pw_gid); return 5; }
if(setuid(pass->pw_uid)) { printf("setuid failed: %d\n", pass->pw_uid); return 6; }
environ = envp;
execvp(exe, argv + 3);
printf("exec of %s failed\n", exe);
return 7;
}
有没有人看到其中的任何错误(或者更好的是,知道有一个工具可以使它变得多余)?
- 为什么要指定默认值
path
, name
, exe
,如果你还是覆盖它们呢?
- 您不应该从内部返回负值
main()
。它使实际返回值不清楚,因为 POSIX 仅使用它的 8 个最低有效位(即-1
返回为255
, etc.).
- 你不应该依赖
getuid()
; chroot()
会工作CAP_SYS_CHROOT
能力也。相反,你可以尝试chroot()
并检查是否errno == EPERM
.
-
chroot()
不改变当前工作目录;我想你应该打电话chdir()
too.
- 什么是
environ = envp
作业究竟是做什么的?看起来很老套。
- 无论如何,您都可以添加更好的错误报告。
最后,chrootuid http://ftp.porcupine.org/pub/security/index.html#software可能是您正在寻找的工具。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)