dir*_*has 10 linux ubuntu wireshark libpcap linux-capabilities
TL; DR:为什么cap_net_raw
,cap_net_admin
功能只能在/usr/bin
(或/usr/sbin
)中工作,而不能在其他地方工作?这可以在某个地方配置吗?
我在使用Ubuntu 14.04中的libpcap为我的C程序分配功能时遇到了问题.即使在使用setcap(8)
和使用它来分配功能之后getcap(8)
,我仍然会收到权限错误.似乎功能仅适用于\usr\bin
朋友中的可执行文件.
我的程序test.c
如下:
#include <stdio.h>
#include <pcap.h>
int main(int argc, char **argv) {
if (argc != 2) {
printf("Specify interface \n");
return -1;
}
char errbuf[PCAP_ERRBUF_SIZE];
struct pcap* pcap = pcap_open_live(argv[1], BUFSIZ, 1, 0, errbuf);
if (pcap == NULL) {
printf("%s\n", errbuf);
return -1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并编译
gcc test.c -lpcap
Run Code Online (Sandbox Code Playgroud)
生成a.out
可执行文 我设置了功能:
sudo setcap cap_net_raw,cap_net_admin=eip ./a.out
Run Code Online (Sandbox Code Playgroud)
并检查它是否正确:
getcap a.out
Run Code Online (Sandbox Code Playgroud)
这给了我
a.out = cap_net_admin,cap_net_raw+eip
Run Code Online (Sandbox Code Playgroud)
跑步a.out
给了我:
./a.out eth0
eth0: You don't have permission to capture on that device (socket: Operation not permitted)
Run Code Online (Sandbox Code Playgroud)
sudo
按预期运行(程序不打印任何内容并退出).
这里有一个有趣的现象:如果我提出a.out
来/usr/bin
(并重新应用功能),它的工作原理.反之亦然:服用启用的功能- /usr/bin/dumpcap
从wireshark
(其中在用户正常工作wireshark
组)和移动它出来的/usr/bin
,说我的家目录,重新应用相同的能力,它不工作.搬回来,它的工作原理.
SO:为什么这些功能仅适用于/usr/bin
(和/usr/sbin
),而不适用于其他地方?这可以在某个地方配置吗?
Gra*_*ing 12
这可能是因为您的主目录已挂载nosuid
,这似乎阻止了功能的运行.Ubuntu加密主目录,并使用ecryptfs作为nosuid进行安装.
有能力的二进制文件我的工作/usr/
,和/home/
,但不是我的主目录.
我能找到的唯一能够nosuid
击败能力的参考资料是:http://www.gossamer-threads.com/lists/linux/kernel/1860853#1860853.我很想找到一个权威的来源.