In eine Datei ohne Umleitung schreiben?

12

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 touchschneidet es nicht, da ich das Cookie in die Datei schreiben muss. Ein einfaches echoohne 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?

Zoul
quelle
Gibt es einen Grund, warum /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.
Arcege
Das Shell-Beispiel funktioniert, aber ich würde es hassen, die Shell mit Root-Rechten aufzurufen, nur um eine einfache Datei zu erstellen. Die Bibliothek verwendet ein Kommunikationspipe-Argument ( AuthorizationExecuteWithPrivileges ), mit dem das Cookie mithilfe von geschrieben werden kann tee. Vielen Dank!
Zoul

Antworten:

11

Wie wäre es damit:

echo -n 'magic' | sudo tee /some/where/file > /dev/null

Sicher gibt es Umleitungen, aber nur Tee läuft als Root, nicht als Shell. Funktioniert auch mit dd of=....

Stribika
quelle
2
Entschuldigung, ich habe offensichtlich Probleme, mich in letzter Zeit zu erklären. Das Problem ist, dass ich, wenn ich etwas mit erhöhten Berechtigungen ausführen möchte, einen speziellen Bibliotheksaufruf durchlaufen muss (so etwas wie 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.
Zoul
@zoul: Ich dachte du schreibst ein Shell Skript. Ist es in Ordnung, das magische Cookie in eine Datei zu schreiben, auf die nichtprivilegierte Prozesse zugreifen können? Wenn ja, schreiben Sie es in eine solche Datei und rufen Sie auf doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file").
Stribika
Nein, es ist eine regulär kompilierte Anwendung (Frage aktualisiert). Ich suche nur nach "Shell" -Befehlen, die als Helfer dienen, damit ich sie nicht selbst schreiben muss. Ja, der Cookie ist nicht empfindlich. Das ddBeispiel kommt dem, was ich will, ziemlich nahe, danke. Könnten Sie sich etwas noch Einfacheres vorstellen?
Zoul
Sicher - Sie könnten verwenden cpoder mvanstelle von dd.
Mattdm
Ich meine einfacher als ohne die Notwendigkeit zu kopieren :)
Zoul
8

Ohne Ausgabeumleitung, ohne Pipe, aber mit "here string":

dd of=/some/where/file <<<'magic'
Rainer Perske
quelle
Ein Nachteil dieses Ansatzes ist, dass dd einige Statistiken an stdout schreibt. Sie können> / dev / null verwenden, um sie auszublenden, aber an diesem Punkt können Sie auch tee verwenden.
Studgeek
1
Dies funktionierte für mich in einer ungewöhnlichen Situation, in der ich keine Ausgangsumleitung oder Pipes verwenden konnte. status=noneunterdrückt alle anderen Ausgaben moderner Versionen von GNU-Coreutils dd.
Michael Hampton
5

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:

writestringtofile 'magic' /some/where/file

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.

mattdm
quelle
Vielen Dank, dies ist eine nützliche Diskussion. Glücklicherweise ist der „magische Keks“ kein Sicherheitsgerät, er kann von jedem deutlich gesehen werden.
Zoul