desenv-web-rp.com

Como os usuários conseguem executar um arquivo sem permissão?

Eu criei um script Bash que ecoa "Hello World". Também criei um usuário de teste, bob, usando adduser.

Ninguém tem permissão para executar esse arquivo, como indicado por ls:

$ ls -l hello.sh 
-rw-r--r-- 1 george george 19 Mai 29 13:06 hello.sh

Como podemos ver acima, o proprietário do arquivo é george onde ele possui apenas acesso de leitura e gravação, mas não possui acesso de execução. Mas logado como george Eu sou capaz de executar o script diretamente:

$ . hello.sh 
Hello World

Para piorar as coisas, eu entro como bob, onde tenho apenas permissão de leitura, mas ainda sou capaz de executar o arquivo:

$ su bob
Password: 
$ . /home/george/testdir/hello.sh 
Hello World

O que está acontecendo?

11
Themelis

Nos seus exemplos, você não está executando os arquivos, mas sourcing eles.

A execução seria via

$ ./hello.sh

e para isso, é necessária permissão de execução. Nesse caso, é aberto um sub-Shell no qual os comandos do arquivo de script são executados.

Sourcing, ou seja,.

$ . hello.sh

(com um espaço no meio) apenas o arquivo e o Shell a partir do qual você chamou o . hello.sh command depois executa os comandos diretamente como lidos, ou seja, sem abrir um sub-Shell. Como o arquivo é apenas lido, a permissão de leitura é suficiente para a operação. ( Observe também que especificar o nome do arquivo do script assim invoca uma pesquisa PATH, portanto, se houver outra hello.sh no seu PATH que será originado! Use caminhos explícitos, como em . ./hello.sh para garantir que você obtenha "o caminho certo".)

Se você deseja impedir que isso aconteça, também é necessário remover a permissão de leitura para qualquer usuário que não deveria estar usando o script. De qualquer forma, isso é razoável se você estiver realmente preocupado com o uso não autorizado do script, pois

  • usuários não autorizados podem ignorar facilmente a permissão de execução ausente, simplesmente copiando e colando o conteúdo do script em um novo arquivo ao qual eles podem se dar permissões de execução, e
  • conforme observado por Kusalananda, caso contrário, um usuário não autorizado ainda poderá usar o script confortavelmente chamando-o por meio de
    sh ./hello.sh
    
    ao invés de
    ./hello.sh
    
    porque isso também requer apenas permissões de leitura no arquivo de script (consulte esta resposta por exemplo).

Como observação geral , lembre-se de que existem diferenças sutis entre o fornecimento e a execução de um script (consulte esta pergunta por exemplo) .

27
AdminBee

A permissão de execução significa simplesmente que esse arquivo pode ser executado. No entanto, quando você o origina (. hello.sh ou source hello.sh) ou quando você o passa como argumento para um intérprete do Shell (sh hello.sh), você não está executando o arquivo, está executando outro comando (. ou sh) e passando o arquivo como argumento para esse comando.

Portanto, para responder à sua pergunta, o motivo pelo qual você pode "executar" o arquivo com . hello.sh é o mesmo motivo pelo qual você pode executar cat hello.sh: você está apenas lendo o arquivo, não o executando.

Ilustrar:

$ ls -l
total 4.0K
-r--r--r-- 1 terdon terdon 21 May 29 12:29 foo.sh

$ cat ./foo.sh 
#!/bin/sh
echo Hello

$ ./foo.sh
bash: ./foo.sh: Permission denied

$ sh ./foo.sh
Hello

Como você pode ver, não posso realmente executar o script, mas posso lê-lo - com cat ou com .-perfeitamente bem.

12
terdon

A versão muito curta é: você não está executando o arquivo. Você está lendo no Shell, que o executa.

Observe que alguns intérpretes de idiomas verificam as permissões de execução de um arquivo que eles estão sendo solicitados a executar e se recusarão a fazê-lo se o usuário não tiver as permissões apropriadas. Mas essa é uma verificação completamente discricionária pelo autor desse intérprete específico e não é imposta pelo sistema operacional.

Vamos fazer um pequeno experimento mental.

Eu acho que nós dois podemos concordar que se um programa tem permissões executáveis, eu deveria poder executar este programa. Acho que também podemos concordar que esse programa deve imprimir a string "Hello World" no console.

Além disso, provavelmente também podemos concordar que um programa possa ler um arquivo desde que esse arquivo tenha permissões de leitura. E realmente não importa qual é o conteúdo desse arquivo, desde que o arquivo tenha o bit de permissão de leitura definido, o programa deve poder lê-lo.

Ok, então, como concordamos que o programa deveria imprimir "Hello World" no console e concordamos que o programa deveria ler o arquivo, você também deve logicamente concordar que o programa deve leia o arquivo e imprima "Hello World" no console. E também dissemos que se o programa pode ou não ler o arquivo depende das permissões e não do conteúdo, por isso também deve ser permitido ler o arquivo e imprimir "Hello World" no console se o conteúdo do arquivo é echo Hello World.

Agora, você também pode concordar que, como o programa tem permissão para ler o arquivo e como o programa pode imprimir "Hello World" no console, também é permitido verificar o conteúdo do arquivo e somente imprima "Hello World" no console se o conteúdo do arquivo for echo Hello World?

Bem, mas então é "interpretando", em outras palavras executando o arquivo, e você acabou de concordar comigo em todas as etapas do caminho em que deve ser permitido faça isso!

E é exatamente isso que está acontecendo aqui. O Shell está simplesmente lendo um arquivo de texto, o que é permitido fazer porque o arquivo de texto possui permissões de leitura. E o Shell está executando as instruções no arquivo de texto, o que é permitido fazer porque o Shell possui permissões de execução.

5
Jörg W Mittag