我在许多开源项目中看到了这样的逻辑:
if (setuid() == 0) {
if (setgid(ccf->group) == -1) {
...
if (initgroups(ccf->username, ccf->group) == -1) {
我有两个问题:
initgroups
? IMO,要改变gid和uid,setuid()
和setgid()
就够了。答案 0 :(得分:4)
大多数情况下,系统守护进程由init脚本生成,因此以root
运行。调用setuid()
和setgid()
允许他们删除超级用户权限并模拟系统上的其他用户(通常远不如root
强)。这样,错误和安全漏洞对系统的致命性降低。
关于问题的第二部分,调用initgroups()重新初始化组访问列表,并将ccf->group
添加到ccf->username
所属的组列表中。这可能是因为调用setgid()
不足以将与新组关联的访问权限传播到流程。
答案 1 :(得分:2)
通常,您需要管理权限才能侦听端口1023及以下。 (还有其他原因以管理员身份启动,但这是最重要的原因。)但事情就是这样:你可以以管理员身份启动,绑定套接字,然后下拉成为用户。
现在,您为什么想成为一名用户?好吧,如果您以尽可能少的权限运行,并且您的程序受到损害,那么损害将被包含。
答案 2 :(得分:0)
在某些操作系统setgid()
上为补充组提供祝酒。在 initgroups()
之前调用setgid()
因此无效。