原始套接字访问作为Linux 2.4上的普通用户

时间:2012-03-19 14:32:58

标签: linux sockets raw-ethernet

在嵌入式系统(2.4内核)中,我需要从以root身份运行的进程而不是对eth0接口进行原始套接字访问。

我尝试通过从命令行设置CAP_NET_RAW功能并使用cap_set_proc()以编程方式解决此问题,但都没有成功。似乎我没有权限这样做,在程序中我得到一个EPERM错误,在命令行上

  

无法在进程“1586”上设置上限:(不允许操作)

有没有更简单的方法来做我想要的?如果没有,成功设置CAP_NET_RAW功能需要哪些步骤?

编辑:我有root访问权限,但是以root身份永久运行该进程是没有选择的。 libcap的版本是1.10,没有'setcap'二进制文件,但是'setpcaps'。

编辑 - 回答George Skoptsov:

如果我说得对,你的建议是用setuid启动一个进程,然后设置CAP_NET_RAW功能,然后删除权限。我尝试使用以下代码,但它似乎不起作用,即使caps命令不返回错误。在seteuid()注释掉后,原始访问可以正常工作,但只有当进程以root身份运行时才会生效:

cap_t caps = cap_get_proc();
cap_value_t cap_list[1];
cap_list[0] = CAP_NET_RAW;
if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1)
{
    printf("cap_set_flag error");
}
if (cap_set_proc(caps) == -1)
{
    printf("cap_set_proc error");
}

if (seteuid(getuid()) != 0) 
{
    printf("seteuid error");
}

function_that_needs_raw_access();

感谢您的帮助。 克里斯

4 个答案:

答案 0 :(得分:8)

通常,您需要 root权限才能在接口上接收原始数据包。此限制是一种安全预防措施,因为接收原始数据包的进程可以使用该接口访问所有其他进程和用户的通信。

但是,如果您有权访问计算机上的root,则可以使用setuid标志为进程root权限提供,即使进程是以非root用户身份执行

首先,确保在以root身份运行进程时成功设置此功能。然后使用

sudo chown root process
sudo chmod ugo+s process 

将root设置为进程的所有者并设置setuid标志。然后检查在其他用户运行进程时是否设置了该功能。由于此进程现在具有所有超级用户权限,因此您应遵守安全预防措施,并在代码不再需要时立即删除权限(在启用CAP_NET_RAW之后)。

您可以关注this method以确保正确删除它们。

答案 1 :(得分:3)

该进程必须以root身份运行,或者在可执行文件上具有CAP_NET_RAW功能。

要设置CAP_NET_RAW,需要以root身份运行setcap命令。设置完成后,您可以将该可执行文件作为另一个用户运行,并且可以访问原始数据包捕获。

如果您无论如何都没有root访问权限,也无法让具有root权限的任何人在可执行文件上设置CAP_NET_RAW或setuid root,那么您将无法以非root用户身份执行数据包捕获。

答案 2 :(得分:3)

您可以为可执行程序提供使用CAP_NET_RAW权限的权限,而无需为其提供其他root权限。

$ setcap cap_net_raw=pe *program*

如果没有此权限,您将无法享有此权限。当然root可以为程序提供这种特权。

答案 3 :(得分:0)

TL;内核中不支持DR IMHO< 3.0

在kernel netdev邮件列表中有关于支持它的讨论: https://lwn.net/Articles/420800/https://lwn.net/Articles/420801/

并将其包含在提交中 在内核3.0中发布的 c319b4d76b9e583a5d88d6bf190e079c4e43213d

commit c319b4d76b9e583a5d88d6bf190e079c4e43213d
Author: Vasiliy Kulikov <segoon@openwall.com>
Date:   Fri May 13 10:01:00 2011 +0000

    net: ipv4: add IPPROTO_ICMP socket kind

Follows: v2.6.39-rc2
Precedes: v3.0-rc1

在没有CAP_NET_RAW的情况下运行ping(即没有设置功能或没有set-uid),在iputils s20150815发布的修订版 87dbb3a5db657d5eae6934707beaf0507980a1c3 中实施了ping:

commit 87dbb3a5db657d5eae6934707beaf0507980a1c3
Author: Nikos Mavrogiannopoulos <nmav@redhat.com>
Date:   Fri May 29 11:01:00 2015 +0200

    This patch allows running ping and ping6 without root privileges on
    kernels that support it. Almost identical to Lorenzo
    Colitti's original patch except:
    ...

Follows: s20140519
Precedes: s20150815