首页 理论教育 Linux内核安全模块深入剖析:打破向后兼容

Linux内核安全模块深入剖析:打破向后兼容

时间:2023-11-22 理论教育 版权反馈
【摘要】:有了向后兼容,应用既可以通过设置用户id来调整能力,又可以直接设置能力。为此内核在进程凭证中增加了三个比特位。SECBIT_KEEP_CAPS如果这个比特位被置位,那么6.5节讲到的系统调用的第一条规则不起作用。上述三个比特位各自“破坏”了一部分向后兼容,合在一起使用就可以营造出一个纯粹的只使用能力机制的环境。PR_GET_SECUREBITS和PR_SET_SECUREBITS则直到Linux 2.6.26才进入内核。显然在最初的设计中,内核能力机制的设计者没有想到总共会引入六个比特位。

Linux内核安全模块深入剖析:打破向后兼容

有了向后兼容,应用既可以通过设置用户id来调整能力,又可以直接设置能力。内核能力机制的设计者希望能帮助应用切换到纯粹使用能力的轨道上。为此内核在进程凭证中增加了三个比特位。

(1)SECBIT_KEEP_CAPS

如果这个比特位被置位,那么6.5节讲到的系统调用的第一条规则不起作用。效果就是,如果系统调用前(r)uid、euid、suid中有一个或多个为0,系统调用后这三个用户id都不是0,那么进程的允许能力集和有效能力集不变。

(2)SECBIT_NO_SETUID_FIXUP

如果这个比特位被置位,那么6.5节讲到的系统调用的第二、三、四条规则不起作用。效果就是,进程的euid和fsuid的改变不会引发进程有效能力集变化。

(3)SECBIT_NOROOT

如果这个比特位被置位,那么6.5节讲到的“从文件获取”部分的两条规则不起作用。效果就是,进程execve一个set-user-ID-root文件 [9] ,或一个(r)uid为0的进程执行execve,内核都不会暂时调整文件的能力集或能力位。

上述三个比特位各自“破坏”了一部分向后兼容,合在一起使用就可以营造出一个纯粹的只使用能力机制的环境。内核能力机制的设计者还为这三个比特位分别对应了三个“锁”比特位:SECBIT_KEEP_CAPS_LOCKED、SECBIT_NO_SETUID_FIXUP_LOCKED、SECBIT_ NOROOT_LOCKED,锁比特若被置位,相应的比特位就不能被修改了。设置和查看这六个比特位的方式是通过系统调用prctl。这里也是只使用prctl的两个参数,第一个参数是option,相关的值有四个:

1)PR_GET_KEEPCAPS(www.xing528.com)

返回SECBIT_KEEP_CAPS的状态,1为置位,0为清位。

2)PR_SET_KEEPCAPS

arg2为1置SECBIT_KEEP_CAPS位,为0清SECBIT_KEEP_CAPS位。

3)PR_GET_SECUREBITS

通过返回值获取全部六个比特位状态。

4)PR_SET_SECUREBITS

通过arg2设置除SECBIT_KEEP_CAPS外五个比特位的值。

PR_GET_KEEPCAPS和PR_SET_KEEPCAPS在Linux 2.2.18就进入内核了。PR_GET_SECUREBITS和PR_SET_SECUREBITS则直到Linux 2.6.26才进入内核。显然在最初的设计中,内核能力机制的设计者没有想到总共会引入六个比特位。最初的名字KEEPCAPS语义上不好扩展,就增加了SECUREBITS,SECUREBITS的语义完全可以覆盖全部六个比特位,但是为了照顾历史遗产,并未这么做。结果就造成了现在这个奇怪的逻辑。SET操作,KEEPCAPS管一个比特位,SECUREBITS管其余五个比特位;GET操作,KEEPCAPS管一个比特位,SEUREBITS管全部六个比特位。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