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

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

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

Так, как я заставляю свою программу потерять временно свои полномочия, когда выполнено с помощью sudo?

11
задан Cœur 11 December 2017 в 04:56
поделиться

3 ответа

Попробуйте:

$('html, body').animate({scrollTop: '0px'}, 300);

Это можно сделать с помощью 0 вместо 300 , чтобы быть мгновенным, но это дает быстрый эффект автоматической прокрутки.

-121--1554207-

Есть много отличных рецептов для таких вещей, как это на странице Шона Андерсона «Bit Twiddling Hacks».

-121--1466481-

seteuid (некоторый случайный uid) для удаления привилегий, seteuid (0) для их возврата при выполнении как root .

10
ответ дан 3 December 2019 в 05:57
поделиться

Похоже, что seteuid (x) должен работать для сброса и повторного повышения привилегий ...

$ 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
$ 
6
ответ дан 3 December 2019 в 05:57
поделиться

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

3
ответ дан 3 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: