Forum: PC-Programmierung Python, Shelve und Sicherheit


von Michael D. (michada)


Lesenswert?

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.

von Ein Kommentar (Gast)


Lesenswert?

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.

von Imonbln (Gast)


Lesenswert?

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.

von Nur_ein_Typ (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.