使用libpcap的原始捕获功能(CAP_NET_RAW,CAP_NET_ADMIN)无法在/ usr/bin和朋友之间进行数据包捕获程序

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/dumpcapwireshark(其中在用户正常工作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.我很想找到一个权威的来源.

  • 您可以使用`getpcaps $(pidof ./a.out)`列出正在运行的进程的功能.尝试`sudo mount -o remount,suid/home`并检查它是否有效. (2认同)