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