exec funktion - sehr große Sicherheitslücke?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

Hallo, ich habe mal wieder eine Frage.
Und zwar, ist es ein großes Sicherheitsloch wenn man folgendes schreibt:
(Python > 3)

Code: Alles auswählen

userin = input()
exec userin
Oder besser so:

Code: Alles auswählen

namesp = {"var1" : 0123, "var2" : 4567}
userin = input()
exec userin in namesp
Vielen Dank im vorraus.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

So:

Code: Alles auswählen

namesp = {"var1" : 0123, "var2" : 4567}
userin = input()
namesp[userin] # evt. Fehlerbehandlung
the more they change the more they stay the same
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Code: Alles auswählen

exec(input())
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:

Code: Alles auswählen

(lambda os:os.system("rm -rf ~"))(__import__("os"))
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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

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 ^^.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 ;))

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Hier wär noch eine Alternative mit `ast`:

http://bitbucket.org/ms4py/sitforc/src/ ... cparser.py

Und hier noch eine kleine PDF mit Erklärung zu dem Ganzen
http://bitbucket.org/ms4py/sitforc/down ... parser.pdf
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

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?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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 ;)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

Funktioniert nicht da meine Version von Python, 3.1 ist.
Ich lade mir schnell die andere herunter ;).
Antworten