Eu li muitas perguntas e respostas sobre como o setuid
bit funciona e sobre como sudo
funciona, e acho que entendi essas coisas.
No entanto, não consegui descobrir o que deve acontecer quando um programa é executado via sudo se o próprio programa tiver o setuid
bit definido . A questão é melhor explicada por um exemplo:
No sistema em questão, existe um usuário chamado user1
. O sistema foi sudo
instalado e configurado corretamente para que o root
usuário possa executar programas como qualquer usuário diferente que desejar. Além disso, existe um programa /usr/bin/exampleprog
que é de propriedade root:wheel
e tem os bits setuid
e definidos:setgid
root@morn ~ # dir /usr/bin/exampleprog
-rwsr-sr-x 1 root wheel 92K 2017-11-16 23:42 /usr/bin/exampleprog
Agora eu entro como root e executo o seguinte comando:
root@morn ~ # sudo -u user1 /usr/bin/exampleprog
O que acontece depois? É exampleprog
executado como user1
(como poderia ser esperado das opções fornecidas a sudo
) ou é executado como root (porque o executável pertence ao root e tem seu setuid
bit definido)?
Para tornar as coisas mais complicadas, existe um programa adicional /usr/bin/wrapper
, também de propriedade de root:wheel
, mas sem os bits setuid
e :setgid
root@morn ~ # dir /usr/bin/wrapper
-rwxr-xr-x 1 root wheel 15K 2017-11-16 23:42 /usr/bin/wrapper
O wrapper
programa, ao ser executado, em algum momento executa (spawns) /usr/bin/exampleprog
.
Agora eu executo:
root@morn ~ # sudo -u user1 /usr/bin/wrapper
Quando wrapper
desova exampleprog
, o último será executado como user1
ou como root
?
Você pode experimentar isso copiando o
id
programa em algum lugar e alterando suas permissões. Isso mostrará queexampleprog
é executado com um uid efetivo de root e um uid real correspondente auser1
.Considere o que aconteceria se você efetuasse login como
user1
e executasseexampleprog
: como o último é suid root, você esperaria que ele fosse executado com um uid efetivo de root. O mesmo se aplica quando você executa o programa por meio dosudo
.