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

Chr*_*ris 10 sockets linux 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();
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.克里斯

Geo*_*sov 8

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

但是,如果您有权访问计算机上的root,则即使以非root用户身份执行该进程,也可以使用setuid标志来授予进程root权限.

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

sudo chown root process
sudo chmod ugo+s process 
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

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

$ setcap cap_net_raw=pe *program*
Run Code Online (Sandbox Code Playgroud)

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