在 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 EPERM
或 EACCES
如果不是。在应用程序端检测这是一个非常简单的测试,并且应用程序在任何情况下都需要做一些事情,因为应用程序可能不知道内核完成的所有访问控制。 (想想 SELinux。)
一般来说,首先测试听起来很像 Time of check to time of use 问题。对于非特权进程,这不是问题,但如果您的进程代表另一个用户做一些工作(进程实际特权高于它想要授予用户的特权),它很快就会变成一个。
在目录上调用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 EPERM
或 EACCES
如果不是。在应用程序端检测这是一个非常简单的测试,并且应用程序在任何情况下都需要做一些事情,因为应用程序可能不知道内核完成的所有访问控制。 (想想 SELinux。)
一般来说,首先测试听起来很像 Time of check to time of use 问题。对于非特权进程,这不是问题,但如果您的进程代表另一个用户做一些工作(进程实际特权高于它想要授予用户的特权),它很快就会变成一个。