「実行のみ」のファイル許可の有効なユースケースは何ですか?


20

私はchmodとその8進数モードについて読んでいました。私はそれ1が実行のみであることを見ました。実行のみの権限の有効なユースケースは何ですか?ファイルを実行するには、通常、読み取りおよび実行権限が必要です。

$ echo 'echo foo' > say_foo
$ chmod 100 ./say_foo
$ ./say_foo
bash: ./say_foo: Permission denied
$ chmod 500 ./say_foo
$ ./say_foo
foo

回答:


41

シェルスクリプトを実行するには読み取りアクセス許可が必要ですが、バイナリファイルでは必要ありません。

$ 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/mytoolls /tools/拒否されます。同様に、/private-docsファイル名がわかっている場合にのみドキュメントを読み込むことができます。


1
ちなみに、匿名FTPを実行しない限り、システムバイナリでexecute-onlyを設定しても意味がありません。
ジョシュア

1
また、ディレクトリに実行可能ビットを設定すると、それを実行できますcd
ガーデンヘッド


1
ところで、stdio.hここにCヘッダーを含める必要はありません。削除することをお勧めします。
Spikatrix

1
@Kevin:おそらくls、タブ補完機能がないと、メンテナンス作業が煩わしくなり、実際のセキュリティ上の利点はほとんどありません。攻撃者が興味を持つ可能性のあるファイルのほとんどは、とにかく既知の標準の場所にあります、またはそれらの場所は他のファイルのデータから間接的に発見できます(そうでなければ、それらのファイルを合法的に使用するプログラムはどこでそれらを見つけるかを知るでしょうか?)
イルマリカロネン

4

Gentooでは、setuid(実行者ではなく所有者の許可で実行するように設定)されている実行可能プログラムは、読み取りアクセスを拒否されます(モード4711)。これは、権限昇格を支援するバグの悪用に対する保護の層を追加することです。

特権のない攻撃者がsetuidファイルを読み取ることができ、libcスタイルに戻る攻撃を許可するバグを知っている場合、ファイルの内容を使用して特定の有用な関数またはライブラリが存在する可能性が高い場所を予測できる可能性がありますプログラムが呼び出されたときにメモリに配置されます。

最近のシステムには、ASLRなど、より効果的な追加の保護が含まれていることがよくありますが、32ビットプラットフォームに存在する制限により、より簡単に悪用される可能性があります。


保護はソースベースのディストリビューションにのみ適用されることに注意してください。バイナリベースのディストリビューションを使用すると、攻撃者は自分のプログラムのコピーを見るだけで、興味深いものがどこにあるかを把握できます。
マーク

実行可能専用のバイナリには、パスワードを埋め込むこともできます。ユーザーはプログラムを実行でき、サーバーにパスワードを送信できますが、ユーザーはそこからパスワードを取得できません(システムはコアダンプの作成も許可しないでください)。
バーマー

1

「execute only」の値はファイルに対してあまり使用されないように見えますが、ディレクトリの内容を読み取れないようにするために使用できます。

$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied

1
これが便利な理由は、ファイル名を知っていればfoo / barを読むことができるからです。これをWebサーバーで使用しました。
Random832

0

スクリプトを実行するには、読み取り権限と実行権限が必要です。スクリプトの内容を読み取ることで、スクリプトを実行できるようになりread and executeます。それ以外の場合は、それなしではスクリプトを実行できません。

実行のみの権限の有効なユースケースは何ですか?

セキュリティ。ファイルを保護し、他のユーザーがそれらを実行したり使用したりできないようにしたい場合があります。


2
chmod 000以外の誰にも許可を考慮しませんroot。保護のためだけに大規模にする必要はない場合があります-ユーザーの意図に依存します。そのためには、ファイルを「re-chmod」して読み取りおよび書き込み可能なアクセス許可に戻し、これを行う必要がありますroot。にアクセスできない場合はroot、難しいことがわかります。
ジョーダンサヴェル

2
/tools人々が使用できるようにしたいという点で、彼らがそれらについて知っている場合にのみ、ツールのセットを持っているとしましょう。 chmod 711 /tools。その後、実行可能なもの /tools明示的に実行できますが、ls /tools/拒否されます。
-DopeGhoti

1
いい答えだ!そこでも教えてくれました。バイナリファイルを実行するのに読み取り権限が必要ないのはなぜですか?
ジョーダンサヴェル

2
ファイルの内容を表示して実行することは、2つの異なることだからです。シェルスクリプトは、新しいシェルに「読み込む」ことで「実行」されます(単純化を許す場合)。そのため、それらを読む必要があるのです。バイナリはそのメカニズムを使用しません。
-DopeGhoti

1
ああ常識。何か違うと思いました-ありがとう!
ジョーダンサヴェル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.