能力 manpage比较长,有些东西我没有完全理解。
例如,决定我们是否有权访问 CAP_NET_RAW 的函数看起来如何?
输入:
- a = 有效 uid 为 0
- b = 有一些真实的/保存的/任何为 0 的 uid
- c = CAP_NET_RAW 是 +e
- d = CAP_NET_RAW 是 +i
- e = CAP_NET_RAW 是 +p
- f = CAP_NET_RAW 被排除在“边界集”之外
输出:
- x = 我们现在可以调用
socket
而不是获取 EPERM - y = 经过一些技巧(不涉及基于文件系统的
chmod +s
或setcap
访问提升或连接到外部助手),例如使用capsetp
,我们终于可以打开原始套接字。
据我目前的理解是这样的:
- x = !f && (a || c)
- y = !f && (b || a || c || e)
实际情况如何?
最佳答案
多看文档,现在好像是这样的:
x = c
can_regain_caps_without_execve = (a || b) && !NO_NEW_PRIVS && (!SECBIT_NO_SETUID_FIXUP || ( CAP_SETPCAP && !SECBIT_NO_SETUID_FIXUP_LOCKED))
y = c || e || can_regain_caps_without_execve
即
- 零/非零 uid 仅在它发生变化且“root hacks”处于事件状态时才有意义;
- 仅使用有效的能力进行检查;其他一切都是能力管理;
- 边界集和继承能力与 execve 有关 => 超出此答案的范围。
关于linux - Linux 功能如何与零/非零 UID 相关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14629995/