更改当前正在运行的进程的所有者

8
我有一个进程,当前正在运行,它的pid是$PID,由用户foo拥有,该用户不是root。我想将此进程的所有权转移到另一个用户bar,该用户也不是root。
是否有一种shell命令可以更改进程的所有者?我考虑类似于chown的进程命令,应该像这样: chownproc [option] PID 虽然这个问题这个问题很相似,但并不完全符合我的要求。而且chown的man页面并没有提到进程,只涉及文件。
如果没有这样的命令,那么为什么还没有实现或不可能实现呢?

4
我从未听说过这样的机制。安全影响非常严重——该进程使用ID“foo”打开了文件和其他资源;如果其中任何一个被允许使用ID“bar”,会怎样?这可能是为什么不这样做的主要原因之一。 - Jonathan Leffler
没有用户级别的程序可以做到这一点。你需要编写一个内核模块来实现。例如,https://github.com/xuancong84/supgroup - xuancong84
2个回答

7

您无法这样做,因为没有此系统调用。不过,根据您想如何影响进程的方式,如果该进程对您的系统不是关键性的,您可以尝试一些黑客技巧。

(gdb) attach process_id
(gdb) call putenv ("UID=1234")
(gdb) call putenv ("EUID=1234")
(gdb) call putenv ("GID=1234")
(gdb) detach

请注意,这样是行不通的:
(gdb) call setuid(1234)

这并不是真正回答你的问题(更改正在运行的进程的所有者),但考虑到您可能想更改所有者以影响进程的某些方面,也许这个方法可以帮助。

请记住,这很可能会破坏您的进程。

(基于此:有没有办法更改另一个进程的环境变量?


1
现在,在内核级别上可以做到这一点。
这实际上是Linux内核的一个设计缺陷,即凭据更改仅发生在磁盘上而不在内存中。具体来说,当凭据(UID、GID或附加组列表)发生更改时,所有现有进程将继续使用其先前的凭据并享有先前授予的数据访问权限。而且没有一个单独的API函数可以在整个系统(即所有进程)中传播凭据更改。由于这个缺陷,没有用户级程序可以做到你想要的那样。你必须结束当前的进程并创建一个新的进程。
然而,在内核级别上,这是可能的。我刚刚尝试了一个简单的程序,它可以工作。(https://github.com/xuancong84/supgroup
然而,一般来说这样做并不是一个好主意,因为一般情况下,程序可能会有很多外部交互,例如打开的文件句柄、在其他CPU核心上运行的子进程/线程、绑定的管道、打开的设备等等。因此,在运行时更改UID/GID可能会导致许多未定义的行为,其中一些可能会引发错误(例如,管道中断,I/O通信中止),一些可能会变得危险(例如,系统崩溃)。我已经测试过这个程序在简单的程序上可以工作(例如nc -l 8080),但对于一个更大、更复杂的程序,它在许多CPU核心和GPU CUDA核心上运行许多线程,具有大量的网络活动和磁盘I/O活动,我不确定会发生什么。

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