2010-09-21 8 views
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; 
} 

Кто-нибудь увидеть какие-либо ошибки в том, что (или даже лучше, знать о инструмент, который делает его избыточным)?

ответ

3
  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 - это, вероятно, инструмент, который вы искали.

+0

1) нормальные значения по умолчанию исключают целый класс ошибок. 5) 'environ' используется' execvp', и я не помню, установлено ли оно по умолчанию. 6): b – BCS

+0

Что касается chrootuid, это не стандартный инструмент и предполагает, что я хочу использовать syslog (а у меня нет, поэтому я не могу использовать его как есть). Учитывая, что я искал, чтобы уйти от a) необходимости установить что-то и b) написать свое, это не имеет никакого преимущества для меня. – BCS

+0

Окружающая среда установлена ​​по умолчанию, AFAIK - эквивалент POSIX envp. Таким образом, вы смешиваете два стандарта кодирования. И я не думаю, что ты сможешь найти что-нибудь лучше. Особенно, что вы хотите приобрести UID/GID перед входом в chroot. –

 Смежные вопросы

  • Нет связанных вопросов^_^