Ist es möglich, ein Skript auszuführen, wenn keine Berechtigung zum Lesen vorhanden ist? Im Root-Modus habe ich ein Skript erstellt und möchte, dass der andere Benutzer dieses Skript ausführt, aber nicht liest. Ich habe chmod
das Lesen und Schreiben verboten, aber die Ausführung zugelassen. Im Benutzermodus wurde jedoch die Meldung angezeigt, dass die Berechtigung verweigert wurde.
shell-script
permissions
executable
wie er
quelle
quelle
Antworten:
Das Problem ist , dass das Skript ist nicht das, was läuft, aber der Dolmetscher (
bash
,perl
,python
, etc.). Und der Dolmetscher muss das Skript lesen. Dies unterscheidet sich von einem "normalen" Programm dadurch,ls
dass das Programm wie der Interpreter direkt in den Kernel geladen wird. Da der Kernel selbst Programmdateien liest, muss er sich keine Gedanken über den Lesezugriff machen. Der Interpreter muss die Skriptdatei lesen, so wie eine normale Datei gelesen werden müsste.quelle
Dies ist nur für Binärdateien möglich.
Als nicht privilegierter Benutzer:
Hier ist der Kicker. Obwohl die Datei auf herkömmliche Weise nicht lesbar ist, können Sie das Lesen der Datei nicht verhindern. Dies ist tatsächlich eine Herausforderung auf http://smashthestack.org/ (Level 13). Es gibt ein bekanntes Hilfsprogramm
hktrace
, mit dem Sie die Datei lesen könnenptrace
.quelle
Dies ist zumindest unter Linux nicht möglich (andere Unices könnten dies zulassen). Denken Sie darüber nach, wenn Sie das Skript ausführen, muss die Shell es lesen, um zu wissen, was zu tun ist.
quelle
Du kannst das, denke ich, mit machen
setuid
.Abgesehen davon, dass dies nicht möglich ist, da die meisten Distributionen (anscheinend)
setuid
deaktiviert wurden, da dies eine massive Sicherheitslücke darstellt. Es ist bei mir deaktiviert, daher weiß ich nicht, ob diese Antwort funktioniert. Ich poste sie trotzdem, weil ich denke, dass es das sollte .Wie auch immer, wenn ich tun wollte, was Sie tun wollten - und ich hatte eine Distribution mit
setuid
aktivierten Skripten - würde ich Folgendes tun:Das heißt, ich würde ein anderes 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 Berechtigung setuid zu erteilen. (Zusammen mit dem Status der nicht beschreibbaren Begleitperson durch alle anderen.)
Da die myscript-nonroot-Funktion für alle lesbar ist, kann sie gelesen und ausgeführt werden. Sobald Sie zwei Zeilen erhalten
bash myscript
, wird sie als root ausgeführt (oder wer auch immer Sie möchten, der genaue Benutzer) spielt keine Rolle, solange sich die Wrapper-Datei im Besitz desselben Benutzers befindet.)quelle
4
setzt das setuid- Bit. Weitere Informationen finden Sie im Abschnitt Modi in der Manpage zu chmod auf manpagez .755
Stück verstanden habe.chmod 755
gleich wie 0775 oktal. Es gibt eine Menge Verwirrung um das. Diese Seite ( manpagez.com/man/1/chmod ) hat eine schreckliche und unbrauchbare horizontale Schriftrolle, die ich nicht verstehen kann ...Es gibt eine halbe Wahrheit zu den vorherigen Aussagen. Sie können ein Skript so einrichten, dass es für den Benutzer nicht lesbar, aber dennoch ausführbar ist. Der Prozess ist etwas langwierig, kann jedoch durch eine Ausnahme in / etc / sudoer ausgeführt werden, sodass der Benutzer das Skript vorübergehend als Sie selbst ausführen kann, ohne zur Eingabe eines Kennworts aufgefordert zu werden. Diese Methode: - umgeht den Setuid-Patch für andere Distributionen. - Ermöglicht es Ihnen, vorübergehend erhöhte Berechtigungen für ein bestimmtes Skript zu erteilen, ohne dem Benutzer Sudo-Rechte für alles zu erteilen.
Befolgen Sie die Anweisungen in diesem Beitrag: Nur Dateiberechtigung ausführen
quelle
In dieser Situation habe ich sudo mit einer NOPASSWD-Option verwendet, damit die Benutzer das Skript ausführen können, ohne es lesen zu können.
quelle
Es funktioniert unter OpenBSD
Wie bereits in einem Kommentar von @eradman erwähnt, ist dies unter OpenBSD möglich.
Als root:
Als regulärer Benutzer:
Das funktioniert, indem man
/dev/fd/3
dem Interpreter (oder was auch immer das offene fd zum Skript ist) übergibt . Dieser Trick würde unter Linux nicht funktionieren, wo/dev/fd/N
es keine Sonderzeichengeräte gibt, diedup(2)
beim Öffnen einen der fd zurückgeben, sondern "magische" Symlinks zur Originaldatei / zum Originaleintrag, die die Datei von Grund auf öffnen [1]. Es könnte in Free / NetBSD oder Solaris implementiert werden ...Aber es ist nicht das, was es verspricht
Grundsätzlich bedeutet das Erteilen der
x
(Ausführungs-) Erlaubnis auch das Erteilen derr
(Lese-) Erlaubnis für jede Datei, die einen Shebang hat:ktrace
ist nicht der einzige Weg; Wenn der Interpreter wieperl
oder dynamisch mit einer ausführbaren Datei verknüpft ist , kann stattdessenpython
einLD_PRELOAD
ed-Hack verwendet werden, der dieread(2)
Funktion überschreibt .Und nein, wenn Sie es setuid machen, wird ein normaler Benutzer nicht daran gehindert, seinen Inhalt zu sehen. sie könnte es einfach unterlaufen lassen
ptrace(2)
, wodurch die setuid-Bits ignoriert werden:Als root:
Als regulärer Benutzer:
(Entschuldigung, wenn dies nicht der einfachste Weg ist, es zu demonstrieren)
[1] Dies könnte unter Linux mithilfe von emuliert werden
binfmt_misc
, der Interpreter muss jedoch geändert oder ein Wrapper muss verwendet werden. Im letzten Teil dieser Antwort finden Sie ein Beispiel, das absichtlich lächerlich unsicher gemacht wurde.[2] oder generell jede Datei, die nicht
execve()
zur Rückkehr führtENOEXEC
.quelle
Ja, wenn Sie Rootbenutzer sind, können Sie Dateien ohne Leseberechtigung ausführen
Wenn Sie sich jedoch mit einem anderen Benutzer anmelden, können Sie diese Datei nicht ausführen
quelle
Um Ihre Skripte unlesbar und dennoch ausführbar zu machen, haben Sie drei Hauptoptionen:
Erste Wahl
Verwenden Sie den Befehl openssl, um ihn manuell zu verschlüsseln. Wenn Sie das Skript in Zukunft ausführen möchten, müssen Sie openssl erneut manuell ausführen und das zu entschlüsselnde Kennwort eingeben.
Verschlüsselung mit openssl:
Katze yourscript.sh | openssl aes-128-cbc -a -salt -k deinpasswort> yourscript.enc
Entschlüsselung mit openssl:
cat yourscript.enc | openssl aes-128-cbc -a -d -salt -k deinpasswort> yourscript.dec
yourscript.dec entspricht dem ursprünglichen Skript yourscript.sh
Zweite Option
Verwenden Sie eine Site wie www.Enscryption.com , um Ihr Skript automatisch zu verschlüsseln und die verschlüsselte Version des Skripts ausführbar zu machen. Diese Site verwendet sowohl die Verschlüsselungsfunktionen von openssl als auch einige andere Verschleierungsmethoden, um es Eindringlingen recht schwer zu machen, in Ihr Skript einzudringen oder Geheimnisse zu enthüllen, die Sie verbergen möchten. Mit dieser Site können Sie Shell-Skripte und Befehlszeilen-Perl-, Python- und Ruby-Skripte verschlüsseln. Ich denke auch php.
Dritte Option
Verwenden Sie ein Werkzeug wie shc . Sieht so aus, als ob es seit 2012 nicht mehr aktualisiert wurde. Ich habe es jedoch in der Vergangenheit verwendet. Sie müssen Ihr Skript für jedes Betriebssystem kompilieren, auf dem Sie es verwenden möchten, wenn sich das Betriebssystem von dem unterscheidet, mit dem Sie es kompiliert haben.
Zusammenfassung:
Wenn es für Sie von großer Bedeutung ist, Ihren Code zu verbergen, können Sie sich nur auf Berechtigungen und Eigentumsrechte verlassen, da jeder mit Root-Rechten darauf zugreifen kann. Das ist nur eine Tatsache. Was Sie tun können, um das unbefugte Anzeigen Ihres Codes durch irgendjemanden zu verhindern, ist, ein Skript um den Befehl openssl zu schreiben. Stellen Sie sicher, dass Sie vor der Ausführung des Skripts zur Eingabe eines Kennworts aufgefordert werden, und führen Sie das Skript nach der Eingabe des Kennworts aus, ohne es in eine temporäre Datei zu schreiben. Wenn dies nach zu viel Arbeit klingt, sollten die Optionen 2 und 3 für Ihre Zwecke ausreichen.
quelle