Кто-нибудь видит какие-либо проблемы в этой программе - PullRequest
4 голосов
/ 21 сентября 2010

После того, как я не получил ответ, который мне понравился за этот вопрос о 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 Ответ

4 голосов
/ 23 сентября 2010
  1. Почему вы присваиваете значения по умолчанию path, name, exe, если вы их все равно перезаписываете?
  2. Не следует возвращать отрицательные значения из main().Это делает фактическое возвращаемое значение неясным, поскольку POSIX использует только 8 младших значащих битов (то есть -1 возвращается как 255 и т. Д.).
  3. Вы не должны полагаться на getuid();chroot() тоже будет работать CAP_SYS_CHROOT.Вместо этого вы можете попробовать chroot() и проверить, не * errno == EPERM.
  4. chroot() не меняет текущий рабочий каталог;Я думаю, вам также следует позвонить chdir().
  5. Что именно делает environ = envp назначение?Это кажется хакерским.
  6. В любом случае, вы можете добавить более качественные отчеты об ошибках.

И, наконец, chrootuid , вероятно, инструмент, который вы искали.

...