回答:
シェルスクリプトを実行するには読み取りアクセス許可が必要ですが、バイナリファイルでは必要ありません。
$ 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
ファイルの内容を表示して実行することは、2つの異なることです。単純化を許せば、シェルスクリプトでは、これらのことは新しいシェル(または現在のシェル)に「読み込む」ことによって「実行」されるため、関連しています。これがあなたがそれらを読むことができる必要がある理由です。バイナリはそのメカニズムを使用しません。
ディレクトリの場合、実行許可は少し異なります。これは、そのディレクトリ内のファイルに対して何かを実行できることを意味します(たとえば、読み取りまたは実行)。だから、あなたが/tools
人々がそれらを知っている場合にのみ、人々が使用できるようにしたいというツールのセットを持っているとしましょう。chmod 711 /tools
。その後、実行可能なものを/tools
明示的に実行できますが(例:)/tools/mytool
、ls /tools/
拒否されます。同様に、/private-docs
ファイル名がわかっている場合にのみドキュメントを読み込むことができます。
cd
。
stdio.h
ここにCヘッダーを含める必要はありません。削除することをお勧めします。
ls
、タブ補完機能がないと、メンテナンス作業が煩わしくなり、実際のセキュリティ上の利点はほとんどありません。攻撃者が興味を持つ可能性のあるファイルのほとんどは、とにかく既知の標準の場所にあります、またはそれらの場所は他のファイルのデータから間接的に発見できます(そうでなければ、それらのファイルを合法的に使用するプログラムはどこでそれらを見つけるかを知るでしょうか?)
Gentooでは、setuid(実行者ではなく所有者の許可で実行するように設定)されている実行可能プログラムは、読み取りアクセスを拒否されます(モード4711)。これは、権限昇格を支援するバグの悪用に対する保護の層を追加することです。
特権のない攻撃者がsetuidファイルを読み取ることができ、libcスタイルに戻る攻撃を許可するバグを知っている場合、ファイルの内容を使用して特定の有用な関数またはライブラリが存在する可能性が高い場所を予測できる可能性がありますプログラムが呼び出されたときにメモリに配置されます。
最近のシステムには、ASLRなど、より効果的な追加の保護が含まれていることがよくありますが、32ビットプラットフォームに存在する制限により、より簡単に悪用される可能性があります。
スクリプトを実行するには、読み取り権限と実行権限が必要です。スクリプトの内容を読み取ることで、スクリプトを実行できるようになりread and execute
ます。それ以外の場合は、それなしではスクリプトを実行できません。
実行のみの権限の有効なユースケースは何ですか?
セキュリティ。ファイルを保護し、他のユーザーがそれらを実行したり使用したりできないようにしたい場合があります。
chmod 000
以外の誰にも許可を考慮しませんroot
。保護のためだけに大規模にする必要はない場合があります-ユーザーの意図に依存します。そのためには、ファイルを「re-chmod」して読み取りおよび書き込み可能なアクセス許可に戻し、これを行う必要がありますroot
。にアクセスできない場合はroot
、難しいことがわかります。
/tools
人々が使用できるようにしたいという点で、彼らがそれらについて知っている場合にのみ、ツールのセットを持っているとしましょう。 chmod 711 /tools
。その後、実行可能なものを /tools
明示的に実行できますが、ls /tools/
拒否されます。