给正在运行的进程授予权限

4

一个已经运行的进程需要一个特权指令,例如使用SO_RCVBUFFORCE套接字选项。该进程正在以普通用户进程的身份运行。

如何为此进程授予权限?基于文件的能力设置仍然是一个梦想吗?

我尝试了libcap包中的/usr/sbin/setpcaps实用程序和cap_set_proc() api,但是CAP_SETPCAP功能在系统上被阻止(一个基于Fedora 4和2.6.20内核的遗留系统),因此它不能为不同于自身的进程授予/删除功能。

考虑将临时root uid设置为该进程,但是否有一种方法可以更改外部已运行进程的有效UID?setuid()/seteuid()/...函数只能修改当前进程(调用该函数的进程)。

1个回答

5
无法实现。能力模型(“允许的能力集”)背后的安全模型是,进程可以放弃它们,但永远不能添加。
如果您无法在架构中正确设置从进程的父级继承能力,则可以尝试使用文件描述符传递在单独的进程中进行setsocktopt()调用。也就是说,设置一个运行所需特权级别的"sockopt daemon",使用新套接字连接到它,在使用sendmsg()传递文件描述符,并让它执行必要的调用。这是一个丑陋的API,解决方案过于复杂。但与重新设计应用程序的启动和初始化结构相比,这可能更可取。

如果启用了CAP_SETPCAP,则可以使用cap_set_proc()向进程添加新的功能。 - CsTamas
我接受这个答案,因为它指向了可能的解决方案:要么有一个守护进程并使用文件描述符传递来传递套接字(参见Kragen Sitaker在http://lists.canonical.org/pipermail/kragen-hacks/2002-January/000292.html的帖子),要么对于每个请求启动具有setuid标志的实用程序(可执行文件)并使用fork() + exec()继承套接字描述符。 - CsTamas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接