Usando a opção noexec no fstab

1

Este link explica os benefícios de usar a opção noexec ao usar mount . No entanto, ele lista uma limitação - se eu tiver um script Perl / Python / shell ou um arquivo que comece com #! e tentarei executá-lo - poderei fazê-lo se eu tiver fornecido a opção ou não.

Existe uma maneira de evitar tal execução? Ou seja existe uma opção adicional para noexec que eu posso dar e a execução dos scripts não será possível?

    
por Igor 21.11.2017 / 23:16

1 resposta

3

Há um grande mal-entendido aqui. Vamos esclarecer essas coisas.

Em primeiro lugar, a limitação a que você se refere, como é dito, não é verdadeiro :

However, when a script (a text file that begins with she-bang line; i.e., a line that begins with #!) is given to some shells (bash), it will run the executable named on that line (e.g., /usr/bin/perl) and connect the content of the script file to the stdin of that executable, which may not be on that drive.

Surpreendentemente, parece explicar a capacidade de execução, apesar de noexec . Eu acho que o consulente não entendeu tudo errado em primeiro lugar e não foi culpa dele ou dela! Uma suposição errada na questão causou outra suposição errada na resposta.

Qual é o problema então?

1. A montagem de ligação é específica

Para obter algum contexto, vamos ver o que acontece quando você tenta vincular a montagem como somente leitura. Existe essa pergunta: Por que o mount não respeita a opção somente leitura para montagens de bind? A conclusão é:

To achieve the desired result one needs to run two commands:

mount SRC DST -o bind
mount DST -o remount,ro,bind

Newer versions of mount (util-linux >=2.27) do this automatically when one runs

mount SRC DST -o bind,ro

Mas quando você tenta usar noexec em vez de ro , você ainda precisa de dois comandos! No meu Kubuntu eu tenho util-linux 2.27.1-6ubuntu3.3 e esse comando:

mount SRC DST -o bind,noexec

ignora noexec , preciso remontar. É o mesmo se a montagem for via /etc/fstab . Você pode experimentar. A qualquer momento, verifique com o comando mount simples quais são as opções reais.

Aposto que o autor da pergunta achou que a montagem estava com a opção noexec , mas na verdade não era. Ele conseguiu executar um script de dentro de% supostamente noexec mountpoint. Foi estranho, daí a questão.

Em seguida, o autor da resposta interpretou isso, como se fosse o shell que lê o shebang, chama outro executável e não se preocupa com noexec do script. Se o ponto de montagem fosse realmente noexec , isso seria uma especulação razoável.

Mas…

2. É um mito comum que as bombas leem shebangs; o kernel faz

Leia Como o #! trabalho de shebang? e observe que uma das respostas lá originalmente seguiu o mito, então foi corrigido.

Então, se você tiver:

  • um ponto de montagem /mnt/foo/ com noexec opção,
  • um script /mnt/foo/script.py que, de outra forma, é executável (por exemplo, chmod -x … foi invocado),
  • um shebang como #!/usr/bin/python como a primeira linha do script

e você o executa assim

/mnt/foo/script.py

então o seu kernel Linux não permitirá a você por causa de noexec . Isso teria acontecido nessa outra questão se a montagem fosse realmente noexec ; mas acredito que não foi.

3. Ainda assim, existem duas maneiras de "executar" um script

Dos comentários:

"and will try to execute it" How? By running it directly or by passing it to the interpreter?

A execução direta significa:

 /mnt/foo/script.py

Isso irá honrar noexec conforme elaborado acima. O executável é script.py .

Passá-lo ao intérprete significa:

python /mnt/foo/script.py

Nesse caso, o executável é python . Não importa se foo/ está montado com noexec ; Não importa se script.py é executável; Não importa qual seja o shebang. O ponto é script.py não é executado, é lido .

Desde que o usuário possa ler um arquivo e executar o intérprete apropriado, não há como impedir a passagem do arquivo para o interpretador; mas não é o arquivo que é executado.

    
por 13.12.2017 / 23:07