12

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

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

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

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

编辑:我有 root 访问权限,但无法以 root 身份永久运行该进程。libcap 的版本是 1.10,没有“setcap”二进制文件,而是一个“setpcaps”。

编辑 - 回答乔治斯科普佐夫:

如果我猜对了,您的建议是使用 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

4 回答 4

9

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

但是,如果您有权访问机器上的root,即使进程以非 root 用户身份执行,您也可以使用setuid标志为您的进程授予 root 权限。

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

sudo chown root process
sudo chmod ugo+s process 

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

您可以按照此方法确保正确删除它们。

于 2012-03-19T14:37:32.303 回答
5

您可以赋予可执行程序使用该CAP_NET_RAW权限的能力,而无需赋予它其他 root 权限。

$ setcap cap_net_raw=pe *program*

如果没有此特权,您将无法授予此特权。当然,root 可以将此特权授予程序。

于 2016-11-05T16:58:09.227 回答
3

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

为了设置 CAP_NET_RAW,您需要以 root 身份运行 setcap 命令。设置后,您可以以其他用户身份运行可执行文件,并且可以访问原始数据包捕获。

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

于 2012-03-19T15:52:23.307 回答
0

TL; DR 恕我直言,内核 < 3.0 不支持。

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

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

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

在 iputils s20150815 中发布的修订版87dbb3a5db657d5eae6934707beaf0507980a1c3中为 ping 实施了不带 CAP_NET_RAW(即不带设置功能或不带 set-uid)运行 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
于 2017-09-14T12:30:34.307 回答