Set-UID, ambiente e descritores
Seguir a autoridade de um processo, a interpretação pela shell e os recursos herdados.
Ambiente e identidade
| Operação | Efeito |
|---|---|
fork() | Cria um filho com cópia do ambiente; alterações no filho não mudam automaticamente o pai. |
execve(caminho, argv, envp) | Substitui o programa no mesmo processo e transmite o ambiente indicado em envp. |
| Executar um binário Set-UID | Pode mudar o UID efetivo para o dono, conservando o UID real. |
O UID real identifica normalmente quem iniciou o processo; o efetivo participa nas decisões de acesso. nosuid, no_new_privs e outras restrições podem impedir o efeito Set-UID. Linux ignora-o em scripts interpretados.
Passar environ a execve transmite o ambiente corrente. Uma lista de pares terminada por ponteiro nulo permite selecionar os valores. envp=NULL é aceite em Linux, mas não é uma forma portátil de transmitir ambiente vazio.
O carregador filtra certas variáveis, como LD_PRELOAD, em execução segura. O programa continua responsável pelas outras entradas externas que usa.
Em Linux com glibc atual, seteuid muda só o efetivo. Partindo de real 1000, efetivo 0 e guardado 0, seteuid(1000) conserva o 0 guardado e permite recuperação por seteuid(0). setuid(1000) com CAP_SETUID muda os três para 1000. Sem outra autoridade, já não permite recuperar 0. Verifica erros e trata grupos, capabilities e descritores separadamente.
PATH e shell
system("ls")invoca uma shell;PATHpode selecionar um executável numa pasta controlada pelo requerente.- Um caminho absoluto fixa o executável, mas a shell continua a interpretar caracteres. Em
system("/bin/cat relatorio; printf MARCA"), o;separa duas operações. - Na chamada direta a
execve,relatorio; printf MARCAnum elemento deargvé um único argumento. Não cria outra operação por interpretação da shell. - Ainda tens de autorizar o ficheiro, limitar opções e controlar o ambiente. O UID final de uma chamada por shell depende também da shell; algumas baixam privilégios.
Autoridade dos descritores
Uma abertura verifica a autoridade nesse momento. Baixar o UID não reaplica automaticamente essa decisão às escritas pelo descritor existente. Esta fuga de recurso é chamada capability leaking, sem implicar uma Linux capability.
Fecha descritores desnecessários antes de transferir controlo. Close-on-exec fecha no execve bem-sucedido, não ao baixar UID; o programa atual ainda pode usar o descritor antes disso. Quando possível, baixa privilégios antes de abrir recursos e verifica os erros.
No LOGBOOK, regista estado, operação, resultado e mecanismo. O navegador não reproduz processos e permissões POSIX; o guião exige o ambiente isolado docente e reposição da configuração alterada.