我使用
从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
所以对我而言,当我添加一项功能时,我的特权似乎较少。有人可以解释一下吗?
谢谢你的回复; - )
其他一些信息:
答案 0 :(得分:1)
设置文件系统功能在很多方面就像制作程序SUID / SGID一样。在此AT_SECURE == 1
执行模式中,内核限制原始用户可以对该进程执行的操作。通过ptrace
使用/proc
附加进程或访问进程的潜在侵入操作被内核阻止,以便用户无法使用该程序升级其权限。 (glibc和其他库也出于安全原因禁用了某些功能。)通常,这些限制仅适用于不同用户ID所拥有的进程,但具有功能(和SELinux上下文),仅仅是用户ID比较不再需要检测信任边界的交叉。
在glibc中,通过写入pthread_setname_np
文件来实现与当前线程不同的线程的/proc/self/task/TID/comm
,因此它会遇到这些限制。内核可以想象为共享相同地址空间的任务的这种自修改实现异常,但似乎没有实现,因此失败。而且我不能真正责怪内核人员,因为很难让这些事情变得正确,而不是引入任何漏洞。