在嵌入式系统(2.4 内核)中,我需要从进程对 eth0 接口进行原始套接字访问not以 root 身份运行。
我尝试通过从命令行设置 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();
感谢您的帮助。
克里斯
一般来说,你need在接口上接收原始数据包的 root 权限。此限制是一种安全预防措施,因为接收原始数据包的进程可以访问使用该接口的所有其他进程和用户的通信。
但是,如果您有权访问计算机上的 root,则可以使用setuid http://en.wikipedia.org/wiki/Setuid#setuid_on_executables标志赋予您的进程 root 权限即使进程以非 root 用户身份执行.
首先,确保当进程以 root 身份运行时成功设置此功能。然后使用
sudo chown root process
sudo chmod ugo+s process
将 root 设置为进程的所有者并设置setuid
旗帜。然后检查当其他用户运行该进程时是否设置了该功能。因为这个过程现在将有all超级用户权限,您应该遵守安全预防措施,并在您的代码不再需要该权限时立即删除该权限(启用 CAP_NET_RAW 后)。
您可以关注这个方法 https://www.securecoding.cert.org/confluence/display/seccode/POS37-C.+Ensure+that+privilege+relinquishment+is+successful以确保您正确地丢弃它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)