Mit Bashs ist source
es möglich, ein Skript ohne gesetztes Ausführungsbit auszuführen. Dies ist dokumentiertes und erwartetes Verhalten, aber ist dies nicht gegen die Verwendung eines Ausführungsbits?
Ich weiß, das source
schafft keine Unterschale.
bash
permissions
executable
source
conventions
Motte001
quelle
quelle
chmod
Sie Berechtigungen (einschließlich `x) mit einer Oktalzahl festlegen können, gibt einen Hinweis darauf, aus welcher Ära sie stammt. Es würde mich nicht wundern, wenn es als schneller und schmutziger Indikator "Dies ist eine Binärdatei, die Sie ausführen können" aus den Tagen vor dercp /sbin/suidexecutable /tmp/mycopy; /tmp/mycopy
Antworten:
Bash ist ein Dolmetscher; Es akzeptiert Eingaben und macht, was es will. Das ausführbare Bit muss nicht beachtet werden. Tatsächlich ist Bash portabel und kann auf Betriebssystemen und Dateisystemen ausgeführt werden, die kein Konzept für ein ausführbares Bit haben.
Was für das ausführbare Bit wichtig ist, ist der Betriebssystemkern. Wenn der Linux-Kernel
exec
beispielsweise prüft, dass das Dateisystem nicht mit einernoexec
Option angehängt ist , prüft er das ausführbare Bit der Programmdatei und erzwingt alle Anforderungen, die von Sicherheitsmodulen (wie SELinux oder AppArmor) gestellt werden.Beachten Sie, dass das ausführbare Bit eine eher diskretionäre Art der Steuerung ist. Auf einem Linux x86-64-System können Sie beispielsweise die Überprüfung des ausführbaren Bits durch den Kernel umgehen, indem Sie explizit
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
als Interpreter aufrufen :Dies ist etwas analog zur Beschaffung von Bash-Quellcode in Bash, außer dass dies
ld.so
der Interpreter ist und der Code, den er ausführt, Maschinencode im ELF-Format ist.quelle
ld.so
ist das dynamische Verknüpfen.source
oder das Äquivalent , aber Standard - Punkt.
nicht ausführen das Skript, aber lesen Sie die Befehle aus Skriptdatei, dann führen sie, Zeile für Zeile, in der aktuellen Shell - Umgebung.Es spricht nichts gegen die Verwendung des Ausführungsbits, da die Shell nur Leseberechtigungen benötigt , um den Inhalt der Datei zu lesen.
Das Ausführungsbit wird nur benötigt, wenn Sie das Skript ausführen . Hier wird die Shell einen
fork()
neuen Prozessexecve()
ausführen und dann mithilfe der Funktion ein neues Prozessabbild aus dem Skript erstellen, das eine reguläre ausführbare Datei sein muss.quelle
bash < script
, erhalten Sie im Wesentlichen das gleiche Ergebnis wiesource script
. Welchen Schutz bietet eine Ausführungsbitprüfung?execv
* -Familie von Systemaufrufen mit einer ausführbaren Datei verwendet werden kann, nicht, ob sie von einem Interpreter ausgeführt wird. Warum Menschen verwirren (und die Fähigkeit zum Bewerten von aus Nicht-Datei-Quellen gestreamtem Code beeinträchtigen), indem Konventionen verletzt werden?bin/activate
verfügt daher nicht über ein ausführbares Bit. Skripte können Bibliotheken oder ähnliche Dinge sein. Ich denke, .sh zu haben könnte auch ein Signal sein, aber ein Minimum an./bin/activate
. bin/activate
Das ausführbare Bit (im Gegensatz zum Rest) für nicht-setuid- und nicht-setguid-Dateien ist kein wirklicher Sicherheitsmechanismus. Alles, was Sie lesen können, können Sie indirekt ausführen, und Linux lässt Sie indirekt alles lesen, was Sie ausführen können, aber nicht direkt lesen (das sollte ausreichen, um ein Loch in das Konzept von non-set (g) uid x-bit als a zu schlagen Sicherheitsmaßnahme).
Es ist eher eine praktische Sache: Lassen Sie das System es direkt für mich ausführen, wenn das Bit gesetzt ist, andernfalls muss ich es indirekt ausführen (
bash the_script;
oder etwas hacken, um das Speicher-Image einer ausführbaren Datei ohne Leseberechtigung zu erhalten ).Sie können es bequem einstellen, wenn Sie beabsichtigen, Ihr Insourcable sowohl in der Quelle als auch in der Ausführung auszuführen.
Offensichtlich teilen jedoch viele Implementierer von gemeinsam genutzten Bibliotheken Ihre Meinung und folglich erfordern viele Systeme, dass gemeinsam genutzte Bibliotheken, die im Wesentlichen das native Äquivalent von Shell-Insourcables sind, als ausführbar markiert werden, um verwendbar zu sein. Siehe Warum können gemeinsam genutzte Bibliotheken ausgeführt werden? .
quelle
chmod
ausführen. Es dient zum Sortieren von Daten aus Programmen, daher ist die Frage des OP eine vernünftige.x
Bit ist nur ein zusätzlicher Ort, an dem es einen Hinweis darauf lesen / schreiben kann, was zu tun ist./tmp$ cp /bin/cat ./cat ; chmod a-rw ./cat ; ./cat & cp /proc/$!/exe /tmp/cat2
cp: cannot stat ‘/proc/16260/exe’: Permission denied
Das ist eine gute Frage! Unix verwendet das ausführbare Bit, um zwischen Programmen und Daten zu unterscheiden. Das Betriebssystem benötigt das Ausführungsbit nicht, da kein bezogenes Skript zur Ausführung als neuer Prozess an das Betriebssystem übergeben wird. Die Shell behandelt ein bezogenes Skript jedoch als Programm und sucht
$PATH
nach der Datei, die Sie als Quelle verwenden möchten. Die Shell selbst hätte also Ausführungsberechtigungen für Quelldateien benötigen können. aber das tat es nicht.Die Frage muss längst aufgetaucht sein. Das Design der Bourne-Shell war das Ergebnis einer "langen Abfolge von Modifikationen, Dialogen und Diskussionen" unter den Bewohnern von Bell Labs, und viele Designentscheidungen wurden im Laufe der Jahre von SR Bourne und anderen diskutiert. Leider fand mein kurzer Blick keine Diskussion über das Quellfeature (zu meiner Verteidigung ist es schwer, darauf zu googeln). Was ich gefunden habe, ist das "." Der Befehl wird in dieser frühen Einführung in die Shell von Bourne selbst nicht angezeigt, ist jedoch in der ausgereifteren Version 7 enthalten .
Abwesende Autorität, hier ist meine eigene Interpretation:
Der
.
Befehl, auch bekannt alssource
, wird in Textform (wie#include
im C-Präprozessor) in den Quellcode des ausführenden Skripts oder der interaktiven Sitzung eingefügt. Daher wird die enthaltene Datei möglicherweise nicht "ausgeführt".Die Unix-Philosophie war es schon immer, den Programmierern genügend Seile zum Aufhängen zu geben. Zu viel Händchenhalten und willkürliche Einschränkungen stehen einfach im Weg. Einige Distributionen
rm -r /
weigern sich erst vor kurzem, das zu tun, wonach Sie fragen. (Dieser Befehl weist Sierm
an, alles auf Ihrem Computer zu löschen. Versuchen Sie es nicht als root! Oder besser noch gar nicht.) Also, vielleicht Bourne at al. Ich habe gerade entschieden, dass Sie beim Versuch, eine Datei zu erstellen, wissen müssen, was Sie tun. Das vermeidet auch unnötige Arbeit und Zyklen waren damals sehr wichtig.quelle
Für das Betriebssystem besteht eine Datei, die ein Shell-Skript enthält, nur aus Daten. Wenn Sie den Namen einer solchen Datendatei an den
source
Befehl übergeben oder in der Befehlszeile an einen Aufruf der Bash-Shell übergeben, sieht das Betriebssystem nur eine Zeichenfolge, die zufällig mit dem Namen einer Datei übereinstimmt, die Daten enthält.Wie wäre das Ausführungsbit in diesem Fall überhaupt relevant?
quelle
Die Unterscheidung ist wichtig, da Sie möglicherweise eine Datei mit Shell-Befehlen haben, die nicht als ausführbare Datei, sondern nur als Quelle nützlich ist. Für diese Datei können Sie das Ausführungsbit ausschalten und dann wird nur dann darauf zugegriffen, wenn dies ausdrücklich in einem Quellbefehl angegeben ist. Der Grund für so etwas ist, dass es Nebenwirkungen auf die Shell hat, von der aus es ausgeführt wird. Für ein konkretes Beispiel habe ich ein Skript namens fix_path, das den Pfad betrachtet und ändert.
quelle
Nur für den Fall, dass jemand Interesse an weiteren Studien und / oder Erläuterungen hat: In einer vor einiger Zeit implementierten, nahezu POSIX-konformen Shell sind die internen Abläufe der Funktionen 'exec_program ()' und 'builtin_source ()' sehr vorbildlich. In diesen Funktionen sehen Sie genau, was der Unterschied zwischen ihnen ist:
https://github.com/rsenn/shish/blob/master/src/builtin/builtin_source.c
https://github.com/rsenn/shish/blob/master/src/exec/exec_program.c
Im Grunde kann Sourcing als die Shell angesehen werden, die ihren internen Dateideskriptor vorübergehend umleitet, von wo aus sie das Shell-Skript analysiert (das Terminal im interaktiven Modus). es ist also sehr ähnlich zu anderen Umleitungen wie
<input_file.txt
und>>append_to_something.list
und diese müssen nur Dateien öffnen und schließen.Die Ausführung erfolgt also durch den
execve()
Systemaufruf, für den das Ausführungsbit obligatorisch ist.Ich erinnere mich, dass ich einige Systeme gesehen habe, die die Ausführung von ELF / a.out-Binärdateien erlauben, aber über die Ausführung von "/lib/ld-dynamic-linker.so" und mit dem Binärprogramm (ohne exec-Bit) als erstes Argument. Ich glaube, das war auf einigen DEC Alpha oder VAX Maschinen (Könnte es SCO Unix gewesen sein?)
quelle
Eine andere Sicht:
Quellenskript besteht im Wesentlichen aus Shell-Buildins und Programmaufrufen. Shell-Builtins (
source
darunter) sind Teile der Shell und die Shell muss an erster Stelle ausführbar sein. Für jedes aufgerufene Programm (also ELF, ein anderes Skript mit shebang, was auch immer) muss das Ausführungsbit gesetzt sein, sonst wird es nicht ausgeführt.Es ist also nicht gegen die Verwendung eines Ausführungsbits, da nichts ohne Ausführungsbit ausgeführt wird. Die Überprüfung wird nicht für das gesamte Quellenskript durchgeführt. es wird für jeden Teil separat durchgeführt, aber es ist.
quelle