eval() ?!

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.
Gast

hi mawe,...

alles klar, hauptsache ich weiss was du gemeint hast :D


was glaubst du bzw ihr: wenn ich

Code: Alles auswählen

eval()
verwende und teste ob '[', '{'' usw enthalten ist und innerhalb des typs kein oder stehen darf, ist es dann sicher genug? oder gibt es einfach zuviele andere anweisungen die dann noch schaden anrichten könnten?

mfg

rolgal
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

rolgal hat geschrieben:oder gibt es einfach zuviele andere anweisungen die dann noch schaden anrichten könnten?
Jop. Ich kann zum Beispiel über die Module popen2,subprocess,cgi und einige andere denselben schaden anrichten. Außerdem kann ja auch anderes importiert wurden sein, also das ist viel zu unsicher. Benutz eval nur, wenn du sicher bist, dass keine Informationen von woanders außerhalb des Programmes als Argumente eingeschleust werden können.
Gast

hi milan,

hast wohl recht, es kann zwar eigentlich nichts passieren bzw. sehr unwahrscheinlich wenn nur ich das programm verwende, aber es interessiert mich natürllich eine bessere lösung zu finden.

mal sehen, was sich noch ergibt

mfg

rolgal
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hi rolgal,

doch, schau mal genau hin: Mein Pseudo Code entspricht dem Code im Snippet: "protocol" kann Werte zwischen 0 und 2 annehmen. 0 ist ASCII, 1 entspricht einem binären Protokoll und 2 dem neuen binären Protokoll mit dem sich auch Newstyle-Klassen picklen lassen. Im Allgemeinen kann man ab Python 2.3 alle Protkolle verwenden (von Ausnahmen abgesehen). Protokoll 2 ergibt die stärkste Kompression.

Zu der Geschichte mit data = "[1,2,3]": Nun, hier gibst Du einen String und picklest diesen. Was Du herausbekommst ist ein String. Versuche mal eine Liste oder eine Klasseninstanz zu picklen ...

Tut mir leid, daß ich nicht eher geantwortet habe. Ging nicht anders. Schaue mal in die Doku - pickle habe ich auch erst so richtig zu schätzen gewußt als ich die ersten Beispiele gesehen habe.

Gruß,
Christian
Gast

hi christian,
doch, schau mal genau hin: Mein Pseudo Code entspricht dem Code im Snippet: "protocol" kann Werte zwischen 0 und 2 annehmen. 0 ist ASCII, 1 entspricht einem binären Protokoll und 2 dem neuen binären Protokoll mit dem sich auch Newstyle-Klassen picklen lassen. Im Allgemeinen kann man ab Python 2.3 alle Protkolle verwenden (von Ausnahmen abgesehen). Protokoll 2 ergibt die stärkste Kompression.
ok, verstehe ich so in etwa, aber


Zu der Geschichte mit data = "[1,2,3]": Nun, hier gibst Du einen String und picklest diesen. Was Du herausbekommst ist ein String. Versuche mal eine Liste oder eine Klasseninstanz zu picklen ...
ich will aber einen string, bzw. muss einen string picklen und brauche eine liste. vielleicht sitze ich ja auf der leitung :?: :?:


Tut mir leid, daß ich nicht eher geantwortet habe. Ging nicht anders. Schaue mal in die Doku - pickle habe ich auch erst so richtig zu schätzen gewußt als ich die ersten Beispiele gesehen habe.
kein problem, besteht ja keine verpflichtung zu antworten. zu pickle: ich finds es gut

mfg

rolgal
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hi,

ok, jetzt hab ich's. Ich hatte es so aufgefasst, als ob Du eine Liste speicherst und diese als String wieder eingelesen wird. Na denn: Problem gelöst, weil keines da! :oops:

Christian
Gast

hi
ok, jetzt hab ich's. Ich hatte es so aufgefasst, als ob Du eine Liste speicherst und diese als String wieder eingelesen wird. Na denn: Problem gelöst, weil keines da!
und wie es da ist, ggg, nur ein anderes eben, macht aber nichts

noch ne frage an alle, es gibt doch die möglichkeit, eine liste aller verfügbaren module zu bekommen, oder? wie geht das gleich nochmal?

und wenn ja, und ich alle module ausschliesse, dann gibts wohl kein sicherheitsproblem mehr,

