Как вернуться к исходному состоянию / пользователю после setuid()?

У меня есть программа для запуска с правами суперпользователя, и во время выполнения эта программа будет выполнять несколько действий от имени разных пользователей, поэтому я хотел использовать серию setuid (). Но я обнаружил, что после setuid(user1) я становлюсь user1 и, следовательно, не имею права делать setuid(user2).

Как я могу вернуться к root, чтобы я мог сделать setuid(user2)?

Благодарю.

4 ответа

Решение

Использование forkпусть ребенок setuid и выполнять любые действия, которые необходимо выполнить как второй пользователь. Корневой родитель ожидает ребенка и продолжается, когда ребенок завершил выполнение.

childpid = fork();
if (childpid < 0) {
    // fork failed
} 
if (childpid == 0) {
  // Child
  setuid(user1);
  prepareUser1();  // Do some stuff as user1.
  exit(0);         // Done as user1
} else {
  // parent: wait for child to finish
  waitpid(childpid);
}
// Parent continues as root...

Вы не можете, Читайте мужчину: setuid

Но вы можете попробовать chmod ваш файл, тогда вы сможете вызвать setuid(0), чтобы вернуться в качестве первого uid

setuid говорит следующее:

программа set-user-ID-root, желающая временно отбросить привилегии root, принять личность пользователя без полномочий root, а затем восстановить привилегии root, не может использовать setuid(). Вы можете сделать это с помощью seteuid(2)

Это означает, что вы не можете использовать setuid() стать пользователем root, поскольку вы непривилегированный пользователь. Вы должны использовать seteuid(), чтобы стать пользователем root.

Попробуйте этот пример программы использовать seteuid и изменить привилегии.

Ты не можешь. По замыслу, когда вы отбрасываете привилегии root, вы не можете получить их обратно

Страница man говорит:

Если пользователь является пользователем root или программа настроена как user-ID-root, необходимо соблюдать особую осторожность. Функция setuid() проверяет эффективный идентификатор пользователя вызывающей стороны, и, если это суперпользователь, все идентификаторы пользователя, связанные с процессом, устанавливаются в uid. После того, как это произошло, программа не может восстановить привилегии root.

Другие вопросы по тегам