Aus dem findutils-Handbuch:
Zum Beispiel Konstrukte wie diese beiden Befehle
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;
sind sehr gefährlich. Der Grund dafür ist, dass das '{}' zu einem Dateinamen erweitert wird, der ein Semikolon oder andere Sonderzeichen für die Shell enthalten kann. Wenn zum Beispiel jemand die Datei erstellt, können
/tmp/foo; rm -rf $HOME
die beiden obigen Befehle das Ausgangsverzeichnis eines anderen Benutzers löschen.Führen Sie aus diesem Grund keinen Befehl aus, der nicht vertrauenswürdige Daten (z. B. Dateinamen) an Befehle weitergibt, die Argumente als weiter zu interpretierende Befehle interpretieren (z. B. 'sh').
Im Fall der Shell gibt es eine clevere Lösung für dieses Problem:
# safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \;
Es ist nicht garantiert, dass dieser Ansatz jedes Problem vermeidet, aber er ist viel sicherer, als Daten nach Wahl eines Angreifers in den Text eines Shell-Befehls zu ersetzen.
- Liegt die Ursache des Problems darin,
find -exec sh -c "something {}" \;
dass der Ersatz für{}
nicht in Anführungszeichen gesetzt und daher nicht als einzelne Zeichenfolge behandelt wird? In der Lösung
find -exec sh -c 'something "$@"' sh {} \;
,zuerst
{}
wird ersetzt, aber da{}
nicht zitiert, hat auch nicht"$@"
das gleiche Problem wie der ursprüngliche Befehl? Zum Beispiel"$@"
wird erweitert werden"/tmp/foo;"
,"rm"
,"-rf"
und"$HOME"
?Warum wird
{}
nicht geflüchtet oder zitiert?
- Könnten Sie andere Beispiele nennen (immer noch mit
sh -c
oder ohne, falls zutreffend; mit oder ohne,find
was möglicherweise nicht erforderlich ist), bei denen die gleiche Art von Problem und Lösung zutrifft und die minimale Beispiele sind, damit wir uns auf das Problem und die Lösung mit konzentrieren können? wenig ablenkung wie möglich? Siehe Möglichkeiten, Argumente für einen Befehl bereitzustellen, der von `bash -c` ausgeführt wird
Vielen Dank.