Können Skripte auch dann ausgeführt werden, wenn sie nicht als ausführbar festgelegt wurden?


25

Ich kann scheinen, Indexe (.sh) mit und ohne sie laufen zu lassen, die als ausführbar eingestellt werden. Wo genau ist das wichtig?

Antworten:


23

Angenommen, Sie haben die Datei myscript, die Folgendes enthält:

#!/bin/bash
echo "Hello, World!"

Wenn Sie diese Datei ausführbar machen und mit ausführen ./myscript, erkennt der Kernel, dass die ersten beiden Bytes vorhanden sind #!, was bedeutet, dass es sich um eine Skriptdatei handelt. Der Kernel verwendet dann den Rest der Zeile als Interpreter und übergibt die Datei als erstes Argument. So läuft es:

/bin/bash myscript

und bash liest die Datei und führt die darin enthaltenen Befehle aus.

Damit bash (oder welcher Interpreter auch immer Ihr Skript benötigt) das Skript "ausführen" kann, muss es nur in der Lage sein, die Datei zu lesen.

Bei Skripten erleichtert das Ausführungsbit die Ausführung. Solange bash ausführbar ist, können Sie bash immer mit der Skriptdatei als Argument ausführen oder bash interaktiv ausführen und das Skript Zeile für Zeile in Ihr Terminal kopieren, um die Befehle ausführen zu lassen.


Vielen Dank für die ausführliche Erklärung. :) Wenn ich es richtig verstanden habe, benötigt jeder Benutzerzugriff auf bash nur Lesezugriff auf das Skript, um es auszuführen, da bash das Skript als Eingabe verwendet und nur lesen muss. Ich kann dieses Verhalten beenden, indem ich die Leseberechtigung des Skripts für diesen Benutzer erhalte. Recht? Wann wird diese ausführbare Berechtigung verwendet und ist genau wichtig?
Ashfame

Ja, wenn Sie "bash myscript" verwenden, benötigen Benutzer nur Lesezugriff für "myscript" (und natürlich ausführbar für / bin / bash, wenn bash im Pfad enthalten ist). Wenn Sie jedoch Ihr Skript ausführbar machen, sieht das etwas anders aus. Aus Sicht des Kernels ist es zwar wieder "/ bin / bash myscript", wenn die erste Zeile "#! / Bin / bash" ist. Um diesen Punkt zu erreichen, müssen Sie jedoch zuerst das Skript als ausführbare Datei für das präsentieren Benutzer oder Gruppe. Dies ist jedoch der Fall, wenn für einige Benutzer das Skript nicht ausführbar, sondern lesbar ist. Er kann das Skript dennoch mit "bash myscript" ausführen.
LGB

@LGB Das ist also ziemlich nutzlos. Das Gute ist, einem Benutzer die Leseberechtigung für dieses Skript zu entziehen. Recht?
Ashfame

@Ashfame: Ich würde eher nützlich als nutzlos sagen. Das Ausführungsbit für reguläre Dateien wird nicht zur Einschränkung des Zugriffs verwendet (und sollte auch nicht verwendet werden). Es scheint, als würden Sie das von ihm erwarten. Wenn Sie über eine ausführbare Binärdatei verfügen, müssen Sie über die Ausführungsberechtigung verfügen, um sie ausführen zu können. Wenn Sie jedoch Lesezugriff darauf haben, können Sie die Datei jederzeit in Ihr eigenes Basisverzeichnis kopieren. In diesem Fall gehört die Kopie Ihnen, sodass Sie ihr Ausführungsberechtigungen hinzufügen und sie ausführen können. Für Verzeichnisse hat es jedoch einen etwas anderen Zweck. Siehe mywiki.wooledge.org/Permissions
geirha

1
Was soll ich anstelle von / bin / bash verwenden, wenn ich den richtigen Interpreter nicht kenne? Gibt es einen Befehl, der das Skript gemäß der Shebang-Zeile ausführt?
Aivar

16

Stellen Sie sicher, dass Sie "Ausführen des Shell-Skripts" nicht mit "Ausführen eines Shell-Skripts mit sh" verwechseln.

Dies wird nicht durch Dateiberechtigungen beeinflusst auf file.sh:

sh file.sh

Sie führen aus sh(was in das Programm aufgelöst wird /bin/sh), was file.shden Code liest und ausführt.

Dateiberechtigungen werden wirksam, wenn Sie das Skript selbst ausführen :

