- Ich möchte Daten an eine Datei in/tmp anhängen.
- Wenn die Datei nicht existiert, möchte ich sie erstellen
- Es ist mir egal, ob jemand anderes die Datei besitzt. Die Daten sind nicht geheim.
- Ich möchte nicht, dass jemand in der Lage ist, dies in eine andere Datei oder in eine andere Datei zu schreiben.
Was ist der beste Weg, dies zu tun?Wie sollte ich vor harten Linkangriffen schützen?
Hier ist mein Gedanke:
fd = open("/tmp/some-benchmark-data.txt", O_APPEND | O_CREAT | O_NOFOLLOW | O_WRONLY, 0644);
fstat(fd, &st);
if (st.st_nlink != 1) {
HARD LINK ATTACK!
}
Problem mit dieser: Jemand die Datei zu einem gewissen kurzlebig Datei von mir verknüpfen kann, so dass /tmp/some-benchmark-data.txt das gleiche wie/tmp/tmpfileXXXXXX welches ein anderes Skript von mir benutzt (und korrekt mit O_EXCL und all dem geöffnet wurde). Meine Benchmarkdaten werden dann an diese/tmp/tmpfileXXXXXX-Datei angehängt, solange sie noch verwendet wird.
Wenn mein anderes Skript zufällig seine TTF-Datei geöffnet hat, dann lösche es, dann benutze es; dann würde der Inhalt dieser Datei durch meine Benchmark-Daten beschädigt werden. Dieses andere Skript müsste dann seine Datei zwischen dem open() und dem fstat() des obigen Codes löschen.
Also mit anderen Worten:
This script Dr.Evil My other script or program
open(fn2, O_EXCL | O_CREAT | O_RDWR)
link(fn1,fn2)
open(fn1, ...)
unlink(fn2)
fstat(..)=>link is 1
write(...)
close(...)
write(...)
seek(0, ...)
read(...) => (maybe) WRONG DATA!
Und deshalb die oben genannte Lösung funktioniert nicht. Es gibt möglicherweise andere Angriffe.
Was ist der richtige Weg? Außerdem kein weltweit schreibbares Verzeichnis.
bearbeiten: Um gegen das Ergebnis zu schützen, dass die bösen Benutzer die Datei mit seinem/ihrem Besitz und Berechtigungen, oder einfach nur falsch Berechtigungen (durch harte erstellt Ihrer Datei verknüpfen und dann das Original zu entfernen, oder Hardlinks eines kurzlebige Datei von dir) Ich kann die Besitz- und Berechtigungsbits nach dem nlink check überprüfen.
Es würde kein Sicherheitsproblem geben, aber auch Überraschungen verhindern. Im schlimmsten Fall bekomme ich einige meiner eigenen Daten (aus einer anderen Datei) am Anfang der Datei, die aus einer anderen Datei kopiert wurden.
Edit 2: Ich denke, dass es fast unmöglich ist, den Namen einer Datei zu schützen, gegen jemanden hart Vernetzung, das heißt geöffnet, gelöscht und dann verwendet. Beispiele hierfür sind EXE-Packer, die manchmal sogar die gelöschte Datei über/proc/pid/fd-num ausführen. Wenn Sie damit fortfahren, würde die Ausführung des gepackten Programms fehlschlagen. lsof könnte wahrscheinlich herausfinden, ob jemand anders den Inode geöffnet hat, aber es scheint mehr Ärger zu geben, als es wert ist.
Es ist nur ein Angriff, bevor die Datei erstellt wird. Wenn ich ein Standardbenutzer bin, kann ich einen Link zu jeder Datei erstellen (auch wenn ich nicht in diese Datei schreiben kann) in jedes Verzeichnis, in das ich schreiben kann. Das heißt, ich kann eine Datei mit dem Namen '/ tmp/foo' erstellen fester Link von '/ etc/passwd'. Wenn nun sein Programm nach '/ tmp/foo 'schreibt, schreibt es wirklich nach'/etc/passwd'. Er möchte dies vermeiden, indem er sicherstellt, dass er der erste Link zu dem von ihm geschaffenen Inode ist. – Gabe
@gabe: richtig. Deshalb würde ich st_nlink überprüfen. Sie können eine neue Verknüpfung zu Dateien anderer Personen erstellen, diese jedoch nicht entfernen (die Linkanzahl verringern). – Thomas
Guter Punkt, Thomas. Wenn mein Kommentar komisch aussieht, habe ich auf einen anderen Kommentar geantwortet, der seitdem gelöscht wurde. – Gabe