3
После не получения ответа я любил для 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) нормальные значения по умолчанию исключают целый класс ошибок. 5) 'environ' используется' execvp', и я не помню, установлено ли оно по умолчанию. 6): b – BCS
Что касается chrootuid, это не стандартный инструмент и предполагает, что я хочу использовать syslog (а у меня нет, поэтому я не могу использовать его как есть). Учитывая, что я искал, чтобы уйти от a) необходимости установить что-то и b) написать свое, это не имеет никакого преимущества для меня. – BCS
Окружающая среда установлена по умолчанию, AFAIK - эквивалент POSIX envp. Таким образом, вы смешиваете два стандарта кодирования. И я не думаю, что ты сможешь найти что-нибудь лучше. Особенно, что вы хотите приобрести UID/GID перед входом в chroot. –