Guten Abend, ich erhalte in Python über Bindings Zugriff auf fremde Datenbankinhalte (Texte). Als Abfrageergebnis erhalte ich iterierbare Objekte, die die gewünschten Inhalte über Methoden wie z.B. item.get_content() bereitstellen. Der Rückgabetyp dieser Methoden wird stets str sein, aber die Inhalte stammen von Dritten und somit aus potentiell nicht vertrauenswürdigen Quellen. Die ausgelesenen Strings wollte ich mit String-Methoden verarbeiten und mit Hilfe des shelve Moduls für eine spätere Verwendung speichern. Ich habe leider schon mehrfach gelesen, dass shelve in Verbindung mit fremden Daten unsicher sei. In der Python-Hilfe liest es sich jedoch eher so, als ob man lediglich keine fremden Datenbanken einlesen sollte. Irgendwo hatte ich aber auch mal gelesen, dass das Verarbeiten fremder Inhalte sogar mit einer selbst erzeugten shelve Datenbank riskant sei. Wie riskant ist das Verwenden des shelve Moduls denn nun wirklich bzw. sollte ich auf meiner Seite sicherheitstechnisch etwas beachten? Vielen Dank.
Das Problem ist ja, shelve speichert beliebige Objekte. Nachdem du diese Objekte wieder aus der Datenbank heraus holst, können sie alle möglichen Sauereien machen. Aber in deinem Fall baust du zwischen dem Lesen den fremden Quelle und dem Schreiben in deine eigene Datenbank eine Konvertierung ein, die sicher stellt - in deiner Datenbank landen nur harmlose Strings. Zumindest die Gefahren, die sich aus der Objektserialisierung ergeben, kannst du umgehen. Ich befürchte, 10000 andere Sicherheitslücken hast du sowieso, ganz egal ob du Python&Shelve oder irgend etwas anderes benutzt.
Michael D. schrieb: > In der Python-Hilfe liest es sich jedoch > eher so, als ob man lediglich keine fremden Datenbanken einlesen sollte. > Irgendwo hatte ich aber auch mal gelesen, dass das Verarbeiten fremder > Inhalte sogar mit einer selbst erzeugten shelve Datenbank riskant sei. Wenn du die Python Dokumentation zu shelve liest oder den Source Code wirst du sehen, dass shelve intern Pickle verwendet um die Daten zu Serialisieren. Okay dann sehen wir mal bei Pickle nach. "Warning The pickle module is not secure. Only unpickle data you trust. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling. Never unpickle data that could have come from an untrusted source, or that could have been tampered with....“ Okay, die Frage ist also kann ein Angreifer auf dein Programm einen oder mehrere Strings generieren, welche den unpickle Algorithmus, so aus dem Tritt bringen, dass er unsicheren Code ausführt und welche Mitigation kannst du wählen, um das Problem zu verringern. Ausserdem sollstet du dich fragen, lohnt es sich überhaupt das Programm anzugreifen, was kann ein Angreifer Worst Case erreichen, wenn er dein Programm übernimmt. Welche andern Angriffsvektoren hat dein Programm? Mögliche Mitigation des Angriffs auf Unpickle könnten sein, das Pickle Format zu verstehen und verboten Zeichen zu Filtern, vielleicht macht es auch Sinn deine Strings vor dem Speichern geeignet Umzukodieren um es den Angreifer zu erschweren die passenden Sequenzen in dein shelve zu Injekten.
Michael D. schrieb: > ich erhalte in Python über Bindings Zugriff auf fremde Datenbankinhalte > (Texte). > Die ausgelesenen Strings wollte ich mit String-Methoden verarbeiten und > mit Hilfe des shelve Moduls für eine spätere Verwendung speichern. > Ich habe leider schon mehrfach gelesen, dass shelve in Verbindung mit > fremden Daten unsicher sei. Das ist so und gilt nicht nur für das Modul shelve, sondern auch für die Module pickle und dill: da die alle mit eval() / exec() arbeiten, kann man sie nur dann benutzen, wenn die Datenquelle vertrauenswürdig ist. Als Alternative könnten die Daten entweder als JSON oder YAML gespeichert werden, womöglich komprimiert, und ansonsten gibt es das sichere und äußerst performante Modul quickle. Wenn Du also Einfluß darauf hast, wie die Daten gespeichert werden, dann empfehle ich quickle. Und wenn Du das Datenformat kennst und quickle-Klassen dafür anlegst, sind die serialisierten Daten nach meinen Erfahrungen obendrein kleiner als bei den oben genannten Modulen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.