Zweck von Berechtigungen wie 0111 oder 0333

17

Was ist der Zweck von Linux-Berechtigungen wie 111 oder 333 (dh der Benutzer kann die Datei ausführen , aber nicht lesen ), wenn die Fähigkeit zur Ausführung nicht automatisch die Fähigkeit zum Lesen impliziert?

trolley813
quelle
1
Haben Sie ein Beispiel für eine solche Einstellung? Ich glaube, Du hast recht. Sie können nicht ausführen, was Sie nicht lesen können. Diese Kombinationen sind nur theoretisch im Bereich der Berechtigungen zwischen 0000 und 0777. Beachten Sie, dass die führende 0 hinzugefügt werden sollte, um die Oktalbasis der Zahl anzuzeigen.
ikrabbe
6
Sofern es sich nicht um ein Skript (z. B. Shell-Skript) handelt, benötigen Sie keine Leseberechtigung, um einen Befehl auszuführen. Eine "normale" ausführbare Datei - z. su, bash oder vi - es muss nur das ausführbare Bit gesetzt sein, damit ein Benutzer es ausführen kann. Eine Datei, die nicht gelesen werden kann, kann nicht kopiert werden . Wenn ein Benutzer einen sicherheitsrelevanten Befehl (wie su) nicht kopieren darf, kann er keine eigene Kopie davon erstellen - und auch nicht versuchen, ihn zu zerlegen. * BSD verfügt über mehrere Befehle, die zwar ausgeführt werden, jedoch keine Leseberechtigung haben.
Baard Kopperud

Antworten:

25

Ich habe damit gespielt und anscheinend implizieren Exec-Berechtigungen keine Leseberechtigungen. Binärdateien können ausführbar sein, ohne dass sie lesbar sind:

$ echo 'int main(){ puts("hello world"); }' > hw.c
$ make hw
$ ./hw
hello world
$ chmod 111 hw
$ ./hw 
hello world
$ cat hw
/bin/cat: hw: Permission denied

Ich kann jedoch keine Skripte ausführen, es sei denn, sie haben sowohl Lese- als auch Ausführungsberechtigungsbits für:

$ cat > hw.sh
#!/bin/bash
echo hello world from bash
^D
$ chmod +x ./hw.sh
$ ./hw.sh 
hello world from bash
$ chmod 111 ./hw.sh
$ ./hw.sh
/bin/bash: ./hw.sh: Permission denied
PSkocik
quelle
4
Dies ist richtig, da das zweite Beispiel das # verwendet! Um zu starten, fehlt der ELF-Header und die Datei muss lesbar sein, damit er erraten kann, welche ausführbare Datei sie verwenden soll. Dies ist eine häufige Situation, in der Sie den Inhalt der Dateien vor dem Kopieren an einen anderen Speicherort schützen möchten. Ein Lizenzmanager ist ein gängiges Beispiel, wo Sie dies sehen würden.
hspaans
1
Beachten Sie, dass Sie weiterhin nur ausführbare Binärdateien lesen können: unix.stackexchange.com/a/34294
小 小
6
@hspaans: Der shebang wird vom Kernel gehandhabt und der Kernel kümmert sich nicht um kuriose Kleinigkeiten wie Berechtigungen. Es ist die Shell (oder der Interpreter), die Lesezugriff benötigt. Der Kernel wird ausgeführt (say) /bin/bash hw.shund dann versucht bash hw.shzum Lesen zu öffnen (und schlägt fehl).
Kevin
2
Ich hoffe sehr, dass der Kernel sich um Berechtigungen kümmert. Sonst nichts. Was der beängstigende Satz in @ Kevins Beitrag bedeutet, ist, dass der Kernel nur Ausführungsberechtigungen benötigt, um Dateien auszuführen, unabhängig davon, ob sie den Shebang verwenden.
Emil Jeřábek unterstützt Monica
2
@ EmilJeřábek Der Kernel kümmert sich um Berechtigungen, wenn er entscheidet, was ein Bewerbungsprozess tun kann. Da es sich jedoch um die Komponente handelt, die die Berechtigungen implementiert, können sie auch intern ignoriert werden. So kann es die shebang-Zeile lesen, wenn es festlegt, wie eine interpretierte Datei ausgeführt werden soll, oder den Inhalt einer Binärdatei, die nur ausgeführt werden darf, in den Speicher lesen.
Barmar
16

