나중에 루트가 될 가능성이있는 루트에서 사용자가 될 수있는 setUid ()를 사용하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2275241

문제

나는 안전한 일을하려고 노력하고 있으며, 필요하지 않을 때 권한을 떨어 뜨리기 위해 루트로 실행 해야하는 프로그램이 있습니다. 내가 잘 작동한다면 잘 작동합니다 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
$ 

직접적인 대답이 아니라 특권 분리. 여기 위대한 것입니다 프레젠테이션 OpenBSD 설립자 Theo de Raadt.

권한을 떨어 뜨리기 전에 포크 (). 특권이 줄어든 아동이 완료 될 때까지 부모의 과제를 기다린 다음 뿌리가있는 부모의 재개.

seteuid는 모든 유니폼에 휴대 할 수있는 것은 아니며 다른 단점도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top