Um programa, pwrstat por exemplo, pode ser executado por IDs de usuário comuns se o setuid (chmod 4xxx) estiver definido e o arquivo pertencer ao root. Quando a permissão setuid é definida, a entidade é executada como se fosse o proprietário do arquivo. Se for root, isso implica privilégios de root. Deve-se seguir que se um shell tiver setuid e for de propriedade do root, ele deverá ser executado com privilégios de root. Um exemplo seria
#!/bin/bash
cp $1 /var/aa.aa
No entanto, alguém que não seja o root executando o shell de exemplo (com permissão -rwsr-xr-x) obtém permissão negada na cópia.
OK, um programa funciona, um shell não. Tentei criar um programa C simples que usa
system ()
Mesmo resultado.
A questão principal aqui é por que o setuid não permite que um shell seja executado como root. Uma subquestão é por que um programa C não pode emitir os comandos que estariam nesse shell?
Alguns dos usuários de alta reputação estão votando para encerrar esta questão, pois ela é semelhante às perguntas anteriores, EXCETO que essas perguntas e respostas anteriores são complexas. Por favor, não esqueça que muitos usuários aqui provavelmente se perderiam nos uids, setuid, seteuids e outros enfeites, o que faz sentido para aqueles que provavelmente estão prontos para fazer um exame de certificação de administração Linux.
A parte a que você está se referindo permite que quem executa esse item o execute como se fosse o mesmo ID que possui o arquivo. Isso não significa que qualquer processo filho herde o UID do processo original.
No Ubuntu, as coisas funcionam como processos. Mesmo o que parecem comandos de sistema, como cp, são na verdade programas executados como processos. Você deve ter notado que uma cópia grande no pendrive lento aparecerá em
top
oups -ef
como um processo. Portanto, embora seja verdade que o processo com permissões 4755 pode ser executado como root, os subprocessos não. Os scripts shell bash iniciam subprocessos para executar funções, como mover (mv) e copiar (cp). Da mesma forma, um programa C que chama system() está realmente causando um subprocesso e esse subprocesso, como os subprocessos no script bash da pergunta original, não tem autoridade root.Confira alguns dos comandos mais básicos dos sistemas Ubuntu. cp está realmente executando o programa /usr/bin/cp.