O que é um caso de uso válido para uma permissão de arquivo "somente execução"?

20

Eu estava lendo chmod e seus modos octais . Eu vi que 1é apenas executar. O que é um caso de uso válido para uma permissão somente de execução? Para executar um arquivo, normalmente é necessário ter permissão de leitura e execução.

$ echo 'echo foo' > say_foo
$ chmod 100 ./say_foo
$ ./say_foo
bash: ./say_foo: Permission denied
$ chmod 500 ./say_foo
$ ./say_foo
foo
popedotninja
fonte

Respostas:

41

Os scripts de shell exigem a permissão de leitura para serem executados, mas os arquivos binários não:

$ cat hello.cpp
#include<iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}
$ g++ -o hello hello.cpp
$ chmod 100 hello
$ ./hello
Hello, world!
$ file hello
hello: executable, regular file, no read permission

Exibir o conteúdo de um arquivo e executá-lo são duas coisas diferentes. Com os scripts de shell, essas coisas estão relacionadas porque são "executadas" pela "leitura" delas em um novo shell (ou no atual), se você perdoar a simplificação. É por isso que você precisa ser capaz de lê-los. Os binários não usam esse mecanismo.

Para diretórios, a permissão de execução é um pouco diferente; significa que você pode fazer coisas com arquivos dentro desse diretório (por exemplo, lê-los ou executá-los). Então, digamos que você tenha um conjunto de ferramentas em /toolsque deseja que as pessoas possam usar, mas apenas se elas souberem. chmod 711 /tools. Em seguida, as coisas executáveis /toolspodem ser executadas explicitamente (por exemplo /tools/mytool), mas ls /tools/serão negadas. Da mesma forma, os documentos podem ser armazenados nos /private-docsquais podem ser lidos se e somente se os nomes dos arquivos forem conhecidos.

DopeGhoti
fonte
11
Aliás, não há mais sentido em configurar somente execução nos binários do sistema, a menos que você execute ftp anônimo.
Joshua
11
Além disso, definir o bit executável em um diretório permite que você faça cdisso.
gardenhead
11
Um script também pode ser feita para executar sem permissão de leitura
phuclv
11
BTW, não há necessidade de incluir o cabeçalho C stdio.haqui. Eu sugiro removê-lo.
Spikatrix 11/03/19
11
@ Kevin: Provavelmente porque o fato de não ter uma lsconclusão de guias funcionando torna o trabalho de manutenção irritante e fornece pouco ou nenhum benefício real à segurança. A maioria dos arquivos nos quais um invasor pode estar interessado está em locais padrão conhecidos, ou seus locais podem ser descobertos indiretamente a partir de dados em outros arquivos (caso contrário, como os programas que legitimamente usam esses arquivos sabem onde encontrá-los?).
Ilmari Karonen 11/03/19
4

No Gentoo, programas executáveis ​​que são setuid (configurados para serem executados com as permissões de seus proprietários em vez de seus invocadores) têm acesso negado de leitura (modo 4711). Isso é para adicionar uma camada de proteção contra a exploração de bugs para ajudar na escalação de privilégios.

Se um invasor sem privilégios puder ler um arquivo setuid e souber de um bug que permita um ataque ao estilo libc , ele poderá usar o conteúdo do arquivo para prever onde certas funções ou bibliotecas úteis provavelmente estarão colocado na memória quando o programa é chamado.

Os sistemas modernos geralmente incluem proteções adicionais que são mais eficazes, como o ASLR , mas as restrições presentes nas plataformas de 32 bits podem deixá-los mais facilmente exploráveis.

Ninguém
fonte
Observe que a proteção se aplica apenas a distribuições baseadas na fonte. Com distribuições baseadas em binário, o invasor pode apenas olhar sua própria cópia do programa para descobrir onde estão as coisas interessantes.
Mark
Um binário somente executável também pode ter senhas incorporadas. O usuário pode executar o programa e enviar a senha para o servidor, mas o usuário não poderá obter a senha (o sistema também não deve permitir que eles façam dumps principais).
Barmar
1

Parece que o valor de "somente execução" não tem muita utilidade para um arquivo, mas pode ser usado para impedir que alguém leia o conteúdo de um diretório.

$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied
popedotninja
fonte
11
Vale ressaltar que a razão pela qual isso é útil é porque você ainda pode ler foo / bar se souber o nome do arquivo. Eu usei isso em servidores web.
Random832
0

Você precisa ter permissões de leitura e execução para executar um script. A leitura do conteúdo de um script é o que permite sua execução; portanto, você deve poder read and execute. Caso contrário, você não poderá executar um script sem ele.

O que é um caso de uso válido para uma permissão somente de execução?

Segurança. Alguns podem querer proteger seus arquivos e impedir que outros os executem ou os usem.

Jordan Savell
fonte
2
chmod 000Considerará permissões para ninguém, exceto root. Às vezes, você não precisa ser tão extenso apenas para proteção - depende das intenções do usuário. Para, digamos "re-chmod", o arquivo de volta às permissões legíveis e graváveis ​​pelas quais você teria que fazer isso root. Se você não conseguir acessar root, será difícil.
Jordan Savell
2
Digamos que você tenha um conjunto de ferramentas /toolsque deseja que as pessoas possam usar, mas apenas se elas souberem. chmod 711 /tools. Coisas, então executáveis em /tools pode ser executado de forma explícita, mas ls /tools/será negado.
DopeGhoti
11
Boa resposta! Também me ensinou algo lá. Por que os arquivos binários não precisam da permissão de leitura para serem executados?
Jordan Savell
2
Porque exibir o conteúdo de um arquivo e executá-lo são duas coisas diferentes. Os scripts do shell são "executados" pela "leitura" deles em um novo shell (se você perdoa a simplificação), e é por isso que você precisa lê-los. Os binários não usam esse mecanismo.
DopeGhoti 10/03
11
Ah senso comum. Eu pensei que era algo diferente - obrigado!
Jordan Savell