使用libpcap的数据包捕获程序,原始捕获功能(CAP_NET_RAW,CAP_NET_ADMIN)在/usr/bin及其附属程序之外无法正常工作。

14
TL;DR: 为什么只有在 /usr/bin(或 /usr/sbin)中,cap_net_raw 和 cap_net_admin 才能正常工作,而其他地方不行?这个问题能否在其他地方进行配置?
我在 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;
}

并且编译时使用

gcc test.c -lpcap

生成 a.out 可执行文件。我设置了以下功能:
sudo setcap cap_net_raw,cap_net_admin=eip ./a.out

请检查确保它看起来正确:

getcap a.out

这给了我

a.out = cap_net_admin,cap_net_raw+eip

运行 a.out 后出现以下结果:

./a.out eth0
eth0: You don't have permission to capture on that device (socket: Operation not permitted)

使用sudo运行程序时,程序按预期工作(不输出任何内容并退出)。

有趣的部分是:如果我将a.out移动到/usr/bin(并重新应用权限),它就能正常工作。反之亦然:将启用权限的/usr/bin/dumpcapwireshark(对于在wireshark组中的用户来说可以正常工作)移出/usr/bin,比如移到我的主目录下,重新应用相同的权限,它就不能正常工作。把它移回去,它就能正常工作。

因此:为什么这些权限只在/usr/bin(和/usr/sbin)中起作用,而在其他地方却不起作用?这个问题可以在哪里进行配置?


测试程序(具有上述功能)在我的基本默认的 Fedora-21 上可以正常工作。猜测可能与安全权限相关?(我对 Ubuntu 没有具体了解,但我知道 Ubuntu 上有一个叫做 AppArmor 的东西,可能类似于 Fedora 上的 SELinux)。 - willyo
您可能是对的,@willyo ... 我确实尝试禁用AppArmor和卸载配置文件(但无济于事),但没有进一步深入。 - dirkhas
1个回答

15

可能是因为您的主目录(home directory)被使用了 nosuid 挂载,这似乎会阻止权限工作。Ubuntu加密了家目录,并将其作为nosuid通过ecryptfs挂载。

/usr//home/ 目录下,带有权限的二进制文件对我有效,但不适用于我的个人主目录。

我找到的关于 nosuid 阻止权限的唯一参考资料是这个链接:http://www.gossamer-threads.com/lists/linux/kernel/1860853#1860853。我希望能找到权威的来源。


1
这应该会得到更多的赞,因为我也遇到了这个问题,苦思冥想了很长时间。我没有找到这个答案,因为我正在寻找的功能是CAP_NET_BIND_SERVICE,希望在这里也能提到它,以便更多的人发现它。 - TabascoEye
2
你可以使用 getpcaps $(pidof ./a.out) 来列出正在运行的进程的能力。然后尝试 sudo mount -o remount,suid /home 并检查是否有效。 - user1225999
1
值得注意的是:这个问题帮助我解决了Python和蓝牙的问题,导致异常:_bluetooth.error: (1, 'Operation not permitted')。我正在使用Python3.6的beacontools包,并且它依赖于功能。由于许多人在他们的主目录中开发,这可能也会成为其他软件包的问题。 - PANDA Stack
1
很不幸,看起来这个问题短时间内不会得到解决。请查看 https://bugs.launchpad.net/ecryptfs/+bug/1147348 - Pedro Rodrigues
1
从这里给你一个巨大的赞!同时,我也浪费了将近一周的时间试图解决这个问题,但都是徒劳无功。我遇到的所有Linux能力相关的教程和介绍中都没有提到这一点。它们只是在讲“ping”这个,再讲“ping”那个。 - huoneusto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接