傻傻的烤面包 · Python进阶篇(三)-- ...· 16 小时前 · |
有胆有识的人字拖 · 必知丨在丰台小升初,第一批和第二批有何区别? ...· 2 月前 · |
耍酷的书包 · 一汽-大众ID.4 ...· 1 年前 · |
旅行中的书包 · 探讨NBA历史上最伟大的中锋,约基奇该被高估 ...· 1 年前 · |
很酷的跑步机 · 塔奇漫画下拉式,阅读内容 - 快看漫画· 1 年前 · |
打酱油的手套 · 电影《不能错过的只有你》中有哪些令人潸然泪下 ...· 1 年前 · |
在嵌入式系统(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();
谢谢你的帮助。克里斯
通常, 需要 根权限才能在接口上接收原始数据包。这种限制是一种安全防范措施,因为接收原始数据包的进程可以使用该接口访问所有其他进程和用户的通信。
但是,如果您可以访问机器上的根用户,则可以使用 塞图德 标志授予进程根权限,即使进程是以非根用户的身份执行的。
首先,确保在进程作为root运行时成功地设置了此功能。然后使用
sudo chown root process
sudo chmod ugo+s process
若要将根设置为进程所有者并设置
setuid
标志,请执行以下操作。然后检查是否在进程由其他用户运行时设置了该功能。因为这个过程现在将拥有所有的超级用户权限,所以您应该遵守安全防范措施,并在代码不再需要时(在启用CAP_NET_RAW之后)立即取消特权。
您可以跟踪 这种方法 以确保正确丢弃它们。
进程必须以根用户身份运行,或者在可执行文件上具有CAP_NET_RAW功能。
为了设置CAP_NET_RAW,需要以root用户的身份运行setcap命令。一旦设置完毕,您就可以作为另一个用户运行可执行文件,并且它可以访问原始数据包捕获。
如果您仍然没有根访问权限,也不能让任何具有根访问权限的人在可执行文件上设置CAP_NET_RAW或setuid,您将无法作为非根用户进行数据包捕获。
您可以赋予可执行程序使用
CAP_NET_RAW
特权的能力,而无需授予它其他根权限。
$ setcap cap_net_raw=pe *program*
没有这个特权,你就不能给予这个特权。当然,root可以将此特权赋予程序。
内核中不支持 TL;DR IMHO < 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
在没有CAP_NET_RAW的情况下运行ping (即没有设置功能或没有设置-uid)是在 87dbb3a5db657d5eae6934707beaf0507980a1c3 版本中为ping实现的,该版本在iputils s20150815中发布:
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
很酷的跑步机 · 塔奇漫画下拉式,阅读内容 - 快看漫画 1 年前 |