我用

g++ -pthread  example.cpp

我设置了程序的cap_net_raw功能。
sudo setcap 'cap_net_raw=+eip' a.out

令人惊讶的是,程序在执行时失败了:
$./a.out
Created a thread. Default name is: a.out
pthread_setname_np: Permission denied

当我移除它的功能时…
$sudo setcap 'cap_net_raw=-eip' a.out
$./a.out
Created a thread. Default name is: a.out
The thread name after setting it is THREADFOO.
Done

所以对我来说,当我添加一个功能时,我的特权似乎会减少。有人能解释一下吗?
感谢您的回复;-)
一些附加信息:
我的目标支持这些功能,我用ping命令和cap_net_raw检查了它
内核4.4.32-rt43
RFS:扩展4
我把帖子简化为示例程序,我同意在这个程序中添加cap_net_raw是没有意义的。
如果我添加cap_dac_override,它将起作用,但我想避免这种情况。

最佳答案

设置文件系统功能在许多方面与创建suid/sgid程序类似。在这个AT_SECURE == 1执行模式中,内核限制原始用户可以对进程执行的操作。内核会阻止潜在的侵入性操作,例如使用ptrace附加进程或通过/proc访问进程,因此用户无法使用程序提升其权限。(glibc和其他库也出于安全原因禁用了某些功能。)通常,这些限制仅适用于由不同用户id拥有的进程,但是对于功能(和selinux上下文),不再需要仅仅通过用户id比较来检测信任边界的交叉。
在glibc中,与当前线程不同的线程的pthread_setname_np是通过写入/proc/self/task/TID/comm文件来实现的,因此它会遇到这些限制。对于这种共享相同地址空间的任务的自我修改,内核可以实现异常,但似乎没有实现,因此失败了。我不能真的责怪内核人员,因为很难纠正这样的问题,不引入任何漏洞。

关于c - 设置功能时的pthread_setname_np(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45465854/

10-11 22:27
查看更多