Um script pode ser executável, mas não legível?

56

É possível executar um script se não houver permissão para lê-lo? No modo raiz, fiz um script e quero que o outro usuário execute esse script, mas não o leia. Eu fiz chmod para proibir ler e escrever, mas permitir a execução, no entanto, no modo de usuário, vi a mensagem que diz: permissão negada.

    
por ashim 15.03.2012 / 02:28

8 respostas

59

O problema é que o script não é o que está sendo executado, mas o interpretador ( bash , perl , python , etc.). E o intérprete precisa ler o roteiro. Isso é diferente de um programa "regular", como ls , em que o programa é carregado diretamente no kernel, como faria o interpretador. Como o próprio kernel está lendo o arquivo do programa, ele não precisa se preocupar com o acesso de leitura. O intérprete precisa ler o arquivo de script, pois um arquivo normal precisaria ser lido.

    
por 15.03.2012 / 02:44
32

Isso é possível apenas para binários.

$ chown foo:foo bar
$ chmod 701 bar

Como usuário sem privilégios:

$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar

$ cat bar
cat: bar: Permission denied

$ ./bar
baz

Agora, aqui está o kicker. Enquanto o arquivo é ilegível por meios convencionais, você não pode impedir a leitura do arquivo. Este é realmente um desafio no link (nível 13). Existe um utilitário bem conhecido chamado hktrace que permite que você leia o arquivo usando ptrace .

    
por 16.03.2012 / 00:43
6

Isso não é possível, pelo menos no Linux (outros Unices podem permitir isso); pense nisso, quando você executa o script, o shell precisa lê-lo para saber o que fazer.

    
por 15.03.2012 / 02:41
2

Você pode, eu acho, fazer isso com setuid .

Só que você não pode, porque a maioria das distros (aparentemente) tem setuid desabilitado porque é um buraco de segurança enorme. Ele está desativado no meu, então eu realmente não sei se essa resposta vai funcionar, estou postando mesmo assim, porque eu acho que deveria .

De qualquer forma, se eu quisesse fazer o que você queria fazer - e eu tivesse uma distro com setuid habilitada para scripts - eu faria algo como:

$ chmod 700 myscript
$ cat > myscript-nonroot
#!/bin/sh
bash myscript
^D
$ sudo chown root:root myscript-nonroot
$ sudo chmod 4755 myscript-nonroot # make SURE this isn't world-writable!

O que significa que eu escreveria outro script cujo único propósito seja chamar o script root-read-only, alterá-lo para ser de propriedade de root e dar a permissão setuid. (Juntamente com o status não gravável de todos os outros.)

Como a função myscript-nonroot é legível por todos, ela pode ser lida e executada, e quando você pega a linha onde você realmente executa seu script ( bash myscript ) está sendo executado como root (ou quem quer que seja você quer, o usuário exato não importa, contanto que o arquivo wrapper pertença ao mesmo usuário.)

    
por 20.03.2012 / 00:34
2

Há uma meia verdade nas declarações anteriores. Você pode configurar um script para que não seja legível pelo usuário, mas ainda assim executável. O processo é um pouco extenso, mas é possível fazer uma exceção em / etc / sudoer para que o usuário possa executar o script como você mesmo temporariamente, sem que seja solicitada uma senha. Este método: - contorna o patch setuid para outras distros. - permite que você conceda permissões elevadas temporariamente para um script específico sem dar ao usuário direitos de sudo para tudo.

Siga as instruções nesta postagem: Permissão de arquivo executada somente

    
por 31.05.2013 / 17:04
1

Nesta situação, usei sudo com uma opção NOPASSWD para que os usuários possam executar o script sem poder lê-lo.

    
por 05.03.2013 / 12:18
-1

Sim, se você for usuário root, poderá executar o arquivo sem permissão de leitura

# echo "echo hello" > test
# chmod 100 test
# ll test
---x------ 1 root root 10 Nov 29 12:13 test
# ./test
hello

Mas se você fizer login com qualquer outro usuário, não poderá executar este arquivo

$ ./test
-bash: ./test: Permission denied
    
por 29.11.2017 / 08:10
-3

Para tornar seus scripts ilegíveis, mas executáveis, você tem três opções principais:

Primeira opção

Use o comando openssl para criptografá-lo manualmente. E, no futuro, quando você quiser executar o script, terá que executar o openssl manualmente novamente e fornecer a senha para descriptografar.

Criptografia com openssl:

cat yourscript.sh | openssl aes-128-cbc -a -salt -k yourpassword > yourscript.enc

Descriptografia com o openssl:

cat yourscript.enc | openssl aes-128-cbc -a -d -salt -k yourpassword > yourscript.dec

o yourscript.dec será o mesmo que o seu script original, yourscript.sh

Segunda opção

Use um site como www.Enscryption.com para criptografar automaticamente o seu script e tornar a versão criptografada do script executável. Este site usa os recursos de criptografia do openssl e alguns outros métodos de ofuscação para dificultar a intrusão em seu script ou desvendar segredos que você deseja ocultar. Com este site, você pode criptografar scripts de shell e scripts de linha de comando perl, python, ruby. Eu acho que também php.

Terceira opção

Use uma ferramenta como shc . Parece que não foi atualizado desde 2012. mas já o usei no passado. Você tem que compilar seu script para cada sistema operacional no qual você deseja usá-lo, se o sistema operacional for diferente daquele que você usou para compilá-lo.

Resumo:

Se ocultar seu código é de grande importância para você, confiar apenas em permissões e propriedade vai ajudá-lo, já que qualquer pessoa com root pode obtê-lo. Isso é apenas um fato. O que você pode fazer, se você realmente quer impedir a visualização não autorizada de seu código por qualquer pessoa, é escrever um script em torno do comando openssl. Faça com que, antes de o script ser executado, ele solicite uma senha E, depois que a senha for fornecida, ele será executado sem escrevê-lo em um arquivo temporário. Se isso soa como muito trabalho, as opções 2 e 3 devem ser suficientes para seus propósitos.

    
por 08.06.2016 / 23:49