设置功能时的pthread_setname_np()

时间:2017-08-02 16:07:03

标签: c linux pthreads privileges linux-capabilities

我使用

从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

所以对我而言,当我添加一项功能时,我的特权似乎较少。有人可以解释一下吗?

谢谢你的回复; - )

其他一些信息:

  • 我的目标支持功能我使用ping命令和CAP_NET_RAW
  • 进行了检查
  • 内核4.4.32-rt43
  • RFS:ext4
  • 我将帖子缩减为示例程序我同意将CAP_NET_RAW添加到此程序是没有意义的。
  • 如果我添加CAP_DAC_OVERRIDE,它会起作用,但我想避免这种情况。

1 个答案:

答案 0 :(得分:1)

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

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