4

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

誰かがその中にバグを見たことがありますか(またはさらに良いことに、それを冗長にするツールを知っていますか)?

4

1 に答える 1

4
  1. とにかく上書きするのに、なぜデフォルトを、、、に割り当てるpathのですか?nameexe
  2. 内から負の値を返さないでくださいmain()。POSIXはその最下位8ビットのみを使用するため、実際の戻り値は不明確になります(つまり、など-1として返され255ます)。
  3. 頼るべきではありませんgetuid(); chroot()機能も動作CAP_SYS_CHROOTします。代わりに、を試してchroot()確認することができますerrno == EPERM
  4. chroot()現在の作業ディレクトリは変更されません。あなたも電話するべきだと思いますchdir()
  5. 割り当ては正確に何をしenviron = envpますか?それはハッキーのようです。
  6. いずれにせよ、より良いエラー報告を追加することができます。

そして最後に、chrootuidはおそらくあなたが探していたツールです。

于 2010-09-23T18:00:11.810 に答える