このリンクnoexec
を使用するときにmount
オプションを使用する利点について説明します。ただし、1つの制限がリストされています-Perl/Python/Shellスクリプトまたは#!
で始まるファイルがあり、それを実行しようとする場合-オプションを指定したかどうかに関係なく実行できます。
そのような実行を防ぐ方法はありますか?つまりnoexec
に追加のオプションがあり、スクリプトを実行できなくなりますか?
ここには大きな誤解があります。これらのことを明確にしましょう。
まず第一に、 制限 あなたが言及しているように、は真実ではありません:
ただし、スクリプト(she-bang行で始まるテキストファイル、つまり
#!
で始まる行)が一部のシェル(bash)に渡されると、その行で指定された実行可能ファイルが実行されます(例: 、/usr/bin/Perl
)そして、スクリプトファイルの内容をその実行可能ファイルのstdinに接続します。これは、そのドライブ上にない可能性があります。
驚いたことに、それは説明しているようです noexec
にもかかわらず実行する能力 。そもそもそこのアスケーはすべて間違っていたと思いますが、それは彼または彼女のせいではありませんでした!質問の1つの間違った仮定が、回答の別の間違った仮定を引き起こしました。
では、何が問題なのですか?
コンテキストを取得するために、マウントを読み取り専用としてバインドしようとするとどうなるかを見てみましょう。この質問があります: マウントがバインドマウントの読み取り専用オプションを尊重しないのはなぜですか? 結論は次のとおりです。
目的の結果を得るには、次の2つのコマンドを実行する必要があります。
mount SRC DST -o bind mount DST -o remount,ro,bind
新しいバージョンのmount(util-linux> = 2.27)は、実行時にこれを自動的に実行します
mount SRC DST -o bind,ro
ただし、noexec
の代わりにro
を使用しようとすると、2つのコマンドが必要になります。 Kubuntuにはutil-linux 2.27.1-6ubuntu3.3
と次のコマンドがあります。
mount SRC DST -o bind,noexec
noexec
を無視します、再マウントする必要があります。マウントが/etc/fstab
を介して行われる場合も同じです。あなたは実験することができます。いつでもプレーンなmount
コマンドで実際のオプションが何であるかを確認してください。
質問者はマウントがnoexec
オプションであると思ったに違いありませんが、実際にはそうではありませんでした。彼または彼女は、伝えられるところによるとnoexec
マウントポイント内からスクリプトを実行することができました。それは奇妙だったので、質問です。
次に、回答者はこれを、シバンを読み取り、別の実行可能ファイルを呼び出し、スクリプトのnoexec
を気にしないシェルであるかのように解釈しました。マウントポイントが本当にnoexec
だった場合、これは妥当な推測です。
だが…
#!Shebangはどのように機能しますか? を読んで、元々神話に従った答えの1つに気づき、修正されました。
だからあなたが持っているなら:
/mnt/foo/
とnoexec
オプション、/mnt/foo/script.py
は、他の方法では実行可能です(たとえば、chmod -x …
が呼び出されました)。#!/usr/bin/python
のようなシバンそしてあなたはそれをこのように実行します
/mnt/foo/script.py
そうすると、Linuxカーネルはnoexec
のためにあなたを許可しません。マウントが実際にそこにnoexec
あった場合、この別の質問で発生したはずです。しかし、そうではなかったと思います。
コメントから:
「そしてそれを実行しようとします」どうやって?直接実行するか、インタプリタに渡すか。
直接実行するということは、次のことを意味します。
/mnt/foo/script.py
これは、上記で説明したようにnoexec
を尊重します。実行可能ファイルはscript.py
です。
それをインタプリタに渡すということは、次のことを意味します。
python /mnt/foo/script.py
この場合、実行可能ファイルはpython
です。 foo/
がnoexec
でマウントされているかどうかは関係ありません。 script.py
が実行可能かどうかは関係ありません。シバンが何であるかは関係ありません。ポイントはscript.py
が実行されず、readです。
ユーザーがファイルを読み取って適切なインタープリターを実行できる限り、ファイルがインタープリターに渡されるのを防ぐ方法はありません。しかし、実行されるのはファイルではありません。