Kann ein Skript ausführbar, aber nicht lesbar sein?

Kann ein Skript ausführbar, aber nicht lesbar sein?

Ist es möglich, ein Skript auszuführen, wenn keine Leseberechtigung vorliegt? Ich habe im Root-Modus ein Skript erstellt und möchte, dass der andere Benutzer dieses Skript ausführt, aber nicht liest. Ich habe das chmodLesen und Schreiben verboten, die Ausführung jedoch zugelassen. Im Benutzermodus wurde jedoch die Meldung angezeigt, dass die Berechtigung verweigert wurde.

Antwort1

Das Problem besteht darin, dass nicht das Skript ausgeführt wird, sondern der Interpreter ( bash, perl, python, usw.). Und der Interpreter muss das Skript lesen. Dies unterscheidet sich von einem „normalen“ Programm wie , lsda das Programm direkt in den Kernel geladen wird, wie es der Interpreter tun würde. Da der Kernel selbst die Programmdatei liest, muss er sich nicht um den Lesezugriff kümmern. Der Interpreter muss die Skriptdatei lesen, wie eine normale Datei gelesen werden müsste.

Antwort2

Dies ist nur für Binärdateien möglich.

$ chown foo:foo bar
$ chmod 701 bar

Als nicht privilegierter Benutzer:

$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar

$ cat bar
cat: bar: Permission denied

$ ./bar
baz

Jetzt kommt der Clou. Obwohl die Datei mit herkömmlichen Mitteln nicht lesbar ist, können Sie das Lesen der Datei nicht wirklich verhindern. Dies ist tatsächlich eine Herausforderung fürhttp://smashthestack.org/(Level 13). Es gibt ein bekanntes Dienstprogramm namens, hktracemit dem Sie die Datei mithilfe von lesen können ptrace.

Antwort3

An den vorherigen Aussagen ist eine halbe Wahrheit. Sie können ein Skript so einrichten, dass es vom Benutzer nicht gelesen, aber dennoch ausführbar ist. Der Vorgang ist etwas langwierig, aber machbar, indem Sie in /etc/sudoer eine Ausnahme machen, sodass der Benutzer das Skript vorübergehend als Sie selbst ausführen kann, ohne nach einem Passwort gefragt zu werden. Diese Methode: - umgeht den Setuid-Patch für andere Distributionen. - ermöglicht es Ihnen, einem bestimmten Skript vorübergehend erhöhte Berechtigungen zu erteilen, ohne dem Benutzer Sudo-Rechte für alles zu erteilen.

Befolgen Sie die Anweisungen in diesem Beitrag: Dateiberechtigung „Nur ausführen“

Antwort4

Ich denke, das können Sie mit tun setuid.

Außer, dass Sie es nicht können, weil die meisten Distributionen es (anscheinend) setuiddeaktiviert haben, weil es eine massive Sicherheitslücke ist. Bei mir ist es deaktiviert, also weiß ich nicht wirklich, ob diese Antwort funktionieren wird, ich poste es trotzdem, weil ich denke, dass essollen.

Wenn ich jedenfalls das tun wollte, was Sie tun möchten – und ich hätte eine Distribution mit setuidaktivierten Skripts – würde ich etwa Folgendes tun:

$ chmod 700 myscript
$ cat > myscript-nonroot
#!/bin/sh
bash myscript
^D
$ sudo chown root:root myscript-nonroot
$ sudo chmod 4755 myscript-nonroot # make SURE this isn't world-writable!

Das heißt, ich würde ein weiteres Skript schreiben, dessen einziger Zweck darin besteht, das schreibgeschützte Root-Skript aufzurufen, es so zu ändern, dass es Root gehört, und ihm die Setuid-Berechtigung zu erteilen. (Zusammen mit dem damit verbundenen Status, dass es für alle anderen nicht beschreibbar ist.)

Da die Funktion myscript-nonroot für jeden lesbar ist, kann sie gelesen und ausgeführt werden, und bis Sie bei der Zeile angekommen sind, in der Sie Ihr Skript tatsächlich ausführen ( bash myscript), wird es als Root ausgeführt (oder als wer auch immer Sie möchten, der genaue Benutzer spielt keine Rolle, solange die Wrapper-Datei demselben Benutzer gehört).

verwandte Informationen