在C中测试linux CAP_FOWNER功能?

时间:2017-04-25 01:10:28

标签: c linux linux-capabilities

在目录上调用foo.setDefaultRenderer(Integer.class, new FooRenderer()); foo.setDefaultRenderer(Short.class,new FooRenderer()); foo.setDefaultRenderer(String.class, new FooRenderer()); foo.setDefaultRenderer(Object.class, new FooRenderer()); 之前,如果调用者不拥有该目录,我想测试调用者是否具有chmod()能力。

从搜索开始,我似乎应该可以通过调用CAP_FOWNER来测试CAP_FOWNER功能 - 但capable(CAP_FOWNER)不在我的手册页中,似乎不是由capable()导出。

<linux/capability.h>的正确包含文件是什么,或者,测试Linux功能的最简单/最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

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

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

如果这没有用,那么显而易见的解决方法是在目录上尝试chmod()并处理可能的失败。

答案 1 :(得分:1)

  

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

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

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