나중에 루트가 될 가능성이있는 루트에서 사용자가 될 수있는 setUid ()를 사용하는 방법은 무엇입니까?
문제
나는 안전한 일을하려고 노력하고 있으며, 필요하지 않을 때 권한을 떨어 뜨리기 위해 루트로 실행 해야하는 프로그램이 있습니다. 내가 잘 작동한다면 잘 작동합니다 chmod
Suid 비트가있는 바이너리, 그리고 지금은 root에 속합니다. 지금은 UID = 일부 사용자가 있고 euid = root가 있으므로 사용할 수 있습니다. seteuid(0)
그리고 seteuid(getuid())
각각 관리자 권리를 높이고 삭제합니다.
하지만 내가 사용한다면 sudo
suid를 설정하는 대신 uid == euid == 0, 그래서 seteuid(getuid())
효과가 없습니다. 그리고 나는 단지 변할 수 없습니다 UID
임의의 사용자로부터 어떤 가치로, setuid()
Man Page에 따르면 루트로 실행되는 프로그램에서 호출되면 재선을위한 특권을 잃고 다시 되 찾을 수있는 희망이 없습니다.
그래서, 내 프로그램을 사용하여 실행할 때 내 프로그램이 일시적으로 권한을 잃게하려면 어떻게해야합니까? sudo
?
해결책
seteuid(some random 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
$
권한을 떨어 뜨리기 전에 포크 (). 특권이 줄어든 아동이 완료 될 때까지 부모의 과제를 기다린 다음 뿌리가있는 부모의 재개.
seteuid는 모든 유니폼에 휴대 할 수있는 것은 아니며 다른 단점도 있습니다.