更改正在运行的进程的EUID


Answers:


17

如果该进程以root-privileges运行,则可以将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

3
+1为完成任务提供了创新的方法……
庸医吉x德09年

哇...是的,很有创意。确实,我没有想到要使用调试器附加到该过程。有了一点“期望”黑客,就可以实现适用于某些情况的“ cheuid <processID> <EUID>”。具体来说,我认为gdb的执行者和受影响的进程都必须是root用户...因此实用性有限。AFAIK仅以root用户身份运行gdb并连接到非root用户进程,则seteuid将会失败,因为seteuid将以执行进程的特权而不是调试器的特权运行。
pbr

2

如果您正在谈论更改其自己的EUID的流程,则有很多方法可以做到这一点。

  • setuid()-作为副作用,当EUID为0的进程使用时,设置EUID
  • seteuid()
  • setreuid()

根据程序的有效UID,以及是否存在保存的UID,您可以在非根程序中的两个EUID值之间切换。对于具有root用户特权的程序,您必须要小心-必须确定更改是否应不可逆,并为作业使用正确的功能。(将setuid()用作根是不可逆的。)

如果您要更改已经从单独的流程运行的流程,则没有标准的方法可以执行,而且我不确定还有很多非标准的方法。您也许可以在/ dev / kmem中查看一些信息,但是“细冰”这个表述浮现在脑海。


2

没有“从命令行”对任何正在运行的进程执行此操作的方法。

我可以肯定地说。唯一的“也许”是/ proc,我在那里(从字面上和通过google)戳了一下,就/ proc中允许更改EUID的内容陷入僵局。您可以了解/ proc / {pid} / status中的UID和GID设置-但至少在我所知的范围内,无法使用/ proc中的任何内容进行更改。

但是,如果要控制要更改的流程的源代码,则可以很容易地实现类似的工作-一种从命令行更改流程的EUID的方法。您可以为SIGUSR1实现一个信号处理程序,并让进程更改其自己的EUID,但是当它接收到该信号时就需要它。然后,您只需按照要求从命令行通过“ kill”发送SIGUSR1信号的进程,它将为您更改其EUID。

这可能不是您所想的,但是...这是您如何执行此问题的答案...,这是我能想到的唯一答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.