Was ist ein gültiger Anwendungsfall für eine Dateiberechtigung "Nur ausführen"?

20

Ich habe mich über chmod und seine Oktalmodi informiert . Ich habe gesehen, dass 1das nur ausgeführt wird. Was ist ein gültiger Anwendungsfall für eine Nur-Ausführen-Berechtigung? Um eine Datei auszuführen, möchte man normalerweise die Berechtigung zum Lesen und Ausführen haben.

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

Antworten:

41

Shell-Skripte erfordern die Berechtigung zum Lesen, Binärdateien jedoch nicht:

$ 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

Es gibt zwei verschiedene Möglichkeiten, den Inhalt einer Datei anzuzeigen und auszuführen. Bei Shell-Skripten hängen diese Dinge zusammen, weil sie "ausgeführt" werden, indem sie in eine neue Shell (oder die aktuelle) "eingelesen" werden, wenn Sie die Vereinfachung verzeihen. Deshalb müssen Sie sie lesen können. Binärdateien verwenden diesen Mechanismus nicht.

Bei Verzeichnissen ist die Ausführungsberechtigung etwas anders. Dies bedeutet, dass Sie Dateien in diesem Verzeichnis bearbeiten können (z. B. lesen oder ausführen). Nehmen wir also an, Sie haben eine Reihe von Tools /tools, mit denen die Benutzer arbeiten können, aber nur, wenn sie davon wissen. chmod 711 /tools. Dann können ausführbare Dinge in /toolsexplizit ausgeführt werden (zB /tools/mytool), ls /tools/werden aber abgelehnt. Ebenso könnten Dokumente gespeichert werden, in /private-docsdenen nur dann gelesen werden kann, wenn die Dateinamen bekannt sind.

DopeGhoti
quelle
1
Im Übrigen hat es keinen Sinn mehr, Execute-only für System-Binärdateien festzulegen, es sei denn, Sie führen anonymes FTP aus.
Joshua
1
Wenn Sie das ausführbare Bit in einem Verzeichnis festlegen, können Sie auch cddarauf zugreifen.
Gardenhead
1
Ein Skript kann auch ohne Leseberechtigung ausgeführt werden
phuclv
1
Übrigens: Hier muss der C-Header nicht eingefügt stdio.hwerden. Ich schlage vor, es zu entfernen.
Spikatrix
1
@ Kevin: Wahrscheinlich, weil das Fehlen lsund Vervollständigen von Registerkarten die Wartungsarbeiten ärgerlich macht und kaum oder überhaupt keinen Sicherheitsvorteil bietet. Die meisten Dateien, an denen ein Angreifer interessiert sein könnte, befinden sich ohnehin an bekannten Standardspeicherorten, oder ihre Speicherorte können indirekt aus Daten in anderen Dateien ermittelt werden.
Ilmari Karonen
4

Unter Gentoo wird ausführbaren Programmen, die setuid (ausgeführt mit den Berechtigungen ihres Besitzers anstelle ihres Aufrufers) sind, der Lesezugriff verweigert (Modus 4711). Dies dient dem Schutz vor der Ausbeutung von Fehlern, um die Eskalation von Berechtigungen zu unterstützen.

Wenn ein nicht privilegierter Angreifer eine setuid-Datei lesen kann und einen Fehler kennt, der eine Rückkehr zu libc-ähnlichen Angriffen ermöglicht , kann er anhand des Inhalts der Datei möglicherweise vorhersagen, wo sich bestimmte nützliche Funktionen oder Bibliotheken befinden im Speicher abgelegt, wenn das Programm aufgerufen wird.

Moderne Systeme enthalten häufig zusätzliche Schutzfunktionen, die effizienter sind, wie z. B. ASLR. Aufgrund der Einschränkungen auf 32-Bit-Plattformen können sie jedoch leichter ausgenutzt werden.

Niemand
quelle
Beachten Sie, dass der Schutz nur für Quellen-basierte Distributionen gilt. Bei binärbasierten Distributionen kann der Angreifer einfach seine eigene Kopie des Programms betrachten, um herauszufinden, wo interessante Dinge sind.
Mark
Eine nur ausführbare Binärdatei kann auch eingebettete Kennwörter haben. Der Benutzer kann das Programm ausführen und das Kennwort an den Server senden. Der Benutzer kann das Kennwort jedoch nicht abrufen (das System sollte auch nicht zulassen, dass Core-Dumps erstellt werden).
Barmar
1

Es sieht so aus, als ob der Wert von "nur ausführen" für eine Datei keine große Bedeutung hat, aber er kann verwendet werden, um zu verhindern, dass eine Datei den Inhalt eines Verzeichnisses liest.

$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied
popedotninja
quelle
1
Erwähnenswert ist, dass dies nützlich ist, weil Sie immer noch foo / bar lesen können, wenn Sie den Dateinamen kennen. Ich habe dies auf Webservern verwendet.
Random832
0

Sie müssen über Lese- und Ausführungsberechtigungen verfügen, um ein Skript ausführen zu können. Wenn Sie den Inhalt eines Skripts lesen, kann es ausgeführt werden. Sie müssen also in der Lage sein, dies zu tun read and execute. Andernfalls können Sie kein Skript ohne das Skript ausführen.

Was ist ein gültiger Anwendungsfall für eine Nur-Ausführen-Berechtigung?

Sicherheit. Einige möchten möglicherweise ihre Dateien schützen und andere davon abhalten, sie auszuführen oder zu verwenden.

Jordan Savell
quelle
2
chmod 000Betrachtet Berechtigungen an niemanden außer root. Manchmal muss man nicht so umfangreich sein, nur um sich zu schützen - es hängt von den Absichten des Benutzers ab. Sagen wir, um die Datei auf lesbare und schreibbare Berechtigungen zurückzusetzen, müssten Sie dies durchführen root. Wenn Sie nicht in der Lage sind, darauf zuzugreifen root, wird es sich als schwierig erweisen.
Jordan Savell
2
Angenommen, Sie haben eine Reihe von Tools /tools, mit denen Sie möchten, dass die Benutzer sie verwenden können, aber nur, wenn sie über sie Bescheid wissen. chmod 711 /tools. Dann können ausführbare Dinge in /tools explizit ausgeführt werden, ls /tools/werden aber abgelehnt.
DopeGhoti
1
Gute Antwort! Hat mir da auch was beigebracht. Warum benötigen Binärdateien nicht die Leseberechtigung, um ausgeführt zu werden?
Jordan Savell
2
Weil das Anzeigen und Ausführen des Inhalts einer Datei zwei verschiedene Dinge sind. Shell-Skripte werden "ausgeführt", indem sie in eine neue Shell "eingelesen" werden (wenn Sie die Vereinfachung verzeihen). Deshalb müssen Sie sie lesen können. Binärdateien verwenden diesen Mechanismus nicht.
DopeGhoti
1
Ah gesunder Menschenverstand. Ich dachte, es wäre etwas anderes - danke!
Jordan Savell