C 未设置_POSIX_SAVED_id时使用setreuid()

C 未设置_POSIX_SAVED_id时使用setreuid(),c,linux,permissions,suid,C,Linux,Permissions,Suid,我正在探索suid地区,发现自己无法回答这个问题。为了解决这个问题,让我们假设程序二进制文件是suid,由用户1001拥有,并由用户1000(均为非根用户)运行,因此RUID=1000,EUID=1001 设置\u POSIX\u SAVED\u id时,我可以使用setuid()和seteuid()在1000和1001之间分别更改RUID和EUID 但是,当未设置\u POSIX\u SAVED\u id时,seteuid(1000)将在以后使执行seteuid(1001)不可能,并且setu

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

设置
\u POSIX\u SAVED\u id
时,我可以使用
setuid()
seteuid()
在1000和1001之间分别更改RUID和EUID

但是,当未设置
\u POSIX\u SAVED\u id
时,
seteuid(1000)
将在以后使执行
seteuid(1001)
不可能,并且
setuid(1001)
将在以后对
setuid(1000)
执行相同的操作

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

哪些系统不使用已保存的ID?

由于POSIX要求
\u POSIX\u SAVED\u id
定义为正值,因此任何系统都不应缺少
\u POSIX\u SAVED\u id


来源:

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

为了将EUID更改为RUID并保持稍后返回的可能性,我在这里找到的GNU Setuid程序示例的解决方案是使用setreuid(10011000)(交换它们)。这对程序有什么影响,因为它改变了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

请参阅:

当然,除了那些对POSIX合规性没有任何要求的人,这就是OPs的最后一个问题……我认为保存的ID过去是可选的,但后来被强制。我怀疑仍然有没有保存ID的系统,除非你可能是非常过时的版本,在这种情况下,它们可能充满漏洞,使用起来不太实际……这可能是历史,但如果一个系统不声称符合POSIX,那么它就没有义务实现任何东西。。。当然,现在大多数*nix-en都是兼容POSIX的。我不确定Windows的变种,它们肯定不是过去的,我知道。。。底部写着“与_POSIX_SAVED_id相关的功能现在是强制性的。这是FIPS要求。”我发现唯一没有它的操作系统是大约在2001年之前的FreeBSD。非常感谢。