Linux 系统中的进程能力机制详解
1. 传统权限管理与能力机制的引入
在传统的 Unix 系统中,保护域的设计较为原始。文件访问由用户或组的标识(ID)号或有效 ID 来控制,而对内核的访问则由超级用户(root)权限决定。这种权限管理方式是二元的,即一个进程要么拥有所有权限,要么没有任何权限。
为了改进这种情况,POSIX 标准将超级用户的权限划分为一组离散的能力。一个进程在特定时间可以拥有部分、全部或没有这些能力。这使得可以实施“最小必要”策略,即一个进程仅被授予执行当前任务所需的能力子集,并且仅在需要的时间段内拥有这些能力。
Linux 系统采用了这种能力机制。Linux 中定义的许多能力遵循 POSIX 标准,但 Linux 也对 POSIX 草案进行了扩展,有相当一部分能力是 Linux 特有的。
每个进程拥有三组不同的能力,这些能力在task_struct中以 32 位位图的形式编码:
-有效集(Effective Set):表示进程当前被允许执行的操作,这是进行权限检查时所依据的集合。
-允许集(Permitted Set):指定进程可以获取的能力。如果需要,进程可以临时获取这些能力。
-可继承集(Inheritable Set):决定进程在执行exec()系统调用后将拥有的能力。
2. 表示能力的数据结构
2.1 已定义的能力
每个能力都有一个以