Я пытаюсь сделать безопасную вещь и иметь программу, которая должна к выполнениям как корень отбросить его полномочия, когда этому не нужны они. Это работает хорошо если я chmod
мой двоичный файл с SUID укусил и заставил его принадлежать корню, поскольку теперь у меня есть UID = некоторый пользователь и EUID = корень, таким образом, я могу использовать seteuid(0)
и seteuid(getuid())
соответственно повысить и отбросить права администратора.
Но если я использую sudo
вместо того, чтобы установить SUID, затем UID == EUID == 0, и так звонить seteuid(getuid())
не будет иметь никакого эффекта. И я не могу просто измениться UID
к некоторому значению от некоторого случайного пользователя, как setuid()
страница справочника ясно указывает, что, если это называют из программы, работающей как корень, каждый теряет полномочия окончательно без надежды на возвращение их.
Так, как я заставляю свою программу потерять временно свои полномочия, когда выполнено с помощью sudo
?
Попробуйте:
$('html, body').animate({scrollTop: '0px'}, 300);
Это можно сделать с помощью 0
вместо 300
, чтобы быть мгновенным, но это дает быстрый эффект автоматической прокрутки.
Есть много отличных рецептов для таких вещей, как это на странице Шона Андерсона «Bit Twiddling Hacks».
-121--1466481- seteuid (некоторый случайный uid)
для удаления привилегий, seteuid (0)
для их возврата при выполнении как root
.
Похоже, что 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
$
Это не прямой ответ, просто хотелось бы обратить ваше внимание на идею разделения привилегий. Вот отличная презентация основателя OpenBSD Тео де Раадта.