Para alterar sua própria senha, o usuário precisa de alguma forma obter o novo hash de senha gravado em /etc/shadow
(ou /etc/passwd
em sistemas legados sem implementação de senha de sombra).
Se o usuário tiver permissão para gravar o acesso ao arquivo, o usuário poderá alterar qualquer item desse arquivo: o usuário poderá alterar as senhas de alguém , representar qualquer usuário e obter acesso root. Isso claramente não é aceitável.
A solução é um "gatekeeper" que tem o poder de permitir que o usuário execute um ato específico com acesso no nível de raiz, ou seja, alterar somente a senha própria .
O programa /bin/passwd
é um desses programas de gatekeeper. Ele é escrito com muito cuidado para garantir que ele permita a alteração da própria senha do usuário, a menos que o usuário seja root (ou, em alguns casos, tenha privilégios extras apropriados). Quando o programa gatekeeper está pronto, suas permissões são definidas para que os usuários possam executá-lo, mas não modificar o conteúdo do programa. Em seguida, a permissão root setuid é adicionada ao programa: faz com que qualquer processo que execute esse programa específico tenha acesso root somente para a duração desse processo específico .
Às vezes, as permissões dos programas-raiz do setuid são definidas como 4111, ou ---s--x--x
, de modo que os usuários não-root só podem executar o programa, mas não ler seu conteúdo de outra maneira.
Existem algumas proteções para programas setuid que são incorporados ao sistema operacional: por exemplo, você não pode anexar um depurador a um processo que esteja executando um programa raiz setuid, a menos que você seja root. E se um programa setuid for legível por usuários comuns e um usuário tentar fazer uma cópia desse programa, a cópia geralmente perderá o bit de permissão setuid; e mesmo que isso não ocorresse, a cópia será (normalmente) de propriedade do usuário que fez a cópia, de modo que não será mais setuid root , mas setuid , e muito provavelmente não pode fazer o seu trabalho de qualquer maneira.