Linux issetugid的目的是什么?

Linux issetugid的目的是什么?,linux,unix,solaris,setuid,Linux,Unix,Solaris,Setuid,根据issetugid的手册页,该调用应该是1个对uid/gid更改的警报;或2对可能受污染的环境发出警报。函数名表示第三个用途 第一个问题:它的目的是什么 例如,当我查看Linux系统上作为库的可用实现时,由于Linux内核不提供API,我发现以下内容: if (getuid() != geteuid()) return 1; if (getgid() != getegid()) return 1; return 0; 在Solaris上,它如下所示: return ((curproc

根据issetugid的手册页,该调用应该是1个对uid/gid更改的警报;或2对可能受污染的环境发出警报。函数名表示第三个用途

第一个问题:它的目的是什么

例如,当我查看Linux系统上作为库的可用实现时,由于Linux内核不提供API,我发现以下内容:

if (getuid() != geteuid()) return 1; 
if (getgid() != getegid()) return 1; 
return 0; 
在Solaris上,它如下所示:

return ((curproc->p_flag & SUGID) != 0);
我有点怀疑,但这部分是因为很难理解像geteuid和getegid这样的函数在所有平台(例如BSD、Linux、Unix和Solaris)上返回什么

第二个问题:Linux代码在语义上等同于Solaris代码吗

第三个问题:geteuid和getegid在不同平台上的实现是否相同?对于那些有三个id的系统——真实的、有效的和节省的,怎么样

第四个问题:有效身份证是这里唯一重要的身份证吗

如果一个进程以UID=0启动并临时删除特权,则保存的id将起作用。临时删除root的进程不需要执行,也不应该被污染

第五个问题:临时丢弃根的过程是否受到污染


第六个问题:如果一个进程的有效id是保存的id,那么该进程是否应该被视为受到了污染?

在一个设计为只回答一个问题的系统中,六个问题的回答有点多,特别是如果没有人知道所有六个问题的答案,但我会尝试

1 issetugid的目的是让库知道它们是否正在以提升的权限运行的程序中使用,以便它们可以避免风险行为,如信任LD_LIBRARY_PATH、NLSPATH等。环境变量会让调用方加载可能滥用提升的权限的模块。你可以看到一些关于它的历史讨论

2该代码似乎不如BSD和Solaris版本安全,因为它没有考虑保存的setid位

3他们可能在不同的内核上有不同的实现-请查看平台源代码以了解


4、5和6否,是,是-可以将其euid或egid更改回更高级别的流程仍不应信任导致其加载用户提供的代码以利用它们的环境变量。

在设计为一个问题一个问题回答的系统中,六个问题的回答有点多,特别是如果没有人知道所有六个问题的答案,但我会试试

1 issetugid的目的是让库知道它们是否正在以提升的权限运行的程序中使用,以便它们可以避免风险行为,如信任LD_LIBRARY_PATH、NLSPATH等。环境变量会让调用方加载可能滥用提升的权限的模块。你可以看到一些关于它的历史讨论

2该代码似乎不如BSD和Solaris版本安全,因为它没有考虑保存的setid位

3他们可能在不同的内核上有不同的实现-请查看平台源代码以了解

4、5和6否,是,是-可以将其euid或egid更改回更高级别的进程仍不应信任导致其加载用户提供的代码以利用它们的环境变量。

我不知道issetugid,但我可以通过阅读BSD或Solaris手册页面来学习。该函数来自OpenBSD

1 OpenBSD的手册中说,如果进程是由于上一次或其他先前的Exeve系统调用而生成的setuid或setgid,则issetugid函数返回1。否则返回0。然后建议使用issetugid检查环境变量中命名的文件是否可以安全打开

2不,您的Linux和Solaris代码不等效。运行setuid的进程可能会将其真实uid设置为其有效uid,而无需清理其环境变量。例如,uid\u t uid=geteuid;setResuid,uid,uid;将实际uid和保存的uid都设置为有效uid。然后Linux issetugid将返回0,而Solaris issetugid将返回1

Solaris在执行时检查SUGID进程标志。Solaris的免费分支Illumos在执行文件时设置SUGID。OpenBSD具有类似的逻辑。OpenBSD的手册上说

如果子进程执行新的可执行文件,则将确定新的issetugid状态。此状态基于现有进程的uid、euid、gid和egid权限以及可执行文件的模式。如果新的可执行文件模式为setuid或setgid,或者如果现有进程正在使用uid执行新映像!=euid或gid!=egid,新流程将被视为ISETUGID

Solaris和OpenBSD在执行时比较ID。您的Linux代码将比较延迟到调用issetugid,因此它不是等效的

3 geteuid和getegid函数似乎在任何地方都做相同的事情;它们只返回有效的用户id和 有效组id

4保存的ID不重要。进程可能在不清理其环境变量的情况下更改了这些ID。没有一个真实的、有效的或保存的ID告诉我们谁为当前流程设置了环境变量

5至少在OpenBSD和Solaris上,临时删除根目录的进程不会受到污染。OpenBSD的手册页面上说

issetugid系统调用的结果不受对setuid、setgid或其他此类调用的影响。对于fork,子进程继承相同的状态

issetugid的状态仅受Exeve的影响

当进程临时删除带有setuid或seteuid的root时,它不会执行文件,因此其issetugid值不会更改

但FreeBSD、DragonFly BSD和NetBSD对ISetugid的定义更为严格。FreeBSD的用户手册上说

如果进程是由于设置了setuid或setgid位的execve2系统调用而创建的,并且因此获得了额外的权限,或者自开始执行以来更改了任何实际的、有效的或保存的用户或组ID,则该进程将被污染

在这些系统中,删除根的进程会强制其issetugid值为1

6不,等于已保存id的有效id不会污染进程。如果它这样做了,那么每个进程都会受到污染,因为每个进程在执行时都将其保存的id设置为其有效id。

我不知道issetugid,但我可以通过阅读BSD或Solaris手册页面来学习。该函数来自OpenBSD

1 OpenBSD的手册中说,如果进程是由于上一次或其他先前的Exeve系统调用而生成的setuid或setgid,则issetugid函数返回1。否则返回0。然后建议使用issetugid检查环境变量中命名的文件是否可以安全打开

2不,您的Linux和Solaris代码不等效。运行setuid的进程可能会将其真实uid设置为其有效uid,而无需清理其环境变量。例如,uid\u t uid=geteuid;setResuid,uid,uid;将实际uid和保存的uid都设置为有效uid。然后Linux issetugid将返回0,而Solaris issetugid将返回1

Solaris在执行时检查SUGID进程标志。Solaris的免费分支Illumos在执行文件时设置SUGID。OpenBSD具有类似的逻辑。OpenBSD的手册上说

如果子进程执行新的可执行文件,则将确定新的issetugid状态。此状态基于现有进程的uid、euid、gid和egid权限以及可执行文件的模式。如果新的可执行文件模式为setuid或setgid,或者如果现有进程正在使用uid执行新映像!=euid或gid!=egid,新流程将被视为ISETUGID

Solaris和OpenBSD在执行时比较ID。您的Linux代码将比较延迟到调用issetugid,因此它不是等效的

3 geteuid和getegid函数似乎在任何地方都做相同的事情;它们只返回有效的用户id和有效的组id

4保存的ID不重要。进程可能在不清理其环境变量的情况下更改了这些ID。没有一个真实的、有效的或保存的ID告诉我们谁为当前流程设置了环境变量

5至少在OpenBSD和Solaris上,临时删除根目录的进程不会受到污染。OpenBSD的手册页面上说

issetugid系统调用的结果不受对setuid、setgid或其他此类调用的影响。对于fork,子进程继承相同的状态

issetugid的状态仅受Exeve的影响

当进程临时删除带有setuid或seteuid的root时,它不会执行文件,因此其issetugid值不会更改

但FreeBSD、DragonFly BSD和NetBSD对ISetugid的定义更为严格。FreeBSD的用户手册上说

如果进程是由于设置了setuid或setgid位的execve2系统调用而创建的,并且因此获得了额外的权限,或者自开始执行以来更改了任何实际的、有效的或保存的用户或组ID,则该进程将被污染

在这些系统中,删除根的进程会强制其issetugid值为1


6不,等于已保存id的有效id不会污染进程。如果它这样做了,那么每个进程都会受到污染,因为每个进程在执行时都将其保存的id设置为其有效id。

调用ISETUGID的主要原因是为了保证在setuid或setgid程序中使用时的安全行为,或者在成功执行后以更高权限运行的程序中使用时的安全行为。你可能把事情弄得更复杂了。谢谢吉姆。我的处境很糟糕——我正在审核一些使用该函数的代码。在Linux上,库提供API,因为它与内核不同。但我不知道它应该做什么,因为它不是s
调用ISETUGID的主要原因是为了保证在setuid或setgid程序中使用时的安全行为,或在成功执行后以更高权限运行的程序中使用时的安全行为。你可能把事情弄得更复杂了。谢谢吉姆。我的处境很糟糕——我正在审核一些使用该函数的代码。在Linux上,库提供API,因为它与内核不同。但我不确定它应该做什么,因为它不标准,或者它是否有效。alanc-六个问题在为一个问题设计的系统中有点难回答。。。。是的,我同意。这是一个权衡,一篇文章有多个问题,或者多篇文章有大量的复制/粘贴,只有一个问题。谢谢回答问题2和4。我也有同样的感觉。另外,你是否认为竞争是一个问题?这是另一个不太重要的问题,因为Linux和其他操作系统充满了竞争。如果代码是多线程的,那么是的,检查getuid/geteuid/etc的当前结果。如图2所示,可以与setuid/seteuid/etc进行比赛。根据谁赢得比赛,可以调用并返回不同的答案。~alanc-在为一个问题设计的系统中,六个问题的答案有点多。。。。是的,我同意。这是一个权衡,一篇文章有多个问题,或者多篇文章有大量的复制/粘贴,只有一个问题。谢谢回答问题2和4。我也有同样的感觉。此外,您是否将竞赛视为一个问题?这是另一个不太重要的问题,因为Linux和其他操作系统都充满了竞赛。如果代码是多线程的,那么是的,检查getuid/geteuid/etc的当前结果。如图2所示,可以与setuid/seteuid/etc进行竞赛。根据谁赢得了竞赛,可以调用并返回不同的答案。