also würde zuerst getest werden ob [,{ usw enthalten ist, dann muss noch sicher gestellt werden, dass kein os,sys,cgi. popen, also einfach auf kein modul zugegriffen wird.

was denkt ihr?

mfg

rolgal
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

rolgal hat geschrieben:noch ne frage an alle, es gibt doch die möglichkeit, eine liste aller verfügbaren module zu bekommen, oder? wie geht das gleich nochmal?
Geht nicht. Du müsstest sys.path durch alle *.py's und *.pyc's und *.pyw's auch auch alle Verzeichnisse wo eine __init__.py drin ist durchsuchen. Aber sogar das wäre nicht so grandios sicher.Vielleicht kannst du irgendwo im "imp" Modul einhaken.
rolgal hat geschrieben:und wenn ja, und ich alle module ausschliesse, dann gibts wohl kein sicherheitsproblem mehr,

also würde zuerst getest werden ob [,{ usw enthalten ist, dann muss noch sicher gestellt werden, dass kein os,sys,cgi. popen, also einfach auf kein modul zugegriffen wird.

was denkt ihr?
Ich würde mich darauf nicht verlassen. Diese Lösung scheint mir irgendwie abenteuerlich zu sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

hi leonidas,

danke für deine einschätzung, scheint wohl schwieriger zu sein als ich dachte

mfg

rolgal
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

rolgal hat geschrieben:danke für deine einschätzung, scheint wohl schwieriger zu sein als ich dachte
Du bist ja nicht der erste, der sowas versucht, es gab ja schon Bastion und rexec, die beide gescheitert sind, obwohl sich durchaus fähige Leute drangesetzt haben.

Siehe auch Restricted Execution.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

hi leonidas,

noch bin ich stur, an das habe ich in etwa gedacht:

Code: Alles auswählen

>>> import sys
>>> my_modules=sys.modules
>>> l="[sys.exit(1)]"
>>> l
'[sys.exit(1)]'
>>> my_modules=my_modules.keys()
>>> for element in my_modules:
	if element in l:
		print element, "gefunden, daher nicht erlaubt"

		
sys gefunden, daher nicht erlaubt
>>> 
somit habe ich doch alle module ausgeschlossen, und ich muss doch auch nicht mehr andere .py etc durchforsten oder?

mfg

rolgal
Gast

tja, aber es werden nicht alle module gelistet, so findet sich zwar os, aber nicht popen2 in der liste,

net guat :?

mfg

rolgal
Gast

semmel, hat wohl irgendwas nicht funktioniert, popen2 ist schon drin.

ne, doch nicht, nur weil ich es mal importiert hatte und die anweisungen wie oben nochmal ausgeführt habe.



echt ne nuss:

vereinfacht was passiert ist:

Code: Alles auswählen

>>> import sys
>>> my_modules=sys.modules
>>> my_modules=my_modules.keys()
>>> 'os' in my_modules
True
>>> 'popen2' in my_modules
False
>>> import popen2

>>> my_modules=sys.modules
>>> my_modules=my_modules.keys()
>>> 'popen2' in my_modules
True
>>> 

mfg

rolgal
BlackJack

Python ist einfach zu "mächtig" und flexibel. Hast Du Dir schonmal überlegt, das auch jemand folgendes machen kann:

Code: Alles auswählen

eval('s'+'ys.exit()')
Und schon findest Du kein 'sys' mehr. Die Zeichenkette kann man beliebig komplex "verschlüsseln".

Wenn nur Grundlegende Typen in der Liste vorkommen dann hilft vielleicht Michael Spencer's "Safe" Eval Rezept im Cookbook weiter. Das parst beliebig verschachtelte Listen, Tupel und Dictionaries mit konstanten Werten darin. Also nix ausführbares.
Gast

hi blackjack,

ja, du hast natürlich völlig recht. bei deinem bsp. wäre der ganze aufwand den ich betreiben wollte umsonst.

ich komme auf solche böse :evil: ideen nicht liegt wohl daran, dass ich die unschuld in person bin :oops:

spass beiseite: das bsp das du mir empfohlen hast habe ich mir mal angesehen und bin mal zuerst gar nicht dahintergestiegen. :roll:

mal sehen, ob ich damit weiterkomme,

vielen dank auf jeden fall

mfg

rolgal
Antworten