Alterar EUID do processo em execução

12

No Linux, como posso alterar o EUID do processo em execução na linha de comando (desde que eu tenha acesso root)?

jackhab
fonte

Respostas:

17

Se o processo estiver sendo executado com privilégios de root , você poderá anexar o gdb ao processo e chamar o seteuid de dentro desse processo.

Exemplo:

[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
Kjetil Jørgensen
fonte
3
+1 para abordagem criativa para realizar a tarefa ...
quack quixote
Uau ... sim, isso é criativo. Na verdade, eu não tinha pensado em me conectar ao processo com um depurador. Com um pouco de hackery "expect", pode-se implementar "cheuid <processID> <EUID>" que funcionaria para ALGUMAS situações. Especificamente, acredito que o executor do gdb e o processo afetado teriam que ser raiz ... portanto, isso é de utilidade limitada. Como o AFAIK apenas executando o gdb como root, conectando-se a um processo não raiz, o seteuid falhará, pois será executado com os privs do processo de execução, não os privs do depurador.
PBR
2

Se você está falando de um processo que altera seu próprio EUID, há várias maneiras de fazer isso.

  • setuid () - como efeito colateral define EUID quando usado por um processo com EUID 0
  • seteuid ()
  • setreuid ()

Dependendo da UID efetiva do programa e da existência de uma UID salva, você poderá alternar entre dois valores de EUID em um programa não raiz. Com um programa com privilégios de root, você precisa ter cuidado - você precisa decidir se a alteração deve ser irreversível e usar a função correta para o trabalho. (Usar setuid () como raiz é irreversível.)

Se você está tentando alterar um processo que já está sendo executado a partir de um processo separado, não há uma maneira padrão de fazê-lo - e também não tenho certeza de que existem muitas maneiras não-padrão. Você pode encontrar algumas informações em / dev / kmem, mas a expressão 'gelo fino' vem à mente.

Jonathan Leffler
fonte
2

Não há como fazer isso "na linha de comando" para qualquer processo em execução.

Eu posso dizer isso com certa segurança; o único "talvez" era / proc e eu vasculhei lá (literalmente e via google) e corri para um beco sem saída com relação a qualquer coisa em / proc que permitisse alterar o EUID. Você pode APRENDER quais são as configurações de UID e GID em / proc / {pid} / status - mas não pode alterá-las usando nada em / proc, pelo menos até onde eu sei.

Mas é fácil o suficiente para fazer algo assim funcionar - uma maneira de alterar o EUID de um processo, a partir da linha de comando - se você controlar o código-fonte do processo que deseja alterar. Você pode implementar um manipulador de sinal para, por exemplo, SIGUSR1 e fazer com que o processo altere seu próprio EUID, no entanto, você precisa quando recebe esse sinal. Então você simplesmente enviaria o processo que o SIGUSR1 sinalizou, via "kill" ... a partir da linha de comando, como você pediu ... e isso mudaria seu EUID para você.

Pode não ser o que você estava pensando, mas ... é uma resposta para sua pergunta de como fazê-lo ... e é a única resposta em que consigo pensar.

pbr
fonte