staging.inyokaproject.org

Berechtigung für Verzeichnisse ermitteln (C/C++)

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 18.04 (Bionic Beaver)
Antworten |

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Ich habe da eine Klasse, die einen Verzeichnisbaum anzeigt (siehe Anhang). Da sollen dann Verzeicnisse, in die ich nicht rein darf, ausgegraut werden. Bisher habe ich dafür die Funktion access() bemüht, etwa so:

1
2
3
4
5
6
7
8
    Fl_Tree_Item *  ti;
    Fl_Tree_Item *  tt;
    ...
        tt = tree->add( ti, (*list)->d_name );
        if( access( (*list)->d_name, X_OK ) ) {
            tt->deactivate();
        }
    ...

Dazu habe ich jetzt aber 2 Fragen.

Ich frage mich, ob es nicht besser wäre, anstelle von access() euidaccess() zu verwenden, wo dann die effektive User-ID verwendet wird. Wobei ich zugeben muss, dass mir nicht ganz klar ist, wann das zum tragen kommt.

Zweitens wird in der Doku zu beiden Funktionen vor einer möglichen race condition gwarnt, weil zwichen Abfrage und möglichen Zugriff noch einiges passieren kann. Da ich aber noch gar nicht wirklich zugreifen will und die Abfrage auch nur auf Verzeichnisse anwende, kann ich da erstmal kein ernsthaftes Problem erkennen.

Oder übersehe ich da wieder etwas?

Anhang

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Dakuan schrieb:

Ich frage mich, ob es nicht besser wäre, anstelle von access() euidaccess() zu verwenden, wo dann die effektive User-ID verwendet wird. Wobei ich zugeben muss, dass mir nicht ganz klar ist, wann das zum tragen kommt.

Bei open() wird die effektive UID genutzt, wie die Manpage sagt.

Zweitens wird in der Doku zu beiden Funktionen vor einer möglichen race condition gwarnt, weil zwichen Abfrage und möglichen Zugriff noch einiges passieren kann. Da ich aber noch gar nicht wirklich zugreifen will und die Abfrage auch nur auf Verzeichnisse anwende, kann ich da erstmal kein ernsthaftes Problem erkennen.

Vermutlich ist das lediglich der allgemeine Hinweis, dass etwas zwischen dem Prüfen und dem tatsächlichen Zugriff passieren kann. Mit anderen Worte: dass die Prüfung der Berechtigungen ergibt, der Zugriff ist erlaubt, ist keine Garantie dafür, dass es dann später auch mit dem Zugriff klappt. Ganz allgemein ist in vielen Szenarien eine vorgeschaltete Prüfung, ob etwas klappen wird, Verschwendung von Rechenzeit, weil es keine verlässliche Aussage darüber macht, ob es dann tatsächlich klappt. I.d.R. ist es besser, die Operation einfach auszuführen und dann ggf. mit dem Fehler umzugehen. Dein Szenario ist natürlich anders.

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Danke, dann werde ich mir wegen der möglichen Sicherheitslücke keine weiteren Gedanken machen.

Eine Alternative wäre ja, die Verzeichnisse tatsächlich zu öffnen und dann gleich wieder zu schließen. Das würde aber an der zeitlichen Verzögerung zwischen der Abfrage und dem tatsächlichen Zugriff nichts ändern. Außerdem wird auf die meisten Verzeichnisse während eines Programmlaufs ja gar nicht zugegriffen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Dakuan schrieb:

Danke, dann werde ich mir wegen der möglichen Sicherheitslücke keine weiteren Gedanken machen.

Eine Race Condition ist nicht notwendigerweise eine Sicherheitslücke. Der Begriff sagt nur, dass es durch unterschiedliches Timing zu unerwünschtem oder ungeplantem Verhalten kommen kann.

Eine Alternative wäre ja, die Verzeichnisse tatsächlich zu öffnen und dann gleich wieder zu schließen. Das würde aber an der zeitlichen Verzögerung zwischen der Abfrage und dem tatsächlichen Zugriff nichts ändern.

... und womöglich mehr IO erzeugen.

Außerdem wird auf die meisten Verzeichnisse während eines Programmlaufs ja gar nicht zugegriffen.

Genau. Du machst es schon genau richtig.

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Eine Race Condition ist nicht notwendigerweise eine Sicherheitslücke.

Ich habe den Begriff jetzt einfach aus dem Buch The Linux Programming Interface übernommen. Der Autor beschreibt da für access() ein entsprechendes Zenario im Zusammenhang mit Symlinks und setuid Programmen, was ich allerdings nicht vollständig verstanden habe.

... und womöglich mehr IO erzeugen.

Das hatte ich auch im Hinterkopf. Andererseits könnte ich dabei auch feststellen, ob es da weitere Unterverzeichnisse gibt und dann die entsprechenden Dreieck Icons einfügen die ja in einigen Zweigen noch fehlen (siehe Screenshot oben).

Du machst es schon genau richtig.

Naja, einige Vereinfachungen habe ich mir schon erlaubt. Wenn ich mir die Dateinamen geben lasse, werden die Berechtigungen nicht abgefragt (Dateimanager scheinen das zu machen). Da warte ich dann tatsächlich auf Fehlermeldungen.

Zum Ausgleich habe ich mir aber eine echte Luxusfunktion eingebaut. Ich vergleiche die mtime aus den Thumbnails mit der mtime der aktuellen Datei und ignoriere Thumbnails wo das nicht übereinstimmt. Dieses Feature habe ich bisher noch bei keinem Dateimanager oder Bildbetrachter gesehen (aber ich kenne nicht alle).

p.s. Das oben genannte Buch kann man in Deutschland bei jedem lokalen Buchhändler bestellen und ist dann am nächsten Morgen da. Da muss man nicht Amazon bemühen. Ist allerdings "schwere Kost" - ca. 2,2 kg.

Antworten |