Ich schreibe eine regulär kompilierte Anwendung, die eine spezielle Datei erstellen und ein magisches Cookie darin schreiben muss. Ich kann die Datei nicht direkt aus der Anwendung schreiben. Für das Systemsicherheitsmodell muss ich ein Hilfsprogramm mit erhöhten Berechtigungen starten, um den Trick auszuführen. Ich kann dem Hilfsprogramm beliebig viele Argumente liefern. Jetzt möchte ich einen sehr einfachen Systembefehl auswählen, der als Hilfsprogramm dient, und die Datei für mich erstellen. Etwas wie das:
/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"
Simple touch
schneidet es nicht, da ich das Cookie in die Datei schreiben muss. Ein einfaches echo
ohne Shell-Wrapper funktioniert nicht, da es eine Umleitung benötigt, um die Datei zu schreiben. Ich fühle mich nicht wohl, wenn ich die Shell mit Root-Rechten aufrufe, um eine so triviale Aufgabe zu erledigen. Gibt es einen wirklich einfachen, eingeschränkten Systembefehl, den ich aufrufen könnte, um die Datei für mich zu schreiben?
/bin/sh -c 'echo magic > /path/to/magic/file'
nicht funktioniert? Das wäre eine ausführbare Datei und zwei Argumente. Sie müssten das letzte Argument als Zeichenfolge erstellen (mit sprintf oder einem gleichwertigen Argument). Gibt es einen Grund, warum dies für Sie nicht funktionieren würde? Aus Ihrer Frage geht hervor, dass doCommandAsRoot () keine Eingaben zum Streamen in den Befehl benötigt, richtig? Andernfalls könnten Sie das letzte Argument durch ersetzen'cat > /path/to/magic/file'
und die Daten übergeben, anstatt eine Zeichenfolge zu erstellen.tee
. Vielen Dank!Antworten:
Wie wäre es damit:
Sicher gibt es Umleitungen, aber nur Tee läuft als Root, nicht als Shell. Funktioniert auch mit
dd of=...
.quelle
doCommandAsRoot
). Und diese Funktion akzeptiert nur einen Pfad zum Befehl und seinen Argumenten, sodass ich die Ausgabeumleitung nicht sofort verwenden kann. Ich könnte durch Shell gehen (wie in der Frage gezeigt), aber ich mag das sicherheitstechnisch nicht.doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file")
.dd
Beispiel kommt dem, was ich will, ziemlich nahe, danke. Könnten Sie sich etwas noch Einfacheres vorstellen?cp
odermv
anstelle vondd
.Ohne Ausgabeumleitung, ohne Pipe, aber mit "here string":
quelle
status=none
unterdrückt alle anderen Ausgaben moderner Versionen von GNU-Coreutilsdd
.Es gibt noch eine weitere Überlegung: Sie möchten den Wert des magischen Cookies nicht in eine Befehlszeile einfügen, da dies von anderen Benutzern beobachtet werden kann. Selbst wenn das Programm nur von kurzer Dauer ist (auch wenn das Programm die Befehlszeilenzeichenfolge auf Null setzt), besteht die Möglichkeit eines Angriffs. Also eine theoretische:
ist ein gefährlicher Ansatz. Daher unterstütze ich den Vorschlag von @ stribika: Schreiben Sie den Wert in eine temporäre Datei und kopieren Sie ihn an seinen Platz. Stellen Sie sicher, dass Sie eine sichere Funktion verwenden, um die temporäre Datei (
mkstemp()
) zu erstellen , damit auch dort keine Race-Bedingung vorliegt.quelle