Como funcionam os internos do sudo?

74

Como sudofunciona internamente? Como é possível que ele se torne root sem ter a senha root, ao contrário su? Quais syscalls etc. estão envolvidos no processo? Não é uma brecha de segurança no Linux (por exemplo, por que não consegui compilar um patch pesado sudoque fizesse o que fazia regularmente sudo, mas não pedia a senha do usuário sem privilégios)?

Eu li o login e su internals . Eu também li Como o sudo deve ser usado? mas, apesar do título, eles lidam principalmente com as diferenças entre sue sudo.

strugee
fonte

Respostas:

80

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 sudorealmente 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, samlainda é 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

slm
fonte
4
Você deve usar em sudo -svez de, sudo suporque é um uso inútil de su. :)
Totor
4

O sudobinário real é raiz setuid , e você não pode simplesmente criar arquivos que são configurados dessa maneira.

setuid e setgid (abreviação de "definir ID do usuário na execução" e "definir ID do grupo na execução", respectivamente) [1] são sinalizadores de direitos de acesso Unix que permitem aos usuários executar um executável com as permissões do proprietário ou grupo do executável, respectivamente, e para alterar o comportamento nos diretórios.

Ignacio Vazquez-Abrams
fonte
ok, isso responde parte da minha pergunta. se você elaborar sobre como sudo usa este bit, e um pouco mais sobre o que isso pouco faz, eu adoraria aceitar essa resposta
strugee
2

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.

Gregg Leventhal
fonte