Gibt es Methoden, um zu überprüfen, was Sie tatsächlich aus einem Bash-Skript ausführen?
Sagen Sie Ihr Bash - Skript mehrere Befehle ruft (zum Beispiel: tar
, mail
, scp
, mysqldump
) , und Sie sind bereit , um sicherzustellen , dass tar
die tatsächliche ist, real tar
, was durch die bestimmbar root
Benutzer der Datei und übergeordnetes Verzeichnis Eigentümer und der einzige mit Schreibberechtigungen zu sein und nicht einige /tmp/surprise/tar
mit www-data
oder apache2
als Eigentümer.
Klar, ich weiß über PATH
und über die Umgebung Bescheid , ich bin gespannt, ob dies zusätzlich mit einem laufenden Bash-Skript überprüft werden kann und wenn ja, wie genau?
Beispiel: (Pseudocode)
tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...
bash
shell-script
shell
security
Miloš Đakonović
quelle
quelle
which
nicht korrekt angegeben wird, was getantar
wird, wie von xhienne beantwortet,ls
könnte gehackt werden, um falsche Informationen über die Datei (en) zurückzugeben, falls vorhanden. Auchgrep
könnte gehackt werden, um falsche Informationen zurückzugeben; Das könnte vermieden werden, indem stattdessen ein Shell-Matching verwendet wird. Dann könnte die Shell gehackt werden. Und Shell könnte gehackt werden, um vontype
Anfang an falsche Ergebnisse zu liefern - oder komplett ersetzt werden, da die Austauschbarkeit der Shell eine wichtige Innovation von Unix im Vergleich zu 50-jährigen Betriebssystemen darstellt. Siehe Ken Thompsons Turing-Adresse von 1984. Es ist Schildkröten den ganzen Weg nach unten.TE
) mit einer Datenbank mit Signaturen hat (dh umfangreicher als eine MD5-Prüfsumme). Wenn TE aktiv ist UND sich eine Datei in der Datenbank befindet, können Sie wählen ob das Programm ausgeführt wird - oder nur warnt, dass es nicht mit der Datenbank übereinstimmt. Außerdem gibt es zwei weitere Einstellungen:TEP
(Trusted Execution PATH) undTLP
(Trusted LIBrary PATH). Es dürfen nur Programme in TEP ausgeführt und Bibliotheken nur mit geladen werden Das Verzeichnis ist in TLP enthalten. In Linux I gibt es etwas namens "AppArmor", das Ihnen helfen könnte.Antworten:
Anstatt die auszuführenden Binärdateien zu validieren, können Sie auch die richtigen Binärdateien von Anfang an ausführen. Wenn Sie beispielsweise sicherstellen möchten, dass Sie nicht ausgeführt werden
/tmp/surprise/tar
, führen Sie einfach/usr/bin/tar
Ihr Skript aus. Stellen Sie alternativ$PATH
einen vernünftigen Wert ein, bevor Sie etwas ausführen.Wenn Sie Dateien
/usr/bin/
und anderen Systemverzeichnissen nicht vertrauen , gibt es keine Möglichkeit, das Vertrauen wiederzugewinnen. In Ihrem Beispiel überprüfen Sie den Eigentümer mitls
, aber woher wissen Sie, dass Sie vertrauen könnenls
? Das gleiche Argument gilt für andere Lösungen wiemd5sum
undstrace
.Wenn ein hohes Vertrauen in die Systemintegrität erforderlich ist, werden spezielle Lösungen wie IMA verwendet. Dies ist jedoch nichts, was Sie von einem Skript aus verwenden könnten: Das gesamte System muss auf eine spezielle Weise eingerichtet werden, wobei das Konzept der unveränderlichen Dateien vorhanden ist.
quelle
/bin
anstelle von einfügen/usr/bin
.$PATH
dann beide Pfade ein, wenn Unterstützung für mehrere Verteilungen benötigt wird.Wenn ein Angreifer Zugriff auf Ihr System hat und Ihr System ändern kann
$PATH
(was/tmp
unter keinen Umständen möglich sein sollte), ist es zu spät, um sich Gedanken über die Eigentümerschaft der ausführbaren Dateien zu machen.Stattdessen sollten Sie lesen, wie Sie mit einem Eindringen umgehen .
Konzentrieren Sie sich besser darauf, Einbrüche zu vermeiden.
Wenn Sie ein System haben, in dem solche Dinge wichtig sind, ist es möglicherweise eine gute Idee, die Teile davon, die öffentlich sein müssen, von den Teilen zu isolieren, die privat sein müssen, und eine Prüfung der Kommunikationsmodi durchzuführen zwischen diesen.
quelle
Es ist bis zu einem gewissen Grad möglich,
md5sum
eine Datei zu überprüfen . Auf Systemen mitapt
Paketverwaltung - in meinem speziellen Fall Ubuntu 16.04 - gibt es also die Datei/var/lib/dpkg/info/tar.md5sums
, in der die md5-Summen aller Dateien gespeichert sind, dietar
während der Installation erstellt wurden. Sie könnten also eine einfache if-Anweisung schreiben, die prüft, ob die Ausgabe vonmd5sum /bin/tar
mit der in dieser Datei übereinstimmt.Das setzt natürlich voraus, dass die Datei selbst nicht manipuliert wurde. Dies kann natürlich nur passieren, wenn der Angreifer root / sudo-Zugriff hat. Zu diesem Zeitpunkt sind alle Wetten deaktiviert.
quelle
/usr/bin/md5sum
?/bin/tar
oder zu ersetzen/usr/bin/tar
, ist es sehr wahrscheinlich, dass er auch einfachmd5sum
oder ersetzen kann/var/lib/dpkg/info/tar.md5sums
. Oder$SHELL
.tar
andere Binärdatei verwiesen wird, funktioniert dies. Wenn ein System auf der Root-Ebene kompromittiert ist, haben Sie eine Option: - Nuke es aus der UmlaufbahnJa, es gibt eine Methode: die eingebaute
type
. Im Gegensatz zu demwhich
Befehl, der nur in Ihrem PFAD sucht,type
wird Ihnen mitgeteilt, ob der Befehlsname tatsächlich ein reserviertes Schlüsselwort, eine eingebaute Datei, ein Alias, eine Funktion oder eine Festplattendatei ist.Außerdem erhalten
type -a
Sie alle Kandidaten für Ihr Kommando (von der ersten bis zur letzten Wahl):Wenn Sie sich nur Gedanken über die Binärdateien auf Ihrer Festplatte machen, können Sie
type -Pa
alle Binärdateien in Ihrem PATH abrufen (in derselben Reihenfolge wie oben):Das heißt,
type
alleine sagt Ihnen nicht genau, welcher Befehl am Ende aufgerufen wird. Wenn Sietar
beispielsweise einen Aliasnamen haben, der eine Binärdatei aufruft (z. B.alias tar="/tmp/tar"
),type
werden Sie darauf hingewiesen, dass es sich um einen handeltalias
.quelle
type -a
type
Ich werde es Ihnen sagen, soweit Bash weiß, aber wenn wir von einem böswilligen Angreifer kontrolliert werden, gibt es keinen Grund zu der Annahme, dass das, was Bash glaubt, dass es weiß, die tatsächliche Wahrheit widerspiegelt. Nach allem, was Sie wissen, gibt es einLD_PRELOAD
Modul, das jeden einzelnen C-Bibliotheksaufruf abfängt, den Sie ausführen.which
.enable
. Ich habe die Ratschläge aus diesen Antworten verwendet, umtype enable
herauszufinden, ob es sich um eine integrierte Shell handelt, und umhelp enable
zu sehen, was sie bewirkt.Mit können Sie überprüfen, welche Befehle von einem Skript genau ausgeführt werden
strace
. Beispielsweise:Mit folgendem Skript:
strace
zeigt den genauen Pfad zu den Befehlen an, die bei Verwendung mit-e execve
parameter ausgeführt werden:Parameter (von strace man):
-f
: Verfolgen Sie untergeordnete Prozesse, wie sie von aktuell verfolgten Prozessen aufgrund der Systemaufrufe fork (2), vfork (2) und clone (2) erstellt werden. Beachten Sie, dass-p PID -f
alle Threads der Prozess-PID angehängt werden, wenn es sich um Multithread-Threads handelt, und nicht nur Thread mit thread_id = PID.-e trace=file
: Verfolgt alle Systemaufrufe, die einen Dateinamen als Argument verwenden. Sie können sich dies als eine Abkürzung vorstellen, für-e trace=open,stat,chmod,unlink,...
die nützlich ist, um festzustellen, auf welche Dateien der Prozess verweist. Durch die Verwendung der Abkürzung wird außerdem sichergestellt, dass Sie nicht versehentlich vergessen, einen Anruf wie lstat in die Liste aufzunehmen.quelle
strace
das Skript selbst nicht untergraben wurde.Linux OS basiert auf Dateien und viele Befehle, die unter Linux ausgeführt werden, werden wahrscheinlich einige Änderungen an Dateien auf Ihrem Computer bewirken. Aus diesem Grund ist es vielleicht die beste Lösung für Ihr Problem. Sie können Ihre Befehle auf Änderungen am Dateisystem testen, bevor es ausgeführt wird.
Es gibt einen 'strace'-Befehl, der Ihren Befehl in Teile zerlegt ...
Wenn Sie wirklich tief gehen möchten, möchten Sie Dekompilierer für die Skripte auschecken, die ausgeführt werden sollen. Mit anderen Worten, Sie müssen die Assembler-Interpretation dieses Befehls überprüfen. Für Bash dort
objdump -d
. Linux bin-Skripte werden hauptsächlich mitC
Programmiersprache erstellt, verwenden Sie also einen gutenC
Dekompiler.quelle