Moin,
* Dennis Stosberg
Am 25.06.2002 um 14:13 schrieb Heinz W. Pahlke:
Und fuer xpdf haben mich eben eine Reihe von Warnungen "the use of `tmpnam' is dangerous, better use `mkstemp'" ueberrascht. Einfach in den entsprechenden Dateien tmpnam durch mkstemp ersetzen, geht natuerlich nicht (habe es trotzdem sicherheitshalber mal ausprobiert). Gibt es da trotzdem eine einfache Loesung oder sind hier doch etwas tiefergehende Programmierkenntnisse erforderlich? Seltsam. In mkstemp(3) steht wiederum:
Don't use this function, use tmpfile(3) instead. It is better defined and more portable.
tmpnam(3) gibt einen eindeutigen Namen für eine temporäre Datei zurück. Ich kann mir vorstellen, dass das ein Sicherheitsrisiko ist, wenn jemand den generierten Namen der Datei kennt, und diese öffnet bzw. austauscht, bevor mein eigenes Programm dies tut. /tmp ist ja schließlich für alle beschreibbar. Öffnen kann er sie nicht, bzw. nur, wenn der Programmierer einen weiteren Fehler macht. Es kann aber eine Race Condition geben, dh. der Angreifer kann nach der Erstellung des Dateinamens eine Datei anlegen, die diesen Namen trägt. (Allerdings auch nur, wenn der Programmierer einen weiteren, schwerer zu erkennenden Fehler macht.)
mkstemp(3) gibt dagegen direkt einen Datei-Deskriptor zurück. Die Datei ist dann schon geöffnet und kann nicht mehr einfach ausgetauscht werden. Intern wird wahrscheinlich irgendwie sichergestellt, dass Erzeugen und Öffnen der Datei (vielleicht auch sofort ein anschließendes Löschen) möglichst direkt hintereinander ausgeführt werden. Das passiert atomar, dh. die Datei wird exklusiv geöffnet.
Das Problem von mkstemp(3) ist in der Manpage beschrieben: Die Datei wird in glibc 2.0.6 und früher mit Mode 0666 angelegt. Da man sich nicht sicher sein kann, welche glibc der Anwender benutzt, kann man mit tmpnam(3) eine bessere Lösing stricken. (In meiner Manpage von tmpfile(3) steht nichts über den Mode.) Thorsten -- Scully: Do you have a theory? Mulder: I have plenty of theories.