./file.sh

Beachten Sie, dass Dateiberechtigungen von Nicht-Linux-Dateisystemen wie FAT nicht unterstützt werden. Selbst wenn Sie eine chmod -x file.shDatei ausführen , hat diese die vorherigen Berechtigungen.

Die Ausführungsberechtigung wird vom Dateisystem erzwungen. Programme können den Code aber auch "ausführen", indem sie den Dateiinhalt lesen, wodurch die Dateisystemberechtigungen bei "Ausführen" umgangen werden.


Ich verstehe deine Meinung. Aber ist es dann für eine Gruppe oder eine Welt oder beides?
Ashfame

@Ashfame Wenn Sie die ausführbare Berechtigung festlegen, kann das Skript direkt von Benutzern ausgeführt werden, die über diese Berechtigung verfügen - unabhängig davon, ob sie diese auf Gruppen-, Welt- oder Besitzerbasis haben. Aber auch Leute ohne Ausführungserlaubnis können es ausführen, indem sie ein anderes Programm (wie bash) aufrufen , um die Ausführung durchzuführen - um zu blockieren, dass Sie auch ihre readErlaubnis entziehen müssten .
jg-faustus

If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basisAber wie wird die Berechtigung verschiedenen Benutzern durch Überprüfen der ausführbaren Berechtigung erteilt? Und ich habe deinen zweiten Punkt. Sie wollen damit die Leseberechtigung für das Skript entfernen, damit sie es nicht einmal durch Bash verarbeiten können. Recht?
Ashfame

@Ashfame Auf dem Leseberechtigungspunkt, ja. Auf welche Weise würden Sie so etwas wie sudo chmod g+x myfile.shim Terminal aufrufen , um Ausführungsberechtigungen für die Dateigruppe hinzuzufügen. Siehe Tutorial zu Dateiberechtigungen . Um Berechtigungen für mehrere Benutzer gleichzeitig zu verwalten, würden Sie Gruppen verwenden, siehe zum Beispiel Gruppen verwalten .
jg-faustus

Was ich meinte war, wenn wir die ausführbare Berechtigung in GUI hinzufügen, dann ist es für wen? Besitzer / Gruppe / Welt?
Ashfame

1

Denk nicht so darüber nach. Kann ich diese Datei ausführen? Stellen Sie sich das folgendermaßen vor: Wer kann diese Datei ausführen?

Wenn der Computer Ihnen gehört und die Datei Ihnen gehört, können Sie sie sicher ausführen. Vielleicht möchten Sie Befehle wie chmod und chown sowie Dateiberechtigungen genauer untersuchen.

Ich hoffe das hilft.


Ja, ich weiß über sie Bescheid. Das heißt, ich (Eigentümer) kann es immer ausführen. Recht? Wenn Sie dann eine Datei als ausführbar festlegen, gilt dies für die Gruppe oder die Welt oder für beide?
Ashfame

1

Der execSystemaufruf des Linux-Kernels schlägt fehl, EACCESwenn die Datei nicht ausführbar ist

Während Sie dies tun können sh myprog.sh(was nur das Lesen der Dateien und Interpretationen betrifft), kann der Versuch, das Programm so auszuführen, ./myprog.shnicht funktionieren, da Sie dies tun:

Dies kann überprüft werden mit main.c:

#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
    char *argv[] = {"myprog", NULL};
    char *envp[] = {NULL};
    int ret;
    ret = execve("myprog.sh", argv, envp);
    perror("execve");
    printf("%d\n", errno);
    printf("%d\n", EACCES);
}

und myprog.sh:

#!/bin/sh
echo worked

Wenn myprog.shnicht ausführbar, mainschlägt fehl mit:

execve: Permission denied
13
13

Getestet in Ubuntu 17.10 gcc -std=c99.

POSIX 7 erwähnt, dass bei:

Die exec-Funktionen mit Ausnahme von fexecve () schlagen fehl, wenn:

[EACCES] Die Suchberechtigung wird für ein Verzeichnis verweigert, das im Pfadpräfix der neuen Prozessabbilddatei aufgeführt ist, oder die neue Prozessabbilddatei verweigert die Ausführungsberechtigung.

Weitere Gründe finden Sie unter: https://security.stackexchange.com/questions/66550/unix-execute-permission-can-easly-bypassed-is-it-superfluous-or-whats-the

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.