POSIX 文件能力:分配根用户的能力
2008-11-12 08:30:08 来源:WEB开发网程序告诉系统,它希望保留它的能力,但是要修改它的有效 userid。这要使用 prctl。
程序将它的 userid 改为非根用户。
程序构造所需的能力集并设置为活动集。
进程有三个能力集:允许(permitted,P)、可继承(inheritable,I) 和有效(effective,E)。在产生进程时,子进程从父进程复制能力集。当一个进程执行一个新程序时,根据公式计算新的能力集(稍后讨论这些公式)。
有效集 中的能力是进程当前可以使用的。有效集必须是允许集 的子集。只要有效集不超过允许集的范围,进程任何时候都可以修改有效集的内容。可继承集 只用于在执行 exec() 之后计算新的能力集。
清单 1 给出三个公式,它们表示在文件执行之后根据 POSIX 草案计算出的新能力集(参见 参考资料 中 IEEE Std 1003.1-2001 的链接)。
清单 1. 在执行 exec() 之后计算新能力集的公式
pI' = pI
pP' = fP | (fI & pI)
pE' = pP' & fE
以 ' 结尾的值表示新计算出的值。以 p 开头的值表示进程能力。以 f 开头的值表示文件能力。
可继承集按原样从父进程继承,没有任何修改,所以进程一旦从可继承集中删除一个能力,就应该无法再恢复它(但是请阅读下面对 SECURE_NOROOT 的讨论)。 新的允许集是文件的允许集与文件和进程的可继承集的交集合并的结果。进程的有效集是新的允许集和文件有效集的交集。从技术上说,在 Linux 中,fE 不是一个集,而是一个布尔值。如果这个值是 true,那么 pE' 就设置为 pP'。如果是 false,pE' 就是空的。
如果进程要在执行一个文件之后保留任何能力,那么这些能力必须被包含在文件的允许集或可继承集中。因为 Linux 在相当长的时期内没有实现文件能力,所以这是一个难以实施的限制。为了解决这个问题,实现了 “安全模式(secure mode)”。它由两位组成:
更多精彩
赞助商链接