我只需要处理这个问题,到目前为止,下面的部分还没有得到正确的回答。
为了将 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