修改正在运行的进程的EUID

修改正在运行的进程的EUID

在 Linux 上,如何从命令行更改正在运行的进程的 EUID(假设我有 root 访问权限)?

答案1

如果这个过程是以 root 权限运行,您可以将 gdb 附加到该进程并从该进程内部调用 seteuid。

例子:

[root@user-desktop ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t

[root@user-desktop ~]# gdb /bin/bash $$
GNU gdb Fedora (6.8-27.el5)
# cut copyright & license statements
This GDB was configured as "x86_64-redhat-linux-gnu"...
# cut some initialization output    
0x00000036b0a99335 in waitpid () from /lib64/libc.so.6
(gdb) call seteuid(500)
$1 = 0 
(gdb) quit
The program is running.  Quit anyway (and detach it)? (y or n) y
Detaching from program: /bin/bash, process 29017

[root@user-desktop ~]# id
uid=0(root) gid=0(root) euid=500(user) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t

答案2

如果您正在谈论一个改变其自身 EUID 的进程,那么有很多方法可以做到这一点。

  • setuid() - 当 EUID 为 0 的进程使用时,会产生副作用,即设置 EUID
  • 设置 euid()
  • setreuid()

根据程序的有效 UID 以及是否有已保存的 UID,您可能能够在非 root 程序中在两个 EUID 值之间切换。对于 root 特权程序,您必须小心 - 您必须决定更改是否不可逆,并使用正确的函数来完成工作。(以 root 身份使用 setuid() 是不可逆的。)

如果您尝试从单独的进程更改已在运行的进程,则没有标准方法可以做到这一点 - 而且我也不确定是否有很多非标准方法。您可能能够在 /dev/kmem 中找到一些信息,但“薄冰”这个表达浮现在脑海中。

答案3

无法通过“命令行”对任何正在运行的进程执行此操作。

我可以相当肯定地说;唯一的“可能”是 /proc,我在那里搜索了一番(逐字逐句地和通过谷歌),但找不到 /proc 中允许更改 EUID 的任何内容。您可以在 /proc/{pid}/status 中了解 UID 和 GID 的设置 - 但您不能使用 /proc 中的任何东西来更改它们,至少据我所知是这样。

但是,如果您控制要更改的进程的源代码,那么很容易实现这样的工作——一种从命令行更改进程的 EUID 的方法。您可以为 SIGUSR1 实现一个信号处理程序,并让进程在收到该信号时根据需要更改其自己的 EUID。然后,您只需通过“kill”从命令行向进程发送 SIGUSR1 信号,正如您所要求的那样……它会为您更改其 EUID。

这可能不是您所想的,但是...这是对您如何做到这一点的问题的回答......而且这是我能想到的唯一答案。

相关内容