【问题标题】:Test for linux CAP_FOWNER capability in C?在 C 中测试 linux CAP_FOWNER 功能?
【发布时间】:2017-09-21 20:03:29
【问题描述】:

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

通过搜索,我似乎应该能够通过调用capable(CAP_FOWNER) 来测试CAP_FOWNER 的功能——但capable() 不在我的手册页中,并且似乎没有被<linux/capability.h> 导出。

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

【问题讨论】:

    标签: c linux linux-capabilities


    【解决方案1】:

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

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

    如果这样做不好,显而易见的解决方法是在目录上尝试 chmod() 并处理可能的故障。

    【讨论】:

    • 这让我走上了正轨。解决方案归结为这些调用:cap_t cap = cap_get_proc(); cap_flag_value_t v = 0; cap_get_flag(cap, CAP_FOWNER, CAP_EFFECTIVE, &v);
    【解决方案2】:

    在对目录调用 chmod() 之前,...我想测试调用者是否具有 CAP_FOWNER 功能。

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

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

    【讨论】:

    • 有帮助,但我仍然想回答我实际提出的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多