有没有人在这个程序中看到任何问题

时间:2010-09-21 01:06:34

标签: posix systems-programming

this question about chroot没有得到我喜欢的答案之后,我开始推出自己的解决方案:

#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;
}

有没有人看到任何错误(甚至更好,知道一个让它变得多余的工具)?

1 个答案:

答案 0 :(得分:4)

  1. 为什么要将默认值分配给pathnameexe,如果您仍然覆盖它们?
  2. 您不应在main()内返回负值。它使实际返回值不清楚,因为POSIX仅使用它的8个最低有效位(即-1返回为255等。)
  3. 你不应该依赖getuid(); chroot()也可以使用CAP_SYS_CHROOT。相反,您可以尝试chroot()并检查是否errno == EPERM
  4. chroot()不会更改当前的工作目录;我想你也应该致电chdir()
  5. environ = envp分配究竟做了什么?这看起来很糟糕。
  6. 无论如何,您可以添加更好的错误报告。
  7. 最后,chrootuid可能是您正在寻找的工具。