Was sind die Sicherheitsprobleme und Rennbedingungen bei der Verwendung von "find -exec"?

14

Von der findManpage :

-exec command ;
    There are unavoidable security problems
    surrounding use of the -exec action; you should use the
    -execdir option instead.

-execdir command {} +
    Like -exec, but the specified command is run from the
    subdirectory containing the matched file, which is not
    normally the directory in which you started find.  This a much
    more secure method for invoking commands, as it avoids race
    conditions during resolution of the paths to the matched
    files.

Was bedeutet das? Warum gibt es Wettkampfbedingungen, wenn Sie es aus dem Startverzeichnis ausführen? Und wie sind diese Sicherheitsrisiken?

Danny Tuppeny
quelle
Verwandte Themen: Warum wird die Ausgabe von find in einer Schleife nicht ordnungsgemäß verarbeitet? wo das in einigen der Antworten behandelt wird.
Stéphane Chazelas

Antworten:

13

Fand die Details hier :

Die -execAktion bewirkt, dass ein anderes Programm ausgeführt wird. Es übergibt dem Programm den Namen der Datei, die gerade berücksichtigt wird. Das aufgerufene Programm führt dann normalerweise eine Aktion für diese Datei aus. Wieder einmal gibt es eine Racebedingung, die hier ausgenutzt werden kann. Als konkretes Beispiel nehmen wir den Befehl

 find /tmp -path /tmp/umsp/passwd -exec /bin/rm

In diesem einfachen Beispiel wird nur eine zu löschende Datei identifiziert und /bin/rmzum Löschen aufgerufen. Es besteht ein Problem, da zwischen dem Punkt, an dem find entscheidet, dass die -execAktion verarbeitet werden muss, und dem Punkt, an dem der /bin/rmBefehl tatsächlich den Systemaufruf unlink () ausgibt, um die Datei aus dem Dateisystem zu löschen, eine Zeitlücke besteht. Innerhalb dieses Zeitraums kann ein Angreifer das /tmp/umsp Verzeichnis umbenennen und durch einen symbolischen Link zu ersetzen /etc. Es gibt keine Möglichkeit /bin/rmfestzustellen, ob es sich um dieselbe Datei handelt, die der Finder im Sinn hatte. Sobald die symbolische Verknüpfung hergestellt ist, hat der Angreifer find überredet, das Löschen der /etc/passwdDatei zu veranlassen. Dies ist nicht der Effekt, der durch den tatsächlich aufgerufenen Befehl beabsichtigt ist.

Ich bin nicht sicher, wie wahrscheinlich es ist, dass jemand dies jemals ausnutzen kann. Aber ich denke, es gibt die Antwort!

Danny Tuppeny
quelle
Im obigen Fall, execdirwürde zuerst Chdir zu , /tmp/umspbevor der Befehl ausgeführt wird , und so theoretisch ein erneutes Verknüpfen des Angreifers würde das Verzeichnis keine Wirkung hat .. wenn die Neuverknüpfung nach Entdeckung geschähe „entscheidet“ zu bewerten , -execaber vor dem rmBefehl kann seine Arbeit tun. Aber ich frage mich, warum dies einen Unterschied machen würde: Der Angreifer könnte einfach den Relink durchführen, nachdem der Benutzer beschlossen hat, den findBefehl zu schreiben .
Otheus
1
@RuiFRibeiro Der Link ist nicht das Argument, das an den Befehl übergeben wird, sondern ein Zwischenverzeichnis. /tmp/umspist ein Verzeichnis, wenn es findangezeigt wird, aber wenn es ausgeführt wird rm, hat der Angegriffene es in eine symbolische Verknüpfung zu geändert /etc. /tmp/umsp/passwdist eine normale Datei, aber nicht dieselbe.
Gilles 'SO- hör auf böse zu sein'
2

Ich glaube, der Grund, warum dies -execgefährlich ist, liegt darin, dass der Benutzer möglicherweise das falsche Programm ausführt, wenn er nicht den vollständigen Namen und den Pfad des auszuführenden Programms angibt.

Beispiel:

find /some/path -exec coolprogram

In /some/pathhat jemand einen anderen gemacht coolprogram, und er lädt alle Ihre Daten zu einem schlechten Schauspieler hoch.

Aber warte, sagst du, musst du es nicht so ausführen ./coolprogram? Ja, aber einige Leute haben PATH=.:/bin:whatever, die das Programm im aktuellen Verzeichnis ausführen.

Dies ist wahrscheinlich vereinfacht, aber ich denke, dass es in einigen Fällen gefährlich sein könnte. Ich musste ein Problem beheben, bei dem ein Null-Byte cpioim falschen Verzeichnis landete. Ein Programm stürzte ab, weil cpioes nicht funktionierte, da die Null-Byte-Datei im Verzeichnis ausgeführt wurde.

Doug
quelle
3
Diese Risiken sind nicht isoliert find -exec. Wenn Sie .Ihren Weg eingeschlagen haben, ist die Ausführung coolprogramin Ihrem aktuellen Verzeichnis bereits gefährlich, unabhängig davon, ob Sie dies findtun oder nicht!
Danny Tuppeny
1
Einverstanden, aber es scheint, dass -execdir auf die Bedingung achtet, die ich auch erwähnt habe:The ‘-execdir’ action refuses to do anything if the current directory is included in the $PATH environment variable. This is necessary because ‘-execdir’ runs programs in the same directory in which it finds files – in general, such a directory might be writable by untrusted users. For similar reasons, ‘-execdir’ does not allow ‘{}’ to appear in the name of the command to be run.
Doug
Ich denke, die Moral der Geschichte ist das Haben. auf deinem weg ist auch eine schlechte idee, deswegen stelle ich sicher, dass sie nicht drin ist.
Doug
Interessant zu wissen, was das Verbieten von Pfaden .und Befehlen betrifft {}. Vielleicht verbietet Linux in Zukunft die .vollständige Pfadangabe und die Tools müssen keine eigenen Sicherheitsprüfungen durchführen! :)
Danny Tuppeny
1
Ich denke, 90% des Codes, den ich schreibe, besteht nur darin, die 5% der Dinge zu erfassen, die schief gehen. :)
Doug