11

我正在尝试做安全的事情,并且有一个程序需要以 root 身份运行以在不需要它们时放弃其权限。如果我的二进制文件带有 SUID 位,这很好chmod用,并使其属于 root,因为现在我有 UID = 某个用户和 EUID = root,所以我可以使用seteuid(0)seteuid(getuid())分别提高和删除管理员权限。

但是如果我使用sudo而不是设置SUID,那么UID == EUID == 0,所以调用seteuid(getuid())不会有任何效果。而且我不能只是UID从某个随机用户那里更改为某个值,因为setuid()手册页清楚地指出,如果它是从以 root 身份运行的程序调用的,则将永远失去特权,并且没有希望找回它们。

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

4

4 回答 4

10

seteuid(some random uid)seteuid(0)root.

于 2010-02-16T18:31:17.717 回答
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
$ 
于 2010-02-16T18:48:14.553 回答
3

不是直接的答案,只是想向您指出特权分离的想法。这是 OpenBSD 创始人 Theo de Raadt 的精彩演讲

于 2010-02-16T18:32:43.223 回答
1

Fork() 在你放弃特权之前。在父任务中等待,直到具有降低权限的子任务完成,然后以 root 权限在父任务中恢复。

seteuid 并非对所有 unice 都可移植,并且还有其他缺点。

于 2011-09-04T21:59:00.447 回答