Se você der uma olhada no executável sudo
:
$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun 3 2011 /usr/bin/sudo
Você notará que ele carrega os bits de permissão ---s--x--x
. Eles podem ser divididos da seguinte maneira:
-|--s|--x|--x
- - first dash denotes if a directory or a file ("d" = dir, "-" = file)
--s - only the setuid bit is enabled for user who owns file
--x - only the group execute bit is enabled
--x - only the other execute bit is enabled
Portanto, quando um programa tem o bit setuid ativado (também conhecido como SUID), significa que quando alguém executa esse programa, ele será executado com as credenciais do usuário que possui o arquivo, também conhecido como. raiz neste caso.
Exemplo
Se eu executar o seguinte comando como usuário saml:
$ whoami
saml
$ sudo su -
[sudo] password for saml:
Você notará que a execução do sudo
realmente está sendo executada como root:
$ ps -eaf|grep sudo
root 20399 2353 0 05:07 pts/13 00:00:00 sudo su -
mecanismo de setuid
Se você está curioso para saber como o SUID funciona, dê uma olhada man setuid
. Aqui está um trecho da página de manual que explica melhor do que eu poderia:
setuid () define o ID do usuário efetivo do processo de chamada. Se o UID efetivo do chamador for raiz, o UID real e o ID do usuário definido também serão definidos. No Linux, setuid () é implementado como a versão POSIX com o recurso _POSIX_SAVED_IDS. Isso permite que um programa set-user-ID (que não seja root) abandone todos os seus privilégios de usuário, faça algum trabalho sem privilégios e, em seguida, recrie novamente o ID de usuário efetivo original de maneira segura.
Se o usuário for root ou o programa estiver configurado como user-ID-root, deve-se tomar um cuidado especial. A função setuid () verifica o ID do usuário efetivo do chamador e, se for o superusuário, todos os IDs do usuário relacionados ao processo estão definidos como uid. Depois que isso ocorre, é impossível para o programa recuperar privilégios de root.
O conceito principal aqui é que os programas têm uma identificação de usuário real (UID) e uma identificação efetiva (EUID). Setuid está definindo o ID do usuário efetivo (EUID) quando este bit está ativado.
Portanto, da perspectiva do kernel, sabe-se que, no nosso exemplo, saml
ainda é o proprietário original (UID), mas o EUID foi definido com quem é o proprietário do executável.
setgid
Também devo mencionar que, quando estamos quebrando as permissões no comando sudo, o segundo grupo de bits era para permissões de grupo. Os bits do grupo também têm algo semelhante ao setuid chamado set group id (também conhecido como setgid, SGID). Isso faz o mesmo que o SUID, exceto que ele executa o processo com as credenciais do grupo em vez das credenciais do proprietário.
Referências
sudo -s
vez de,sudo su
porque é um uso inútil desu
. :)O
sudo
binário real é raiz setuid , e você não pode simplesmente criar arquivos que são configurados dessa maneira.fonte
Para responder à parte sobre syscalls que ninguém parece ter tocado, um dos syscalls importantes é setresuid () ou setresgid (). Tenho certeza de que existem outros, mas esses 2 parecem bastante específicos para setuid / sudo.
fonte