Li algumas coisas sobre a diferença entre ID de usuário real e efetivo. Achei que entendi, mas tenho uma dúvida: pelo meu entendimento, no exemplo abaixo o comando $ id -un
deveria retornar root
como usuário efetivo e não jack
:
$ sudo cp /usr/bin/bash /usr/bin/bashroot
$ sudo chmod u+s /usr/bin/bashroot
$ ls -l /usr/bin/bashroot
-rwsr-xr-x 1 root root 1234376 oct. 25 15:42 /usr/bin/bashroot
$ bashroot
$ id -un
jack
$ id -unr
jack
bashroot
tem setuid e pertence a root
, então de acordo com minha compreensão eu esperava $ id -un
retornar root
, não jack
.
Do que sinto falta?
[EDITAR] Mais especificamente, por que não /usr/bin/bashroot
se comporta como /usr/bin/passwd
, visto que ambos possuem setuid ?
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 63960 févr. 7 2020 /usr/bin/passwd
$ ls -l /usr/bin/bashroot
-rwsr-xr-x 1 root root 1234376 oct. 25 15:42 /usr/bin/bashroot
$ passwd
Changing password for jack.
Current password:
Então, em outro terminal:
$ bashroot
$ ps -a | grep passwd
1682362 pts/3 00:00:00 passwd
$ ps -eo pid,ruid,euid | grep 1682362
1682362 1000 0
$ ps -a | grep bashroot
1682405 pts/4 00:00:00 bashroot
$ ps -eo pid,ruid,euid | grep 1682405
1682405 1000 1000
O UID efetivo passwd
é root
(0), o que é esperado. Por que o UID efetivo é bashroot
1000 ( jack
) e não root
?
[EDIT2: SO]
$ cat /etc/debian_version
11.6
$ uname -a
Linux d11work 5.10.0-20-amd64 #1 SMP Debian 5.10.158-2 (2022-12-13) x86_64 GNU/Linux
$ bash --version
GNU bash, version 5.1.4(1)-release (x86_64-pc-linux-gnu)
[EDIT3] Veja a resposta de Stephen Kitt :
$ bashroot -p
# id -un
root
# id -unr
jack
Bash impõe isso: se for setuid, mas não for executado em modo privilegiado (procure por
-p
), ele define o ID do usuário efetivo para o ID do usuário real:Para obter o efeito que procura, você precisa executar
bashroot -p
. Você notará a diferença imediatamente: o prompt do shell é#
em vez de$
.