在嵌入式系统(2.4内核)中,我需要从不以root用户身份运行的进程中访问eth0接口。
我试图通过从命令行设置CAP_NET_RAW功能并以编程方式使用cap_set_proc()来解决这个问题,这两种方法都没有成功。似乎我没有这样做的许可,在程序中,我在命令行上得到了一个EPERM错误。
未能在进程“1586”上设置上限:(不允许操作)
有更简单的方法来做我想做的事吗?如果没有,那么成功地设置CAP_NET_RAW功能需要哪些步骤?
编辑:我有根访问权限,但是永久地以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();
谢谢你的帮助。克里斯
发布于 2012-03-19 14:37:32
通常,需要根权限才能在接口上接收原始数据包。这种限制是一种安全防范措施,因为接收原始数据包的进程可以使用该接口访问所有其他进程和用户的通信。
但是,如果您可以访问机器上的根用户,则可以使用塞图德标志授予进程根权限,即使进程是以非根用户的身份执行的。
首先,确保在进程作为root运行时成功地设置了此功能。然后使用
sudo chown root process
sudo chmod ugo+s process
若要将根设置为进程所有者并设置setuid
标志,请执行以下操作。然后检查是否在进程由其他用户运行时设置了该功能。因为这个过程现在将拥有所有的超级用户权限,所以您应该遵守安全防范措施,并在代码不再需要时(在启用CAP_NET_RAW之后)立即取消特权。
您可以跟踪这种方法以确保正确丢弃它们。
发布于 2016-11-05 16:58:09
您可以赋予可执行程序使用CAP_NET_RAW
特权的能力,而无需授予它其他根权限。
$ setcap cap_net_raw=pe *program*
没有这个特权,你就不能给予这个特权。当然,root可以将此特权赋予程序。
发布于 2012-03-19 15:52:23
进程必须以根用户身份运行,或者在可执行文件上具有CAP_NET_RAW功能。
为了设置CAP_NET_RAW,需要以root用户的身份运行setcap命令。一旦设置完毕,您就可以作为另一个用户运行可执行文件,并且它可以访问原始数据包捕获。
如果您仍然没有根访问权限,也不能让任何具有根访问权限的人在可执行文件上设置CAP_NET_RAW或setuid,您将无法作为非根用户进行数据包捕获。
https://stackoverflow.com/questions/9772068
复制相似问题