POSIX 文件能力:分配根用户的能力
2008-11-12 08:30:08 来源:WEB开发网如果没有设置 SECURE_NOROOT,那么当进程执行文件时,就按照完全填充的文件能力集计算新的能力集。具体地说:
如果进程的真实 uid 或有效 uid 是 0(根用户),或者文件是 setuid root,那么文件的可继承集和允许集就是满的。
如果进程的有效 uid 是根用户,或者文件是 setuid root,那么文件有效集就是满的。
如果没有设置 SECURE_NO_SETUID_FIXUP,那么当进程将它的真实或有效 uid 切换到 0 或切换回来时,要分几种情况计算能力集:
如果进程将它的有效 uid 从 0 切换到非 0,那么它的有效能力集被清空。
如果进程将它的真实、有效或保存的 uid 从至少一个 0 切换到全部非 0,那么允许能力集和有效能力集都被清空。
如果进程将它的有效 uid 从非 0 切换到 0,那么有效集被设置为与允许集相同。
这套规则让进程可以根据根用户或者通过运行 setuid root 文件拥有能力。但是,SECURE_NO_SETUID_FIXUP 禁止进程在变成非根之后保留任何能力。但是,如果没有设置 SECURE_NOROOT,那么一个已经放弃一些能力的根进程只需执行另一个程序,就能够恢复它的能力。所以为了能够使用能力并保证系统安全,根进程必须能够不可逆转地将它的 uid 切换到非 0,同时保留一些能力。
通过使用 prctl(3),进程可以请求在下一次调用 setuid(2) 时保留它的能力。这意味着进程可以:
通过根用户身份或者执行 setuid root 二进制文件,作为根进程启动。
通过调用 prctl(2) 设置 PR_SET_KEEPCAPS,这请求系统在调用 setuid(2) 时保留它的能力。
调用 setuid(2) 或相关的系统调用来修改 userid。
调用 cap_set_proc(3) 来删除能力。
现在,进程可以一直用根特权的一个子集运行。如果攻击者突破了这个程序,他也只能使用有效集中的能力;即使调用了 cap_set_proc(3),也只能使用允许集中的能力。另外,如果攻击者迫使这个程序执行另一个文件,那么所有能力都会撤消,将作为非特权用户执行这个文件。
更多精彩
赞助商链接