Как правильно перейти на более низкий уровень привилегий с помощью setuid?

Я пишу программу на C, которая привязывается к порту < 1024. После этого я бы хотел, чтобы она работала с привилегиями не-root.

Я знаю, что мне нужно вызвать setuid(), но с каким аргументом? UID варьируются от системы к системе.

2 ответа

Решение

Ты можешь использовать getpwnam() посмотреть uid/gid пользователя по имени:

#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>

int changepriv(const char *user) {
  struct passwd *pw;
  int rv;

  pw = getpwnam(user);
  if (!pw)
    return -1;

  rv = setgid(pw->pw_gid);
  if (rv == -1)
    return -2;

  rv = setuid(pw->pw_uid);
  if (rv == -1)
    return -3;

  return 0;
}

Больше, чем вы хотели бы знать http://www.eecs.berkeley.edu/~daw/papers/setuid-usenix02.pdf

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