# Setuid

setuid e setgid (abreviações de "set user ID upon execution" e "set group ID upon execution", que significam, respectivamente, "definir ID de usuário sob execução" e "definir ID de grupo sob execução") são sinalizadores de direitos de acesso do Unix que permitem que usuários rodem um executável com as permissões do dono ou grupo do executável, respectivamente, e alterem o comportamento em diretórios.
Eles são frequentemente utilizados para permitir que usuários, em um sistema de computador, executem programas com privilégios elevados temporariamente a fim de realizar uma tarefa específica. Enquanto que os privilégios assumidos de id de usuário ou id de grupo fornecidos não são sempre elevados, no mínimo eles são específicos.
setuid e setgid são necessários para tarefas que requerem privilégios mais elevados que aqueles os quais usuários comuns, tais como mudança de sua senha de login. Algumas das tarefas que exigem privilégios elevados podem não ser imediatamente óbvias, entretanto - tais como o comando ping, que tem que enviar e escutar pacotes de controle em uma interface de rede.

## Efeitos do setuid e do setgid

Os sinalizadores setuid e o setgid possuem um significado inteiramente diferente dependendo se eles são definidos para um arquivo ou para um diretório.

### Quando definir um arquivo executável

Quando os atributos setuid e setgid são definidos em um arquivo executável, então quaisquer usuários capazes de executar o arquivo executarão automaticamente o arquivo com os privilégios do proprietário do arquivo (normalmente o root) e/ou do grupo do arquivo, dependendo dos sinalizadores definidos. Isso permite que o designer do sistema permita que programas confiáveis ​​sejam executados, o que, de outra forma, o usuário não teria permissão para executar. Isto pode nem sempre ser óbvio. Por exemplo, o comando ping pode precisar de acesso a privilégios de rede que um usuário normal não pode acessar, portanto, pode receber o sinalizador setuid para garantir que um usuário que precise fazer ping em outro sistema possa fazê-lo, mesmo que sua própria conta não tenha o privilégio necessário para enviar pacotes.
Por motivos de segurança, o usuário invocador é geralmente proibido pelo sistema de alterar o novo processo por quaisquer meios, como por meio do uso do ptrace, LD_LIBRARY_PATH ou enviando sinais para ele, para explorar o privilégio elevado, embora os sinais do terminal ainda sejam aceitos.
Os bits setuid e setgid são normalmente configurados com o comando chmod definindo o dígito octal de alta ordem para 4 para setuid ou 2 para setgid. "chmod 6711 arquivo" definirá os bits setuid e setgid (4 + 2 = 6), tornando o arquivo com permissões de leitura / gravação / execução para o proprietário (7), e executável pelo grupo (primeiro 1) e outros (segundo 1 ). Quando um usuário diferente do proprietário executa o arquivo, o processo será executado com permissões de usuário e grupo definidos pelo seu proprietário. Por exemplo, se o arquivo pertencer ao usuário root e ao grupo wheel, ele será executado como root:wheel, independentemente de quem executar o arquivo.
A maioria das implementações do comando chmod também suporta argumentos simbólicos mais refinados para definir esses bits. A maneira numérica de definir essas permissões como usadas acima "chmod 6711 arquivo" não permite retirar essas mesmas permissões como seria de esperar com "chmod 0711 arquivo". O modo de granulação mais fina é mostrado na demonstração abaixo como "chmod ug + s".