Linux原始套接字权限问题

7
我正在创建一个原始的以太网套接字在C应用程序中,例如:
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

并且返回-1表示错误。
我相信这是一个权限问题 - 只有UID为0(root)或具有CAP_NET_RAW能力的用户才能打开原始套接字。
我认为以root身份运行应用程序是不合理的,因此我的问题是如何将CAP_NET_RAW能力权限添加到我的用户帐户中?
来自http://manpages.ubuntu.com/manpages/zesty/en/man7/packet.7.html
   In order to create a packet socket, a process must have the CAP_NET_RAW
   capability in the user namespace that governs its network namespace.

但是如何实现这个目标呢?

2
只有在获得此资源之前以root身份运行应用程序,然后通过seteuid()放弃这些root权限是可能的。 - JFMR
这个链接似乎解释了如何分配适当的能力而不需要通过setcap命令以root身份运行 - 您似乎将适当的原始套接字能力与特定的可执行文件相关联-> http://packetlife.net/blog/2010/mar/19/sniffing-wireshark-non-root-user/ - bph
3个回答

10

您需要为需要该功能的可执行文件设置能力,而不是用户账户。语法如下:

setcap cap_net_raw,cap_net_admin=eip ./your_exeutable

(注意,您需要以root身份运行setcap,因此请使用例如sudo setcap ...。还要确保在cap_net_raw,cap_net_admin = eip中没有空格字符)


很棒-我得出了相同的结论-这里还有一个额外的小部分->http://packetlife.net/blog/2010/mar/19/sniffing-wireshark-non-root-user/关于创建一个新组并将exe添加到其中,因此用户必须是该组的成员才能具有运行权限-我猜这是另一层安全性,这可能不是坏事? - bph
虽然我相信这是正确的答案,但不幸的是我仍然无法实现它,因为setcap对我不起作用 - 我认为我有一些内核配置问题需要修复才能使其工作(请参见其他setcap答案相关的评论)。也许必须另外发布一个单独的问题来解决这个问题 ;) - bph
在Debian 11 (Linux 5.16.0-6)上似乎不够用;仍然会在创建套接字时导致“EACCESS”错误。 - huoneusto

4

能够读取所有网络数据包被认为是一种严重的安全风险,这就是为什么需要使用特权帐户来完成此操作。

您可以将应用程序“suid root”以提升自己的权限启动此应用程序作为“普通”用户。但是,这也存在安全风险,并且在设计应用程序时需要进行深思熟虑(它至少应该在不再需要更高特权时放弃更高特权 - 即在打开原始套接字后)。


啊,好的 - 那么以 root 用户身份运行是解决这个问题的唯一真正方法? - bph
在解决这个问题的过程中,我注意到一件事情,那就是Wireshark可以作为非root用户运行并捕获原始以太网数据包 - 我想知道那是如何实现的? - bph
1
运行 ls -ls wireshark 命令,你很可能会发现它正好使用了我所提出的东西。 - tofro
你确定你不能吗?也许可以通过在Linux内核> 2.2上使用setcap来实现? - bph
2
setcap 是一个Linux特定的"更细粒度"的setuid。原则上,它会创建不可移植的程序,但可以做到你想要的事情。 - tofro
显示剩余4条评论

2

您无法将CAP_NET_RAW权限添加到您的帐户中,因为Linux上的功能不遵循用户,而是遵循可执行文件。

要使此功能正常工作,您需要将CAP_NET_RAW能力添加到已编译的可执行文件中。请参见setcap命令以了解如何执行此操作。


感谢澄清 - 现在我明白了,能力是添加到可执行文件而不是用户上的。 - bph
现在出现了这个错误 -> sudo setcap 'cap_net_raw, cap_net_admin=eip' my_exe 致命错误:无效参数 用法:setcap [-q] [-v] (-r|-|<caps>) <filename> [ ... (-r|-|<capsN>) <filenameN> ]注意:<filename>必须是一个常规(非符号链接)文件。 - bph
该exe文件不是符号链接 - 看起来其他人也遇到了类似的问题 - 答案可能在这里 -> https://forums.gentoo.org/viewtopic-t-842057-start-0-postdays-0-postorder-asc-highlight-.html 但我还不太理解/proc目录。 - bph
我已成功使用了getcap,即getcap /usr/bin/dumpcap /usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip - bph
我想为我的可执行文件设置与进行原始套接字操作相同的能力,但由于上述错误,我无法这样做。 - bph

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