Für Verzeichnisse ist es sinnvoll, wenn Sie beispielsweise (geheime) ausführbare Dateien in einem bestimmten Verzeichnis speichern und dann zulassen, dass Benutzer diese Dateien aufrufen, ohne den Verzeichnisinhalt sehen zu können (aber zu wissen, dass eine bestimmte Datei vorhanden ist, nachdem Sie sie informiert haben!). 333 im Vergleich zu 111 ermöglicht das Schreiben / Löschen von Dateien in / aus diesen Verzeichnissen, ohne den Inhalt des Verzeichnisses sehen zu können.

Afsin Toparlak
quelle
5
An meiner Uni wurden diese Berechtigungen verwendet, um Aufgaben in einem Verzeichnis abzulegen, ohne dass die Schüler sahen, dass andere arbeiten. Der Dozent war eine alte Schule.
DarkHeart
@ DarkHeart Interessant. Ich hoffe, Sie mussten den Dateinamen eine zufällige Komponente hinzufügen, denn wenn dies sonst kein Anreiz ist, von Ihren Klassenkameraden zu kopieren, weiß ich nicht, was es ist.
PSkocik
5

Natürlich sind nicht alle Kombinationen so nützlich, aber um die speziell von Ihnen erwähnte zu nehmen ... Sie benötigen tatsächlich keine readBerechtigung zum Ausführen einer Datei - nur eine executeBerechtigung - es sei denn, es handelt sich bei der fraglichen Datei um ein Skript (z. B. ein Shell-Skript) ( .sh), perl-script ( .pl) und so weiter). Normale Binärdateien können nur mit executeErlaubnis ausgeführt werden. Auf * BSD-Systemen erteilen mehrere ausführbare Dateien die executeErlaubnis ohne readErlaubnis, insbesondere auf "sicherheitsrelevanten" Befehlen - z su.

Warum also nicht Benutzer read-permission (und nur execute-permisson) geben? Weil eine Datei, die von einem Benutzer nicht gelesen werden kann, auch von diesem Benutzer nicht kopiert werden kann ! Durch das Entfernen der readBerechtigung wird verhindert, dass Benutzer ihre eigenen "persönlichen" Kopien von ausführbaren Dateien erstellen, die sie später möglicherweise missbrauchen können (z SUID=root on. B. abrufen ).

writeWenn Sie nicht über die Berechtigung -permission verfügen, wird verhindert, dass eine Datei versehentlich gelöscht wird.

Allerdings ist es etwas ungewöhnlich, dem Besitzer weder read-noch write-Erlaubnis zu erteilen, aber manchmal kann es eine gute Idee sein, selbst das ownerLöschen einer Datei zu verhindern . Natürlich kann der owner- ganz zu schweigen von root- solche Maßnahmen immer umgehen, wenn nicht auf andere Weise, dann einfach durch chmoddie Erlaubnis in der Akte.

Baard Kopperud
quelle
"Es kann eine gute Idee sein, selbst das ownerLöschen einer Datei zu verhindern ." - Mit der Ausnahme, dass Sie keine Berechtigung für eine Datei (Lesen, Schreiben oder Ausführen) benötigen, um sie zu löschen.
Celada,
Ready-only Executables können beispielsweise verwendet werden, wenn die ausführbare Datei ein Datenbankkennwort einbettet, mit dem sie eine Verbindung zu einer Datenbank herstellt und ihre Arbeit erledigt, das Kennwort jedoch nicht unbedingt preisgeben möchte.
Celada
@Celada, es ist eine alte Frage, aber wäre ein solcher Ansatz nicht anfällig für Speicherdumping, wenn man die Speicherbereich-Offsets nachschaut /proc/${PID}/mapsund dann die relevanten Speicherbereiche liest /proc/${PID}/mem? Oder schränkt das Einschränken der Berechtigungen für die Datei der ausführbaren Datei auch die Leseberechtigungen für die relevanten Abschnitte im Speicher während der Ausführung ein? (Letzteres scheint unwahrscheinlich, IMO.)
Spencer D