Alterar EUID do processo em execução

13

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

    
por jackhab 18.10.2009 / 10:26

3 respostas

18

Se o processo estiver sendo executado com privilégios de root , você poderá anexar gdb ao processo e chamar 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
    
por 11.11.2009 / 12:27
3

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

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

Dependendo do UID efetivo do programa e se há um UID salvo, você poderá alternar entre dois valores de EUID em um programa não-raiz. Com um programa privilegiado de root, você precisa ter cuidado - você tem que decidir se a mudança deve ser irreversível e usar a função correta para o trabalho. (Usar setuid () como root é 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 sei se há muitas maneiras não padronizadas. Você pode conseguir algumas informações em / dev / kmem, mas a expressão 'gelo fino' vem à mente.

    
por 26.10.2009 / 17:43
2

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

Eu posso dizer isso com alguma certeza; o único "talvez" foi / proc e eu procurei lá (literalmente e via google) e cheguei a um beco sem saída em relação a qualquer coisa em / proc permitindo a mudança do 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 fazer algo assim - 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, digamos, SIGUSR1 e fazer com que o processo mude seu próprio EUID, conforme necessário, quando receber esse sinal. Então você simplesmente enviaria o processo que o sinal SIGUSR1, via "kill" ... da linha de comando, como você pediu ... e mudaria seu EUID para você.

Isso pode não ser o que você estava pensando, mas ... é uma resposta à sua pergunta sobre como fazer isso ... e é a única resposta em que consigo pensar.

    
por 11.11.2009 / 00:55