sudo
é o chamado "SetUID binário", como você pode ver na saída de ls -l
:
$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 159016 Mar 21 20:40 /usr/bin/sudo
O s
na quarta coluna (onde você normalmente encontra um x
nos arquivos executáveis) informa que o bit SetUID está definido. Esse bit tem um significado significativo: quando um binário com o conjunto de bits SetUID é executado, ele não é executado com o ID do usuário chamado, mas com o ID do usuário do binário (neste caso, root
).
E essa é a pista. sudo
é sempre executado com privilégios de superusuário (como root
). Portanto, sudo
tem a capacidade de executar algumas tarefas privilegiadas, como chamar funções do sistema, somente permitidas para root
. Uma dessas chamadas de sistema (a essencial) são setuid(2)
e amigos. Ao chamar setuid()
, um processo pode alterar seu UID para qualquer UID desejado (representando-se, assim, outro usuário).
O que o sudo
faz é:
- leia e analise
/etc/sudoers
, procure o usuário solicitante e suas permissões, - solicite uma senha ao usuário solicitante (geralmente, essa é a senha do usuário, mas também pode ser a senha do usuário de destino ou ignorada como com
NOPASSWD
) - crie um processo filho no qual ele chama
setuid()
para alterar para o usuário de destino - executa um shell ou o comando dado como arguemnts neste filho