2 Stimmen

Ist das Kommandozeilenprogramm mktemp unter Linux weniger sicher als die C-Funktion mkstemp?

Beide Operationen erzeugen eine leere Datei und geben den Dateinamen zurück, aber mkstemp lässt die Datei im exklusiven Modus geöffnet und gibt Ihnen das Handle. Gibt es einen Sicherheitsvorteil für die C-Funktion? Bedeutet dies, dass die Befehlszeilenversion eine Sicherheitslücke aufweist?

Nebenbei bemerkt ist es interessant, dass es mehrere verwandte Funktionen in der C-Api unter Linux gibt und die meisten von ihnen in ihrer Manpage den Hinweis "Don't use this function" (oder ähnlich) enthalten.

0 Stimmen

Relevant?: "Auf der Dateisystemebene bieten POSIX-konforme Systeme Systemaufrufe wie open(2) und flock(2), die es Anwendungen ermöglichen, eine Datei atomar zu öffnen oder zu sperren. Auf der Prozessebene bieten POSIX-Threads angemessene Synchronisierungsprimitive." -- Wikipedia:Atomarität (Datenbanksysteme)

8voto

Paul Tomblin Punkte 172816

Ein Trick mit temporären Dateien in Unix-ähnlichen Betriebssystemen (einschließlich Linux und Mac OS) besteht darin, die Datei zu löschen, sobald Sie sie öffnen. Sie können immer noch auf die Datei zugreifen, aber niemand sonst kann sie sehen oder etwas mit ihr machen, und sie verschwindet, sobald Sie die Datei schließen, selbst wenn Ihr Programm einen schrecklichen Tod stirbt.

0 Stimmen

Mit anderen Worten: Die Datei verliert nach dem Aufheben der Verknüpfung zwar ihren Namen, nicht aber ihre Daten, bis Sie sie schließen.

0 Stimmen

Das ist ein toller Tipp! Ich habe mir tmpfile(3) angesehen, das das tut, was Sie hier beschreiben, aber ich habe nicht verstanden, wie es funktioniert, bis ich Ihren Beitrag gelesen habe.

0 Stimmen

Tolle idee! ich vermute, dass ein weiterer anwendungsfall die PID-Dateien sind? ich sehe oft veraltete PID-Dateien, nachdem Programme abgestürzt sind. würde die von Ihnen beschriebene technik nicht auch dieses Problem lösen?

3voto

Quassnoi Punkte 396418

Wie Sie leicht erkennen können mktemp(1) Quellcode, macht er im Grunde nichts anderes als den Aufruf mkstemp(3) .

Der exklusive Modus in Linux bedeutet, dass die Funktion fehlschlägt, wenn die Datei bereits existiert, er garantiert keine Sperrung. Andere Prozesse können diese Datei löschen, neu erstellen und mit Daten füllen, obwohl der Datei-Handle open(3) durch Ihr Verfahren.

Es gibt keine zusätzliche Sicherheit in der C-Funktion im Vergleich zum Kommandozeilenprogramm.

0 Stimmen

Mktemp(1) ruft mkstemp(3) auf, schließt aber auch das resultierende Dateihandle. Aber, wie Sie anmerken, hat es offensichtlich keinen Wert, das offene Handle zu halten. Es hat den Anschein, dass keiner der beiden Ansätze besonders sicher vor bösartigen Angriffen ist.

0voto

innaM Punkte 46916

Der offensichtlichste Unterschied zwischen einem Systemaufruf und einer Befehlszeilenfunktion ist, dass Befehlszeilenfunktionen von Menschen oder ihren Shell-Skripten verwendet werden, während Systemaufrufe immer von Programmen ausgeführt werden.

Es wäre ziemlich schwierig, einer Person einen Aktenordner in die Hand zu drücken.

Was die "Sicherheit" betrifft, sollten Sie an Race Conditions denken: Mehrere Instanzen eines Programms rufen mkstemp gleichzeitig auf, aber jede hat garantiert eine eigene temporäre Datei. Wenn das Programm die Kommandozeilenversion aufruft, wäre es fast unmöglich, dies zu garantieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X