Como atualizar as configurações de usuário / grupo de um processo em execução?

4

Suponha que eu altere algumas configurações do usuário como seu grupo de login inicial ou adicione-o a um novo grupo. Agora posso fazer su user e trabalhar com essas novas configurações. Mas todos os processos anteriormente em execução ainda terão as mesmas permissões de antes.

Como posso forçar um processo em execução específico a reler /etc/passwd e /etc/group para reinicializar suas configurações de usuário e grupo, sem encerrar nenhuma atividade que estava fazendo? Eu tentei anexar ao processo com gdb e fazer print setuid(MY_USER_ID) , mas apesar do resultado ser 0 (ou seja, sucesso), o processo ainda permaneceu com os mesmos dados (verificado em bash executando groups para ver se apareceu um grupo adicional).

    
por Ruslan 10.06.2015 / 05:47

2 respostas

2

Tentativa muito interessante. Na verdade, os grupos suplementares do processo (definidos em /etc/group ) são definidos por setgroups chamada do sistema. Requer o privilégio CAP_SETGID ou ser root.

Então você pode fazer assim:

# id
uid=0(root) gid=0(root) groups=0(root)

# gdb -q id
Reading symbols from id...(no debugging symbols found)...done.
(gdb) b getgroups
Breakpoint 1 at 0x401990
(gdb) run
Starting program: /usr/bin/id 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, getgroups () at ../sysdeps/unix/syscall-template.S:81
81  ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) call setgroups(5, {1, 2, 3, 4, 5})
$1 = 0
(gdb) d 1
(gdb) c
Continuing.
uid=0(root) gid=0(root) groups=0(root),1(daemon),2(bin),3(sys),4(adm),5(tty)
[Inferior 1 (process 8059) exited normally]
(gdb) 
    
por 10.06.2015 / 06:08
2

Parece um exercício sem sentido.

O processo de destino pode não ter todos os direitos necessários para alternar as credenciais, pode ter seu uid / gid armazenado em algum lugar e usado ativamente, para que uma mudança de credencial surpresa possa realmente quebrar as coisas.

Existem várias entidades que sabem quem as possui - arquivos, sysv ipc.

Então, você precisaria / pararia / todos os processos de destino e atualizaria todos os locais possíveis.

Mas alguns processos podem ser bloqueados de maneira ininterrupta no kernel - e agora?

Para fins de brinquedo, você precisaria de um módulo de kernel mudando credenciais para processos, mas mesmo isso não pode lidar facilmente com processos bloqueados.

Ou, em outras palavras: o que você realmente está tentando realizar e por quê?

    
por 10.06.2015 / 07:42