在 C 中测试 linux CAP_FOWNER 能力?

Test for linux CAP_FOWNER capability in C?

在目录上调用chmod()之前,如果调用者不拥有该目录,我想测试调用者是否具有CAP_FOWNER能力。

从搜索来看,我似乎应该能够通过调用 capable(CAP_FOWNER) 来测试 CAP_FOWNER 功能——但是 capable() 不在我的手册页中,而且似乎也没有由 <linux/capability.h>.

导出

什么是 capable() 的正确包含文件,或者 simplest/best 测试 linux 功能的方法是什么?

我认为 capable() 在内核源代码中可用,但不能用于一般用途。如果您正在编写设备驱动程序或模块,那么它应该可用。

如果您正在编写用户 space 程序,那么您也许可以使用 libcap 提供的功能;参见 man capabilities(7) and man libcap(3)。我建议 #include <sys/capability.h> 并使用 cap_get_proc() 并且可能 CAP_IS_SUPPORTED(CAP_FOWNER).

如果这不好,明显的解决方法是尝试 chmod() 目录并处理可能的失败。

Before invoking chmod() on a directory, ... I would like to test that the caller has the CAP_FOWNER capability.

你有理由在应用程序端这样做吗?如果进程调用 chmod()(或任何其他系统调用),内核将在任何情况下检查进程是否被允许这样做,并且 return EPERMEACCES 如果不是。在应用程序端检测这是一个非常简单的测试,并且应用程序在任何情况下都需要做一些事情,因为应用程序可能不知道内核完成的所有访问控制。 (想想 SELinux。)

一般来说,首先测试听起来很像 Time of check to time of use 问题。对于非特权进程,这不是问题,但如果您的进程代表另一个用户做一些工作(进程实际特权高于它想要授予用户的特权),它很快就会变成一个。