pthread_setname_np() 设置功能时

pthread_setname_np() when capabilities are set

我用

从 man pthread_setname_np 编译了示例程序
g++ -pthread  example.cpp

并且我设置了我的程序 a.out 的 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

所以对我来说,当我添加功能时,我的权限似乎变少了。谁能解释一下?

感谢您的回复;-)

一些附加信息:

设置文件系统功能在很多方面就像制作程序一样SUID/SGID。在这种 AT_SECURE == 1 执行模式下,内核限制了原始用户可以对进程执行的操作。潜在的侵入性操作,例如使用 ptrace 附加进程或通过 /proc 访问进程,被内核阻止,因此用户无法使用该程序提升他们的权限。 (出于安全原因,glibc 和其他库也禁用了某些功能。)通常,这些限制仅适用于 不同 用户 ID 拥有的进程,但具有功能(和 SELinux 上下文),仅仅是不再需要用户 ID 比较来检测信任边界的交叉。

在 glibc 中,与当前线程不同的线程的 pthread_setname_np 是通过写入 /proc/self/task/TID/comm 文件来实现的,因此它会遇到这些限制。内核可以想象为共享相同地址 space 的任务的这种自修改实现异常,但似乎没有实现,因此失败。而且我真的不能责怪内核人员,因为很难在不引入任何漏洞的情况下纠正这些问题。