Seite 1 von 1
exec funktion - sehr große Sicherheitslücke?
Verfasst: Montag 19. April 2010, 22:51
von xpilz
Hallo, ich habe mal wieder eine Frage.
Und zwar, ist es ein großes Sicherheitsloch wenn man folgendes schreibt:
(Python > 3)
Oder besser so:
Code: Alles auswählen
namesp = {"var1" : 0123, "var2" : 4567}
userin = input()
exec userin in namesp
Vielen Dank im vorraus.
Verfasst: Montag 19. April 2010, 23:07
von Darii
http://www.python-forum.de/post-167485.html#167485 gilt so auch prinzipiell zu exec.
Der eingeschränkte Namensraum bringt für die Sicherheits erstmal gar nichts. Da du beim von exec ausgeführten Code auch Statements verwenden kannst, reicht ein simples import aus um dir alles herzuholen was du brauchst.
Verfasst: Dienstag 20. April 2010, 14:48
von Dav1d
So:
Code: Alles auswählen
namesp = {"var1" : 0123, "var2" : 4567}
userin = input()
namesp[userin] # evt. Fehlerbehandlung
Verfasst: Dienstag 20. April 2010, 22:06
von sma
erlaubt das Ausführen beliebiger (!) Python-Ausdrücke mit den Rechten des Python-Interpreters. Das ist eine große Sicherheitsücke! Die größte denkbare.
Man kann ja mal folgende Eingabe probieren:
Oder besser nicht...
Retten kann man's bestenfalls dadurch, dass man vorher die Eingabe mit dem "ast"-Modul parst und den AST genau untersucht und nur eine kontrollierte Teilmenge erlaubt. Insbesondere darf man nicht das Ausführen beliebiger Funktionen erlauben.
Stefan
Verfasst: Mittwoch 21. April 2010, 07:48
von jens
Verfasst: Mittwoch 21. April 2010, 13:15
von xpilz
Das ist eine große Sicherheitsücke! Die größte denkbare.
Dann muss ich immer daran denken falls ich zu so etwas komme, wie z.b.: eval() oder exec mich auf dieses Python Skript zu beziehen:
Wenn ich dann mal an diesen Stand herankomme, werde ich mit Sicherheit auch verstehen, was er tut usw.. Aber ich glaube er macht schon so etwas in der Richtung was sma gesagt hatte oO:
Retten kann man's bestenfalls dadurch, dass man vorher die Eingabe mit dem "ast"-Modul parst und den AST genau untersucht und nur eine kontrollierte Teilmenge erlaubt. Insbesondere darf man nicht das Ausführen beliebiger Funktionen erlauben.
Tut mir leid wenn ich mich irre ^^.
Verfasst: Mittwoch 21. April 2010, 13:28
von jens
So schwer ist das nicht, speicher die Datei mal ab und leg daneben das skript:
Code: Alles auswählen
from data_eval import data_eval
daten = """{1:2, "a":"b", u"c":"c", "d":-1, "e":-2.02}"""
result = data_eval(daten)
print result
(ungetestet

)
Verfasst: Mittwoch 21. April 2010, 14:22
von ms4py
Verfasst: Donnerstag 22. April 2010, 14:11
von xpilz
Danke. Ich werde mich erst durch das von ms4py gepostete durchlesen und danach jens ungetesteten Code ausprobieren.
Edit: @jens: So ganz verstehe ich deine Antwort nicht

. Bei mir sagt er data_eval gibt es nicht oder meinst du das Skript mit dem exec abspeichern und importieren?
Verfasst: Donnerstag 22. April 2010, 15:25
von ms4py
xpilz hat geschrieben:Edit: @jens: So ganz verstehe ich deine Antwort nicht

. Bei mir sagt er data_eval gibt es nicht oder meinst du das Skript mit dem exec abspeichern und importieren?
Na klar musst du sein Modul abspeichern und importieren

Verfasst: Donnerstag 22. April 2010, 16:13
von xpilz
Na klar musst du sein Modul abspeichern und importieren :Wink:
Okay, das ist ein Modul. Die Datei abspeichern, bis dahin versteh ich das ja noch, was soll ich dann damit machen? Soll ich versuchen die daten{...} mittels eval() auszulesen, oder wie? Nur Nebenbei: Ihr müsst bitte beachten mein Python "Wortschatz" reicht bislang nur bis exec. Das wäre Punkt 13.6 in meinem
Tutorial das ich grade lese.. Und auch sonst habe ich nur 3-4 mal etwas in Python geschrieben. Sollte ich mich mehr damit befassen?
Verfasst: Donnerstag 22. April 2010, 16:14
von jens
Genau. Mein Skript von
http://github.com/jedie/django-dbprefer ... ta_eval.py sollte als
data_eval.py "neben" dem test skript liegen, welches dann den import
from data_eval import data_eval macht

Verfasst: Donnerstag 22. April 2010, 16:21
von xpilz
Funktioniert nicht da meine Version von Python, 3.1 ist.
Ich lade mir schnell die andere herunter

.