C- Linux RAW套接字权限问题



我正在在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.

但是如何实现这一目标?

您在需要该功能而不是用户帐户的可执行文件上设置功能。语法是

setcap cap_net_raw,cap_net_admin=eip ./your_exeutable

(注意,您需要运行setCap作为root,因此请使用sudo setcap ...也要确保cap_net_raw,cap_net_admin=eip

中没有空格字符

能够阅读所有网络数据包被认为是严重的安全风险,这就是为什么需要一个特权帐户的原因。

您可以将应用程序" suid root"作为"正常"用户启动本应用程序时提升自己的权利。但这也是一种安全风险,在设计应用程序时需要进行一些彻底的思考(它至少应该在不再需要的情况下立即放弃更高的特权 - 即打开原始插座后)。

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

要使这项工作,您需要将CAP_NET_RAW功能添加到汇编的可执行文件中。请参阅setcap命令,以查看如何做。

最新更新