cap_dac_override 是 cap_dac_read_search 的超集吗?

Is cap_dac_override a superset of cap_dac_read_search?

我正在努力限制现有的复杂应用程序的功能,并且我一直在寻找可靠的来源来证明这一点 cap_dac_override 中包含的权限是 cap_dac_read_search 的超集。

根据capabilities(7):

,事实确实如此,这似乎合乎逻辑

CAP_DAC_OVERRIDE
* Bypass file read, write, and execute permission checks.

CAP_DAC_READ_SEARCH
* Bypass file read permission checks and directory read and execute permission checks;
* invoke open_by_handle_at(2);
* use the linkat(2) AT_EMPTY_PATH flag to create a link to a file referred to by a file descriptor.

此外,我的能力检查跟踪器实验证实 cap_dac_override 应该足够了。每次执行读取访问时,cap_dac_read_search 似乎都在 cap_dac_override 之前被检查。

我还在 grsecurity forums 上发现了以下 post,不幸的是,它只涉及 /proc:

The way the upstream kernel works is by first checking for CAP_DAC_OVERRIDE and then for CAP_DAC_READ_SEARCH for this case.

如果我想授予我的应用程序对整个文件系统的完整读取访问权限,我仍然不确定省略 cap_dac_read_search 是否完全安全。我完全知道 cap_dac_override 额外授予写入权限,我想要那个。

有没有可能在内核的某个地方有一个地方只检查 cap_dac_read_search 而不是 cap_dac_override

为了安全起见,我是否应该包括这两种功能,或者在这种情况下 cap_dac_read_search 完全多余?

经过一些额外的验证和实际测试,似乎 cap_dac_override 确实是 cap_dac_read_search 的超集。

cap_dac_read_search 从有问题的应用程序中删除时,没有一个操作因权限被拒绝而失败。

不,不是。 CAP_DAC_OVERRIDE 只允许忽略文件的权限位。 CAP_DAC_READ_SEARCH 允许忽略 read 权限位,并且还允许执行系统调用 open_by_handle_at 可用于在容器 chroot 外部读取。

实际应用参见https://github.com/gabrtv/shocker

如果您的应用程序只需要对文件系统的完全访问权限,那么 CAP_DAC_OVERRIDE 正如您已经得出的结论。