C
volkard schrieb:
Fabulus schrieb:
/* Test if root user is logged (security check */
if((getuid() == 0) || (geteuid() == 0)) {
fprintf(stderr, "Running this FS as root opens unacceptable security holes!");
return 1;
}
Für diesen Mist möchte ich so manchen Coder an den Eiern aufhängen. root hat alles zu dürfen.
Das Problem bei fuse ist etwas subtiler. Es steht nämlich vor einem Zielkonflikt:
1. Root hat alles zu dürfen.
2. Ein User darf den root-User nicht in seinen Aktionen blockieren können (oder allgemeiner, Dienste oder andere User des lokalen Systems blockieren).
Angenommen, ein normaler User mountet mit FUSE ein Dateisystem. Der Code hinter dem Dateisystem ist vom User vorgegeben, das geht mit fuse ja. Jetzt macht root ein
$ cat /home/foo/fuse_mount_point_of_the_user/some_file
cat weiß natürlich nicht, dass das ein fuse-Dateisystem ist. Es ruft einfach fopen() auf auf den angegebenen Pfad. fopen() geht erstmal in den Kernel. Der Kernel merkt dann, dass das ein fuse-Dateisystem ist und geht wieder in den user-mode zurück, diesmal im Kontext des users "foo". Der fuse-Code ist aber so programmiert, dass er bei einem open(), das von root kommt, hängt statt irgendwas zurückzugeben.
Das Ergebnis ist, dass der cat-Prozess, den root gestartet hat, im syscall open() festhängt und nicht mehr so einfach gekillt werden kann. Dasselbe passiert dann natürlich auch bei Backups, die per cronjob laufen. Sobald die aus Versehen ins fuse-Dateisystem gehen, hängt der Backup-Task bis in alle Ewigkeit, bzw. bis der fuse-Prozess des Users gekillt wird.
Es gibt bestimmt noch andere Angriffsszenarien, die noch größeren Schaden anrichten können, wenn man root erlaubt auf fuse-Dateisysteme zuzugreifen, die von einem User kontrolliert werden. Deswegen sind fuse-mounts soweit ich weiß pauschal für den root-User völlig unzugänglich. Einen fuse-mount, der für den root-User offen ist, kann nur root selber anlegen.
Unangenehm für den root-User ist es manchmal trotzdem, da stimme ich dir zu.
Hier ist der Fall etwas anders gelegen, merk ich grad. Da geht es wohl darum, dass root selber dieses fuse-Dateisystem nicht mounten darf. Das kann sinnvoll sein, je nachdem was das fuse-Dateisystem macht. Schöner wär aber ein Verhalten wie bei sshfs (was auch fuse ist): Wenn man als root ein sshfs mountet, dann ist der mountpoint nur für root zugänglich, was es erstmal relativ sicher macht. Wenn man auch anderen Usern Zugang gewähren möchte, kann man sshfs eine entsprechende command line option übergeben.