3

我正在探索 suid 地区,发现自己无法回答这个问题。为了这个问题,假设程序二进制文件是 suid,由用户 1001 拥有并由用户 1000(均为非 root 用户)运行 - 因此 RUID=1000,EUID=1001。

设置时_POSIX_SAVED_IDS,我可以使用setuid()andseteuid()来在 1000 和 1001 之间更改 RUID 和 EUID(分别)。

但是,如果_POSIX_SAVED_IDS不设置,seteuid(1000)将导致以后无法执行seteuid(1001),并且稍后setuid(1001)会执行相同的setuid(1000)操作。

为了将 EUID 更改为 RUID 并保持稍后返回的可能性,我在这里找到的解决方案GNU Setuid Program Example是使用setreuid(1001,1000)(交换它们)。这对程序有什么影响,因为它改变了 RUID?据我了解,它改变了进程的所有者,因此对杀死进程或与进程交互的权限有影响。
哪些系统不使用_POSIX_SAVED_IDS?

4

2 回答 2

1

由于 POSIX 需要_POSIX_SAVED_IDS以正值定义,因此任何系统都不应缺少_POSIX_SAVED_IDS.

资料来源: http: //pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html

于 2012-10-15T20:12:46.570 回答
0

我只需要处理这个问题,到目前为止,下面的部分还没有得到正确的回答。

为了将 EUID 更改为 RUID 并保留稍后返回的可能性,我在这里找到的解决方案 GNU Setuid Program Example 是使用 setreuid(1001,1000) (交换它们)。这对程序有什么影响,因为它改变了 RUID?据我了解,它改变了进程的所有者,因此对杀死进程或与进程交互的权限有影响。

随处发生的情况是,EUID 是唯一用于访问文件或能够终止进程等权限的东西(可能会出现一些罕见的例外情况)。这个想法是您可以在 EUID 和 RUID 之间来回切换,但只能在它们之间切换。内核需要跟踪这两个 id。

seteuid对于非 root 用户,只允许切换到 EUID、RUID 和 - 如果内核支持它 - SUID 之一。

对于符合 POSIX 的系统,SUID 是可用的,所以会发生这种情况:

// uids are: EUID=1001, RUID=1000, SUID=1001
seteuid(1000) ; // works because RUID=1000
// uids are: EUID=1000, RUID=1000, SUID=1001
seteuid(1001); // works because SUID=1001

在没有 SUID 的系统上:

// uids are: EUID=1001, RUID=1000
seteuid(1000); // works because RUID=1000
// uids are: EUID=1000, RUID=1000
seteuid(1001); // fails, neither EUID, nor RUID is 1001

反过来

// uids are: EUID=1001, RUID=1000
setreuid(1001, 1000) ; // works because EUID=1001 and RUID=1000
// uids are: EUID=1000, RUID=1001
setreuid(1000, 1001); // works because EUID=1000 and RUID=1001

我还没有找到在符合 POSIX 的系统上永久删除权限的标准方法,因为这需要修改 SUID。只有 gnu 扩展可用:

// uids are: EUID=1001, RUID=1000, SUID=1001
setresuid(1000, 1000, 1000);
// uids are: EUID=1000, RUID=1000, SUID=1000

见:https ://people.eecs.berkeley.edu/~daw/papers/setuid-usenix02.pdf

于 2019-02-13T17:47:22.707 回答