É um pouco complicado. O sistema operacional kernel usa o UID e o GID efetivos de um processo determinar seus privilégios / autorizações; eles são usados para
- permitindo / desaprovando operações comuns do sistema de arquivos (por exemplo, abrir, vincular / desvincular) com base nas regras de usuário / grupo / outras,
- definindo a propriedade dos arquivos recém-criados,
- determinar quais outros processos um processo pode enviar sinais para e
- decidindo se um processo pode montar e desmontar sistemas de arquivos, altere a data, desligar o sistema, etc.
e provavelmente outras coisas.
Mas, o problema é que quando um programa precisa tomar algum tipo de decisão de acesso / autorização,
geralmente precisa usar o UID e o GID reais.
Considere: quando seu programa with_sudo.c
executar sudo
,
o UID efetivo é raiz (0) e o UID real é você (1000), conforme demonstrado pelo seu printf
.
Mas isso é exatamente o mesmo que acontece se você executar sudo
de um shell sem privilégios.
Sempre que sudo
é executado,
o UID efetivo é 0 - então sudo
não pode usar isso para decidir como se comportar.
Tem que usar o UID real para descobrir quem você realmente é
para determinar o que você pode fazer em sudo
.
Somente se o UID real for 0, o sudo
concluirá que você é "realmente" root,
ou pelo menos que não possa determinar confiavelmente sua identidade real,
então não sabe quais restrições aplicar a você,
e apenas executa o cat
sem pedir nenhuma autenticação adicional de você.