web-dev-qa-db-ja.com

fstabでnoexecオプションを使用する

このリンクnoexecを使用するときにmountオプションを使用する利点について説明します。ただし、1つの制限がリストされています-Perl/Python/Shellスクリプトまたは#!で始まるファイルがあり、それを実行しようとする場合-オプションを指定したかどうかに関係なく実行できます。

そのような実行を防ぐ方法はありますか?つまりnoexecに追加のオプションがあり、スクリプトを実行できなくなりますか?

3
Igor

ここには大きな誤解があります。これらのことを明確にしましょう。

まず第一に、 制限 あなたが言及しているように、は真実ではありません

ただし、スクリプト(she-bang行で始まるテキストファイル、つまり#!で始まる行)が一部のシェル(bash)に渡されると、その行で指定された実行可能ファイルが実行されます(例: 、/usr/bin/Perl)そして、スクリプトファイルの内容をその実行可能ファイルのstdinに接続します。これは、そのドライブ上にない可能性があります。

驚いたことに、それは説明しているようです noexecにもかかわらず実行する能力 。そもそもそこのアスケーはすべて間違っていたと思いますが、それは彼または彼女のせいではありませんでした!質問の1つの間違った仮定が、回答の別の間違った仮定を引き起こしました。

では、何が問題なのですか?

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だった場合、これは妥当な推測です。

だが…

2.貝殻がシバンを読むというのは一般的な神話です。カーネルはします

#!Shebangはどのように機能しますか? を読んで、元々神話に従った答えの1つに気づき、修正されました。

だからあなたが持っているなら:

  • マウントポイント/mnt/foo/noexecオプション、
  • スクリプト/mnt/foo/script.pyは、他の方法では実行可能です(たとえば、chmod -x …が呼び出されました)。
  • スクリプトの最初の行として#!/usr/bin/pythonのようなシバン

そしてあなたはそれをこのように実行します

/mnt/foo/script.py

そうすると、Linuxカーネルはnoexecのためにあなたを許可しません。マウントが実際にそこにnoexecあった場合、この別の質問で発生したはずです。しかし、そうではなかったと思います。

3.それでも、スクリプトを「実行」する方法は2つあります。

コメントから:

「そしてそれを実行しようとします」どうやって?直接実行するか、インタプリタに渡すか。

直接実行するということは、次のことを意味します。

 /mnt/foo/script.py

これは、上記で説明したようにnoexecを尊重します。実行可能ファイルscript.pyです。

それをインタプリタに渡すということは、次のことを意味します。

python /mnt/foo/script.py

この場合、実行可能ファイルはpythonです。 foo/noexecでマウントされているかどうかは関係ありません。 script.pyが実行可能かどうかは関係ありません。シバンが何であるかは関係ありません。ポイントはscript.pyが実行されず、readです。

ユーザーがファイルを読み取って適切なインタープリターを実行できる限り、ファイルがインタープリターに渡されるのを防ぐ方法はありません。しかし、実行されるのはファイルではありません。

4