root
pode se tornar polkitd
por meio de uma chamada de sistema apropriada, por exemplo seteuid(2)
como pode ser demonstrado com
$ cat becomepolkit.c
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main(void)
{
// ID obtained via 'id polkitd' on a Centos7 system
// other systems may vary
seteuid(999);
printf("look for %d in process list\n", getpid());
sleep(99999);
return 0;
}
$ make becomepolkit
cc becomepolkit.c -o becomepolkit
$ sudo ./becomepolkit &
[1] 10914
$ look for 10915 in process list
$ ps auwwx | grep '1091[5]'
polkitd 10915 0.0 0.0 4160 340 pts/0 S 22:46 0:00 ./becomepolkit
$
Normalmente, root
através do sistema init (por exemplo, systemd
) ou cron
iniciará um processo como root
e, em seguida, alterará o usuário do processo; nenhum acesso ao shell é necessário para que isso aconteça. Você pode observar isso para um processo arbitrário executando o processo em strace
ou alguma outra ferramenta de rastreamento:
sudo strace -o blah ./becomepolkit
look for 10968 in process list
^C$ grep 999 blah
setresuid(-1, 999, -1) = 0
nanosleep({99999, 0}, {99997, 670178798}) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
$
Então aqui o Linux está realmente usando a chamada setresuid(2)
mas a mesma diferença, o processo aparecerá como polkitd
na tabela de processos.