Noexec-Option in fstab verwenden

1514
Igor

Dieser Link erläutert die Vorteile der noexecOption bei der Verwendung mount. Es gibt jedoch eine Einschränkung. Wenn ich ein Perl / Python / Shell-Skript oder eine Datei habe, die mit dem Start beginnt #!und versuchen wird, es auszuführen, kann ich dies tun, unabhängig davon, ob ich die Option angegeben habe oder nicht.

Gibt es eine Möglichkeit, eine solche Ausführung zu verhindern? Gibt es eine zusätzliche Option, noexecdie ich geben kann, und die Ausführung der Skripts wird nicht möglich sein?

1
"und werde versuchen, es auszuführen" Wie? Durch direktes Ausführen oder durch Übergabe an den Dolmetscher? Ignacio Vazquez-Abrams vor 6 Jahren 0
@ IgnacioVazquez-Abrams, in beide Richtungen. Ich kann versuchen, auf das Skript zu klicken oder es einfach im Terminal einzugeben. Igor vor 6 Jahren 0
Keiner dieser Wege beantwortet meine Frage. Ignacio Vazquez-Abrams vor 6 Jahren 0
@ IgnacioVazquez-Abrams, na gut, dann verstehe ich die Frage nicht. Kannst du das bitte klären? Weil ich davon ausgegangen bin, dass Sie gleich "cd" tippen && python my_script.py`. Igor vor 6 Jahren 0
Das ist das zweite, ja. Und das wird es nicht ausführen, so dass es von "noexec" nicht beeinflusst wird. Ignacio Vazquez-Abrams vor 6 Jahren 1
@ IgnacioVazquez-Abrams, OK, ich schätze, ich habe die Antwort falsch verstanden. Aber sagen wir, ich habe ein Skript, das cat / etc / passwd ausführt. Wenn ich dann versuche, es auszuführen, wird der Inhalt dieser Datei auf die Standardausgabe gedruckt, oder? Und entschuldige, dass ich diese Antwort falsch interpretiert habe. Igor vor 6 Jahren 0
Das hängt davon ab, wie Sie es "ausführen". Ignacio Vazquez-Abrams vor 6 Jahren 0
@ IgnacioVazquez-Abrams, der zweite Weg. Siehe meine Antwort oben. Angenommen, ich mache 'cd&& python my_script.py` und das Skript druckt die Datei / etc / passwd. Ich bin mit Python nicht sehr vertraut, daher kann ich dieses Skript nicht verwenden. Oder stellen Sie sich einfach vor, ich habe ein Bash-Skript. Igor vor 6 Jahren 0
Durch die Übergabe an den Interpreter wird das Skript nicht ausgeführt, sondern nur gelesen. Ignacio Vazquez-Abrams vor 6 Jahren 1
@ IgnacioVazquez-Abrams, also, was wird "noexec" in diesem Fall tun? Es wird nur "cat / etc / passwd" gedruckt, aber nicht die eigentliche Datei? Wie haben Sie in der ersten Antwort zuerst gefragt? Igor vor 6 Jahren 0
"noexec" tut nichts. Der Interpreter wird das Skript lesen und tun, was auch immer das Skript sagt. Ignacio Vazquez-Abrams vor 6 Jahren 0
Der erste Weg führt `path / to / script.py` aus. Dieses * führt das Skript nach Möglichkeit aus. Ignacio Vazquez-Abrams vor 6 Jahren 1
@ IgnacioVazquez-Abrams, also wird in diesem Fall der Inhalt der Datei / etc / passwd gedruckt? Ich will das nicht und möchte das vermeiden. Igor vor 6 Jahren 0
@ IgnacioVazquez-Abrams, aber der erste Weg wird durch "noexec" verhindert. Igor vor 6 Jahren 0
`noexec` verhindert, dass das Skript ausgeführt wird, aber nicht gelesen wird. Ignacio Vazquez-Abrams vor 6 Jahren 0
Lassen Sie uns [diese Diskussion im Chat fortsetzen] (http://chat.stackexchange.com/rooms/69089/discussion-between-igor-and-ignacio-vazquez-abrams). Igor vor 6 Jahren 0
@ IgnacioVazquez-Abrams, das Lesen interessiert mich zumindest nicht. Ich muss nur die Ausführung der Binärdatei und des Skripts verhindern. Wenn ich also das Skript mit "python test_script.py" wie im obigen Beispiel ausführte, wird der Inhalt des Skripts oder der Inhalt von / etc / passwd gedruckt? Igor vor 6 Jahren 0
@ IgnacioVazquez-Abrams Es stellte sich heraus (meiner Meinung nach), dass mehr unter der Oberfläche war. Überprüfen Sie meine Antwort, Sie können es interessant finden. Kamil Maciorowski vor 6 Jahren 0

1 Antwort auf die Frage

3
Kamil Maciorowski

Es gibt hier ein großes Missverständnis. Machen wir diese Dinge klar.

Zuallererst ist die Einschränkung, auf die Sie sich beziehen, nicht richtig :

Wenn jedoch ein Skript (eine Textdatei, die mit einer She-Bang-Zeile beginnt; dh eine Zeile, die mit beginnt #!) an einige Shells (Bash) übergeben wird, wird die in dieser Zeile genannte ausführbare Datei (zB /usr/bin/perl) ausgeführt und die Verbindung hergestellt Inhalt der Skriptdatei auf die Standarddatei dieser ausführbaren Datei, die sich möglicherweise nicht auf diesem Laufwerk befindet.

Überraschenderweise scheint es , trotznoexec, die Fähigkeit zur Ausführung zu erklären . Ich glaube, der Fragesteller hat das alles falsch verstanden und es war nicht seine oder ihre Schuld! Eine falsche Annahme in der Frage verursachte eine andere falsche Annahme in der Antwort.

Was ist dann los?

1. Bind Mount ist spezifisch

Um etwas Kontext zu erhalten, schauen wir uns an, was passiert, wenn Sie versuchen, Mount schreibgeschützt zu binden. Es gibt folgende Frage: Warum mounten Sie nicht die schreibgeschützte Option für Bind-Mounts? Die Schlussfolgerung lautet:

Um das gewünschte Ergebnis zu erzielen, müssen Sie zwei Befehle ausführen:

mount SRC DST -o bind mount DST -o remount,ro,bind 

Neuere Versionen von mount (util-linux> = 2.27) führen dies automatisch aus, wenn eine ausgeführt wird

mount SRC DST -o bind,ro 

Aber wenn Sie versuchen, noexecstatt zu verwenden ro, benötigen Sie noch zwei Befehle! In meinem Kubuntu habe ich util-linux 2.27.1-6ubuntu3.3und diesen Befehl:

mount SRC DST -o bind,noexec 

ignoriert noexec, muss ich neu aufstellen. Es ist dasselbe, wenn die Montage über erfolgt /etc/fstab. Sie können experimentieren. Prüfen Sie jederzeit mit einfachem mountBefehl, welche Optionen es gibt.

Ich wette, der Fragende dachte, das Reittier wäre mit noexecOption, aber eigentlich nicht. Er oder sie war in der Lage, ein Skript innerhalb des angeblich noexecMountpoint auszuführen . Es war seltsam, daher die Frage.

Dann hat der Antwortautor dies interpretiert, als ob es die Shell war, die shebang liest, eine andere ausführbare Datei aufruft und sich keine Sorgen um noexecdas Skript macht. Wenn der Mountpoint wirklich war, noexecwäre das eine vernünftige Spekulation.

Aber…

2. Es ist ein verbreiteter Mythos, dass Muscheln Shebangs lesen; Kernel tut

Lesen Sie wie das #! Shebang Arbeit? und eine der Antworten dort war ursprünglich dem Mythos gefolgt, dann wurde es korrigiert.

Wenn Sie also

  • ein Mountpoint /mnt/foo/mit noexecOption,
  • ein Skript, /mnt/foo/script.pydas ansonsten ausführbar ist (zB chmod -x …aufgerufen wurde),
  • Ein Shebang gefällt #!/usr/bin/pythonals erste Zeile im Skript

und du lässt es so laufen

/mnt/foo/script.py 

Dann lässt Sie Ihr Linux-Kernel nicht wegen noexec. In dieser anderen Frage wäre es passiert, wenn die Montierung tatsächlich noexecda wäre; aber ich glaube es war nicht.

3. Es gibt jedoch zwei Möglichkeiten, ein Skript "auszuführen"

Aus den Kommentaren:

"und werde versuchen, es auszuführen" Wie? Durch direktes Ausführen oder durch Übergabe an den Dolmetscher?

Direkt laufen heißt:

 /mnt/foo/script.py 

Dies wird, noexecwie oben ausgeführt, ehren . Die ausführbare Datei ist script.py .

Die Übergabe an den Dolmetscher bedeutet:

python /mnt/foo/script.py 

In diesem Fall ist die ausführbare Datei python. Es ist egal, ob foo/mit montiert wird noexec; es spielt keine Rolle, ob überhaupt script.pyausführbar ist; Es ist egal, was der Shebang ist. Der Punkt wird script.pynicht ausgeführt, sondern gelesen .

Solange der Benutzer eine Datei lesen und einen geeigneten Interpreter ausführen kann, kann die Weitergabe der Datei an den Interpreter nicht verhindert werden. aber es ist nicht die Datei, die ausgeführt wird.

Vielen Dank für eine so vollständige und perfekt gestellte Erklärung. Zur Kenntnis genommen. Igor vor 6 Jahren 0