QuoteIch habe das Heft auch nicht zur Hand, aber so, wie du es beschreibst, bestand die Lücke offensichtlich zwischen dem Test auf Symlink und dem open(). Das hat absolut nix mit flock() zu tun. Und nein, sysopen() kann nicht gleichzeitig flock()en!
Ja das stimmt,
da habe ich mit sysopen wohl etwas falsch verstanden. Es kann doch nicht flock()en.
QuoteAber sysopen() kennt die Optionen O_EXCL und O_CREAT, die zusammen verhindern, dass eine Datei überschrieben wird, wenn sie ein Symlink ist (siehe perldoc -f sysopen). Dieser Kombination wurde wohl in dem Beispiel zur Absicherung vor Symlink-Attacken benutzt.
Nein, dass stimmt nicht.
Wenn du O_EXCL zusammen mit O_CREAT benutzt, dann wird eine Datei nur dann erzeugt, wenn sie noch nicht existiert. Und das bezieht sich auch auf Hard Links, nicht nur auf Symlinks. Ich habe das selber ausprobiert, und es kam bei einen Hardlink eine Fehlermeldung.
Anhand dessen würde ich schon sagen das ein sysopen sicherer ist als ein reines open. Den mit open ist man nicht in der Lage so fein zu sagen, was man wirklich möchte. Ein (open, ">") legt eine neue Datei ein, wenn Sie existiert wird sie überschreiben. Sowas kann man mit sysopen regeln, dass das letzte eben nicht passiert. (Allerdings klappt sowas laut beschreibung nicht mit Netzlaufwerken wie z.B. NFS). Allerdings stimmt es das die Race Condition nur dann existiert wenn man ein Dateitest gefolgt von einem open macht. Mit flock() hat das doch nichts zu tun.
QuoteDas hilft aber auch nur gegen Symlink-Attacken. Was ist wohl, wenn ich einen Hardlink auf die anzugreifende Datei anlege? Das kann sysopen() nicht erkennen, und meine /boot/vmlinuz ist trodem weg.
use Fcntl;
sysopen FILE, "copy.txt", O_WRONLY|O_CREAT|O_EXCL or die "Datei existiert bereits: $!
";
close FILE;
Die Datei copy.txt war ein Hardlink auf eine andere Datei, es wurde bei mir erfolgreich "Datei existiert bereits: File exists" ausgegeben.
QuoteDeswegen aber hier hartnäckig zu behaupten "open ist unsicher, sysopen ist sicherer", halte ich für Humbug.
Das es sicherer ist würde ich immer noch behaupten. Allerdings stimmt es das es nichts mehr mit der Verwendung von flock() zu tun hat.
Allerdings beschränkt sich der Sicherheitsvorteil nur darin, wenn man z.B. folgendes haben möchte:
- Datei zum Schreiben öffnen, neue Datei erzeugen, Datei darf noch nicht existieren
- Datei öffen zum Anhängen, Datei muss existieren
- Datei öffnen für Aktualisierungen, Datei darf noch nicht existieren
- Datei öffnen für Aktualisierungen, Datei ggf. erzeugen
Mit "Aktualisierung" ist gemeint gleichzeitiges Lesen/Schreiben.
Wenn man sowas nicht benötigt, hat sysopen sicherlich auch keine Sicherheitsvorteile.\n\n
<!--EDIT|sid burn|1145803598-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de