2016-08-23 2 views
1

Я пишу программу, которую пользователи могут вызывать для монтирования каталогов в/с помощью sshfs. Вот основная схема, с обработкой ошибок и шаблонной опущено:Детский процесс требует seteuid для root, родительский не

uid_t euid, ruid; 

void mountDir(char *dirname, char *hostname){ 
    childPid = fork(); 
    if(childPid == 0){ 
     char *sshfsArgs[6] = {"/usr/bin/sshfs", hostName, /*Other args*/}; 
     seteuid(euid); 
     execv(sshfsArgs[0], sshfsArgs); 
     //I want to drop my setuid permissions with seteuid(ruid), 
     //but execv doesn't return. 
    }else{ //I'm the parent process. 
     //I don't want to have root permissions now. 
     wait(childPid); 
    } 
} 


void main(int argc, char **argv){ 
    ruid = getuid(); 
    euid = geteuid(); 
    seteuid(ruid); //Drop the root permissions. 
    char **hostList = {"bulb.example.com", "char.example.com", argv[1]}; 
    char * hostName = pickHost(hostList); //Pings them and picks one that responds. 
    mountDir("/net/home", hostName); 
    mountDir("/net/projects", hostName); 
} 

Опять же, обильная проверкой ошибки опущены. Я хочу иметь права root только при запуске sshfs. Есть несколько примеров исключения seteuid привилегий перед вызовом fork(), но здесь я хочу получить их только в дочернем процессе и потерять их сразу после execv. Как мне это сделать безопасно? Что происходит, когда дочерний процесс выполняет команду seteuid? Получает ли родительский процесс права root?

ответ

2

То, как вы справляетесь с этим сейчас, является правильным.

Первое, что нужно сделать, это сбросить права root, поэтому в этом случае это безопасно.

После fork родитель ждет ребенка, а ребенок запускается seteuid(euid);. Таким образом, теперь ребенок работает с привилегиями root (так как там выполняется seteuid), но родительский нет. Затем ребенок вызывает execv для запуска sshfs с привилегиями root.

seteuid звонок в дочерний элемент не влияет на родителя, поскольку они являются отдельными процессами (хотя они работают с тем же кодом до execv).

С execv не возвращается, нет необходимости снова отбрасывать привилегии. Когда заканчивается sshfs, этот процесс заканчивается. Если execv не работает, вы должны отказаться от привилегий и распечатать сообщения об ошибках перед вызовом _exit.

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

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