Как использовать setuid () от пользователя root, чтобы стать пользователем, с возможностью позже снова стать пользователем root? - PullRequest
11 голосов
/ 16 февраля 2010

Я пытаюсь сделать что-то безопасное, и у меня есть программа, которая должна запускаться от имени пользователя root, чтобы отбросить свои привилегии, когда они им не нужны.Это хорошо работает, если я chmod мой бинарный файл с битом SUID и делаю его принадлежащим root, как теперь у меня UID = некоторый пользователь и EUID = root, поэтому я могу использовать seteuid(0) и seteuid(getuid()), чтобы соответственно повыситьи удалите права администратора.

Но если я использую sudo вместо установки SUID, тогда UID == EUID == 0, и поэтому вызов seteuid(getuid()) не будет иметь никакого эффекта.И я не могу просто изменить UID на какое-то значение от какого-то случайного пользователя, так как на справочной странице setuid() четко указано, что если она вызывается из программы, работающей от имени пользователя root, вы теряете привилегии навсегда, без надежды наполучить их обратно.

Итак, как заставить программу временно потерять свои привилегии при запуске с использованием sudo?

Ответы [ 4 ]

10 голосов
/ 16 февраля 2010

seteuid(some random uid) чтобы сбросить привилегии, seteuid(0) чтобы вернуть их, при запуске как root.

6 голосов
/ 16 февраля 2010

Кажется, что seteuid (x) должен работать, чтобы сбрасывать и повторно поднимать privs ...

$ cat > t12.c
#include <stdio.h>
#include <unistd.h>

void p(void) { printf("euid=%4d uid=%4d\n", geteuid(), getuid()); }

int main(void) { p(); seteuid(100); p(); seteuid(0); p(); return 0; }
$ cc -Wall t12.c
$ sudo chown root a.out && sudo chmod 4555 a.out
$ sudo ./a.out
euid=   0 uid=   0
euid= 100 uid=   0
euid=   0 uid=   0
$ ./a.out
euid=   0 uid= 501
euid= 100 uid= 501
euid=   0 uid= 501
$ 
3 голосов
/ 16 февраля 2010

Не прямой ответ, просто хотел бы указать вам на идею разделения привилегий . Вот отличная презентация от основателя OpenBSD Тео де Раадта.

1 голос
/ 05 сентября 2011

Fork (), прежде чем вы откажетесь от привилегий. Подождите в родительской задаче, пока не будет завершен дочерний процесс с ограниченными привилегиями, затем возобновите в родительской задаче с корнем.

seteuid не переносим для всех устройств и имеет и другие недостатки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...