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

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.


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
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.


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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.