Por que o modo setuid S parece funcionar para não-proprietários em um script?

0

O setuid bit significa que, se alguém executar o arquivo, ele será executado como o proprietário desse arquivo.

Mas digamos que eu, o proprietário, ative o bit setuid mas desative os direitos de execução para mim:

theowner@hostname:~$ echo "echo \"Running as user $(whoami)\"" > script.sh
theowner@hostname:~$ sudo chmod u=rs,go+x script.sh

As permissões para esse arquivo agora são -r-Srwxr-x , veja as maiúsculas S para mim, mas x para o grupo e outras.

Se eu tentar executar o script, obtenho o esperado:

bash: ./script.sh: Permission denied

Porque eu não tenho direitos de execução. Se eu fiz o meu bit de permissão seria s e não S com setuid set. Mas agora digamos que eu su em outra conta de usuário, someperson , e tente executá-lo agora.

Running as user theowner

Por que ainda permite que outros usuários executem o script como theowner , quando theowner está impedido de executar o script?

    
por Aruka J 04.10.2017 / 23:29

1 resposta

4

O bit setuid não tem efeito algum sobre scripts em sistemas baseados em Linux como o Ubuntu. O que você está observando é o resultado de um erro de citação que você cometeu ao criar o script. Seu script não verifica quem está executando o script. Ele tem theowner codificado nele e sempre relata Running as user theowner , independentemente de com qual usuário é executado. Para confirmar isso, basta verificar o conteúdo do script.

Meu nome de usuário é ek . Quando eu faço seu script e verifico seu conteúdo, vejo:

$ echo "echo \"Running as user $(whoami)\"" > script.sh
$ cat script.sh
echo "Running as user ek"

Essa terceira linha mostra o conteúdo do script. O script não está determinando ek programaticamente executando. Eu ainda não corri! O texto ek aparece no próprio script, assim como o texto theowner aparece no seu.

Eu não alterei as permissões no script. Aqui está o que acontece quando eu o tornar executável, então, execute-o como eu mesmo ( ek ) e, em seguida, execute-o como um usuário separado ( ek2 ). Observe que isso acontece mesmo quando eu não configuro o bit setuid (e a saída de ls -l revela que ele não está definido).

$ chmod +x script.sh
$ ls -l script.sh
-rwxrwxr-x 1 ek ek 26 Oct  4 18:29 script.sh
$ ./script.sh
Running as user ek
$ su ek2 -c './script.sh'
Password:
Running as user ek

Por que $(whoami) foi avaliado em vez de ser preservado e escrito literalmente em seu script? Isso ocorre porque substituição de comandos , como expansão do parâmetro e outras expansões que são acionadas por $ , são executadas pelo seu shell mesmo dentro de cordas duplas com aspas .

Você pode usar aspas simples para evitar isso. Então você começa:

$ echo 'echo "Running as user $(whoami)"' > script2.sh
$ cat script2.sh
echo "Running as user $(whoami)"
$ chmod +x script2.sh
$ ls -l script2.sh
-rwxrwxr-x 1 ek ek 33 Oct  4 18:39 script2.sh
$ ./script2.sh
Running as user ek
$ su ek2 -c './script2.sh'
Password:
Running as user ek2
$ chmod u=rs,go+x script2.sh
$ ls -l script2.sh
-r-Srwxr-x 1 ek ek 33 Oct  4 18:39 script2.sh
$ ./script2.sh
-bash: ./script2.sh: Permission denied
$ su ek2 --c './script2.sh'
Password:
Running as user ek2

Observe que o script ainda é executado como ek2 porque o sistema operacional ignorou o bit setuid, como ocorre em todos os scripts. Os bits setuid e setgid são honrados somente em executáveis binários (e em diretórios, para o qual eles fazem algo completamente diferente ) .

    
por Eliah Kagan 05.10.2017 / 00:44