如何从root用户使用setuid()成为用户,以后可能再次成为root用户?

Flo*_*ian 11 c linux security setuid root

我正在尝试做安全的事情,并且有一个程序需要以root身份运行才能在不需要它时删除它的权限.如果我chmod的SUID位是二进制,并且它属于root,那么这很有效,因为现在我有UID =某个用户,而EUID = root,所以我可以使用seteuid(0)seteuid(getuid())分别提升和删除管理员权限.

但是,如果我使用sudo而不是设置SUID,那么UID == EUID == 0,因此调用seteuid(getuid())不会有任何影响.而且我不能仅仅UID从一些随机用户那里改变一些价值,因为setuid()手册页明确指出,如果从以root身份运行的程序调用它,那么就会失去权利,没有希望让他们回来.

那么,如何让我的程序在运行时暂时失去其权限sudo

Aid*_*lly 10

seteuid(some random uid)seteuid(0)在运行时删除权限,让它们恢复root.

  • 当然 - 如果OP需要返回给该用户,那么就会出现获取调用`sudo`的用户的原始UID的问题? (3认同)

Dig*_*oss 6

似乎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
$ 
Run Code Online (Sandbox Code Playgroud)